前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot中Spring-cache与Redis整合【面试+工作】

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

作者头像
Java帮帮
发布2018-09-29 17:37:54
2K0
发布2018-09-29 17:37:54
举报

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java帮帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • redis中整合spring-cache
    • 缓存的配置如下
    • spring cache与redis缓存结合
      • 缓存的注解介绍
        • @CacheConfig
        • @Cacheable
        • @CachePut
        • @CacheEvict
        • @Caching
        • 自定义注解
      • 遇到的两个问题
        • WRONGTYPE Operation against a key holding the wrong kind of value
      • Invalid argument(s)
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档