|
SpringBoot中Spring-cache与Redis整合【面试+工作】84
发表时间:2018-11-10 17:54 也是在整合redis的时候偶然间发现spring-cache的。这也是一个不错的框架,与spring的事务使用类似,只要添加一些注解方法,就可以动态的去操作缓存了,减少代码的操作。如果这些注解不满足项目的需求,我们也可以参考spring-cache的实现思想,使用AOP代理+缓存操作来管理缓存的使用。 在这个例子中我使用的是redis,当然,因为spring-cache的存在,我们可以整合多样的缓存技术,例如Ecache、Mamercache等。 下面来看springcache的具体操作吧! 附上官方的文档: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html redis中整合spring-cache
Linux下安装Redis1.tar zxvf redis-2.6.14.tar.gz 解压文件2.make指令进行编译 ![]() 3.创建Redis目录,并拷贝两个文件 ![]() 4.将/home/lzl/rdtar/redis-2.6.14目录下的redis-conf拷贝到/usr/local/redis中 ![]() 5.在/usr/local/redis目录下启动Redis服务 ![]() 6.设置Redis为后台启动程序,在redis.conf文件中进行设置。 ![]() 7.在./redis-cli中存储数据 ![]() Redis的Key-ValueKey的命名规则除了空格、\n换行外其他的大部分字符都可以使用。Key的常用操作 ![]() String类型操作
具体操作 ![]() mset key1 key2 … 设置多个key值mget key1 key2 … 获取多个key值incr 类似于i++的操作,需要保证value值是整型。创建之后默认为1decr 类似于i–。append 追加字符串substr 截取字符串 ![]() List类型的操作 Redis的List是一个双向链表。通过push和pop操作添加和删除元素,既可以当做队列也可以当做栈来使用。应用场景:可以在Redis的List里保留登录时间最近的10个数据,每次进来一个新登录者就删除一个数据,每次在链表中获取对应的信息,极大的减少资源的消耗。具体操作 ![]() lpush 顶部添加元素 栈lpop 删除顶部元素 栈rpush 添加底部元素 队列rpop 删除底部元素 队列lrange key1 start end 查看区间数据llen 查看List长度ltrim key1 start end 截取指定区间的数据 ![]() Set类型的操作redis的set是string类型的无序集合。set元素最大可以包含(2的32次方-1)个元素 关于set集合除了基本的添加删除操作,其他有用的操作还包含集合的 取并集,交集,差集。通过这些操作可以很通容易的实现sns中的好友推荐功能。 具体操作 ![]() ![]() ![]() SortSet排序集合类型和set集合一样是string类型元素的集合,不同的是每个元素都会关联一个权通过权值可以有序的获取集合中的元素。应用场景:热门帖子的查询sort set排序集合,都是有值和权来组成。通过权值的比较,来进行排序。具体操作 ![]() Hash数据类型 ![]() 持久化功能snap shotting快照持久化该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多就不适合频繁该持久化操作。 持久化设置在redis.conf文件中,可以有以下的保存设置 ![]() Redis的key单位之间内变化的越多,快照保存的时间越快。手动发起快照持久化指令 ./redis-cli bgsave ![]() 精细持久化(AOF持久化)本质:把用户执行的每个“写”指令(添加、删除、修改)都备份到文件中,还原数据的时候就是执行具体指令而已。 开启AOF持久化。 将appendonly no改为appendonly yes ![]() 快照设置的三种模式,推荐使用第二种。 ![]() 内容优化压缩处理命令: ./redis-cli bgrewriteaof配置Redis主从服务器可以把redis看做是一个处理速度很快的数据库,一个工程项目中可以设置多个redis服务器,来缓解多用户的请求压力。这里可以设置主Redis服务器进行增、删、改操作。可以配置多个Redis从服务器来进行查询操作。 主要设置还是在redis.conf文件中进行配置。 从服务器的配置如下:写上主服务器的ip以及端口号即可。 ![]() 2. redis知识技能同时,要了解redis自身的知识体系,基本的key、map、list等的操作命令。 ![]() ![]() ![]() 3. springboot的环境使用maven在pom文件中导入springboot的依赖(这里提供一个demo,欢迎star)链接:https://pan.baidu.com/s/102RYeBdw9LPFbPogEpCSSQ 密码:ioo5redis的环境依赖注意spring-boot-starter-data-redis与springboot版本的问题。我项目中使用的springboot版本是1.3.8, ![]() 但是spring-boot-starter-data-redis只有1.4版本以上的。所以要指定spring-boot-starter-data-redis的version版本。 ![]() redis配置文件在application.properties文件中写下连接redis所需要的信息。 ![]() RedisCacheConfig配置主要分3个步骤
![]() 从源码看,RedisTemplate默认使用的是JdkSerializationRedisSerializer。我的项目中选择Jackson2JsonRedisSerializer的序列化器 此时,需要引入Jackson的依赖 ![]() ![]() ![]() 以上完成后,环境配置基本完成,接下来需要验证springboot与redis是否整合成功。1.启动redis服务 ![]() 控制台出现这个画面,说明启动成功! 2. 写一个testCase实例验证 ![]() 结果如下所示,并且redis缓存中存储的是json的格式。 如果我们存入一个对象,那个这个对象也将是json的格式。 ![]() 需要注意的地方 第一次配置redis的时候,application.properties文件设置 ![]() 说明使用的redis数据库为2,那么需要将redis切换到数据库2的目录中才能看到redis的值 在redis客户端使用如下命令 ![]() ![]() 然后再进行redis的操作。SDR(spring-data-redis)的官方讲解如下 https://docs.spring.io/spring-data/redis/docs/1.8.1.RELEASE/reference/html/#redis:template 缓存的配置如下
![]()
![]()
![]() 在RedisCacheConfig中添加以上的代码,就可以使用springcache的注解了。下面介绍springcache的注解如何使用 spring cache与redis缓存结合对springCache概念的了解 ![]() 缓存的主要使用方式包括以下两方面 1. 缓存的声明,需要根据项目需求来妥善的应用缓存 2. 缓存的配置方式,选择需要的缓存支持,例如Ecache、redis、memercache等 缓存的注解介绍![]() @CacheConfig该注解是可以将缓存分类,它是类级别的注解方式。我们可以这么使用它。 这样的话,UseCacheRedisService的所有缓存注解例如@Cacheable的value值就都为user。 ![]() 在redis的缓存中显示如下 ![]() 我们注意到,生成的user~keys,它是一个zset类型的key,如果使用get会报WRONGTYPE Operation against a key holding the wrong kind of value。这个问题坑了我很久 @Cacheable一般用于查询操作,根据key查询缓存.
![]() ![]() 调用方式。 ![]() 打印结果,大家也可以试一试 只输出一次sql查询的语句,说明第二次查询是从redis中查到的。 ![]() redis中的结果 我们可以看到redis中已经存在 com.lzl.redisService.UseCacheRedisService.selectAllUser.记录了。 这么长的一串字符key是根据自定义key值生成的。 ![]() @CachePut一般用于更新和插入操作,每次都会请求db 通过key去redis中进行操作。 1. 如果key存在,更新内容 2. 如果key不存在,插入内容。 ![]() redis中的结果 多了一条记录user_2 ![]() @CacheEvict根据key删除缓存中的数据。allEntries=true表示删除缓存中的所有数据。 ![]() 测试方法 ![]() redis中的结果 user_1已经移除掉。 ![]() 测试allEntries=true时的情形。 ![]() redis中的结果 redis中的数据已经全部清空 ![]() @Caching通过注解的属性值可以看出来,这个注解将其他注解方式融合在一起了,我们可以根据需求来自定义注解,并将前面三个注解应用在一起 ![]() 使用例子如下 ![]() ![]() redis中的执行结果 一次添加三个key ![]() 结合@Caching还可以设置自定义的注解 自定义注解![]() 使用如下 ![]() 测试 ![]() redis结果 ![]() 通过以上的例子基本可以了解springcache的使用了,当然还有更加复杂的操作,这里只是简单的介绍一下,运用到实际的项目中还是有所欠缺的。不过有这个基础应该不会太难。同时有时间可以再研究一下spring-cache的实现原理。是基于AOP的实现的,这也是我们在项目中学习的地方。 遇到的两个问题WRONGTYPE Operation against a key holding the wrong kind of value这个就是上面所说的类型不一致,使用redis命令不当造成的。所以在查找redis的value时候,需要知道key的类型。 ![]() Invalid argument(s)还是redis现实的错误,这个有些困惑,在get的时候,一定要加上”“(引号)才行。 ![]() |