全站资源开放下载,感谢广大网友的支持
链接失效请移步职涯宝平台的学习路线|资源下载分类
支持用户留言评论_客服实时在线_问题解决更快
非盈利平台

非盈利平台

只为分享一些优质内容

Java帮帮-微信公众号

Java帮帮-微信公众号

将分享做到极致

微信小程序

微信小程序

更方便的阅读

百度小程序

百度小程序

搜索便捷阅读

支付宝小程序

支付宝小程序

支付也能阅读

程序员生活志-公众号

程序员生活志-公众号

程序员生活学习圈,互联网八卦黑料

支付宝赞助-Java帮帮社区
微信赞助-Java帮帮社区

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

1. redis环境准备在使用redis之前需要先安装redis数据库,什么是RedisRedis是一个内存高速缓存数据库,用C语言编写,数据模型是Key-Value 支持丰富的数据结构类型,比如String,list,hash,set,sorted Set。可持久化,保证数据安全!缓存分为 数据缓存和页面缓存。 类似于新闻列表等的网站适合做页面缓存,而商品展示页面适合做数据缓存。Redis属于数据缓存的范畴。Redis和memcache比较

  1. Redis支持k/v数据类型,还提供list,set,zset,hash等数据结构的存储。

  2. Redis支持master-slave(主-从)模式应用

  3. Redis支持数据的持久化,将内存中的数据保持在磁盘中,重启的时候再次加载进行使用。

  4. Redis单个value的最大限制是1GB,memcache只能保存1MB数据。

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类型操作

  1. String是redis最基本的类型

  2. 该类型可以包含任何数据,包括jpg图片或者序列化的对象

  3. 单个value最大上限是1G字节

  4. 如果只用string类型,redis是可以被看做加上持久性的memcache。

具体操作

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个步骤

  • 使用JedisConnectionFactory建立连接工厂

  • 创建RedisTemplate模板

  • 配置序列化器 RedisTemplate提供了以下几种序列化器,我们可以根据项目的需求进行选择。

从源码看,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上添加注解

  • 创建RedisCacheManager

  • 自定义缓存的key

在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查询缓存.

  1. 如果key不存在,查询db,并将结果更新到缓存中。

  2. 如果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的时候,一定要加上”“(引号)才行。


Java帮帮学习群生态

Java帮帮学习群生态

总有一款能帮到你

Java学习群

Java学习群

与大牛一起交流

大数据学习群

大数据学习群

在数据中成长

九点编程学习群

九点编程学习群

深夜九点学编程

python学习群

python学习群

人工智能,爬虫

测试学习群

测试学习群

感受测试的魅力

Java帮帮生态承诺

Java帮帮生态承诺

一直坚守,不负重望

初心
勤俭
诚信
正义
分享
友链交换:加帮主QQ2524138991 留言即可 24小时内答复  
满吉教育资讯
会员登录
获取验证码
登录
登录
我的资料
留言
回到顶部