SpringBoot中Spring-cache与Redis整合【面试+工作】

SpringBoot中Spring-cache与Redis整合【面试+工作】

也是在整合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数据库, 什么是Redis Redis是一个内存高速缓存数据库,用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下安装Redis 1.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-Value Key的命名规则 除了空格、\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值是整型。创建之后默认为1 decr 类似于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 密码:ioo5 redis的环境依赖 注意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帮帮(javahelp)

原文发表时间:2018-09-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

29 条运维工程师必会实用 Linux 命令

虽然Linux发行版支持各种各样的饿GUI(graphical user interfaces),但在某些情况下,Linux的命令行接口(bash)仍然是简单...

3219
来自专栏Kevin-ZhangCG

[ Java面试题 ]JavaWeb篇

3638
来自专栏程序员互动联盟

【答疑释惑】菜鸟怎么调试简单程序?

首先公布昨天留的课后作业答案的宏定义函数的答案 #define f(a, b, x) a*x+b printf("%d, %dn", f(3,2,1), ...

3455
来自专栏Bug生活2048

Java学习笔记(十)——Thrift入门及一些基础知识介绍

什么是RPC框架呢?RPC全称为Remote Procedure Call,意为远程过程调用。

1072
来自专栏Eugene's Blog

php文件包含漏洞分类目录文章标签友情链接联系我们

1542
来自专栏Kevin-ZhangCG

[ Java面试题 ] 框架篇

  1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionSe...

1682
来自专栏C/C++基础

g++入门教程

g++是GNU开发的C++编译器,是GCC(GNU Compiler Collection)GNU编译器套件的组成部分。另外,gcc是GNU的C编译器。

1.7K1
来自专栏我叫刘半仙

手写一个简化版Tomcat

      Tomcat作为Web服务器深受市场欢迎,有必要对其进行深入的研究。在工作中,我们经常会把写好的代码打包放在Tomcat里并启动,然后在浏览器里就能...

4025
来自专栏JavaEdge

大道缓存1 缓存特征2 缓存介质3 缓存分类和应用场景缓存实战

用户请求从界面(浏览器/App)到网络转发、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容。

1231
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(五):简易留言簿交互实现

努力与运动兼备~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

5578

扫码关注云+社区

领取腾讯云代金券