既上次把同事屁屁龙的tomcat数据源文档摘抄过来之后,这次获得其同意后,再次怀着感激涕零的心情,抄个爽。

全文非本人所写,所以若转载时,请标明文章来源于本人原创(不要脸真爽哈哈哈哈),谢谢!

1、jar文件安装

pom.xml 加入:

<!-- redis cache related.....start -->

<dependency>

<groupId>org.springframework.data</groupId>

<artifactId>spring-data-redis</artifactId>

<version>1.6.0.RELEASE</version>

</dependency>

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.7.3</version>

</dependency>

<!-- redis cache related.....end -->

2、Spring项目集成进缓存支持

要启用缓存支持,我们需要创建一个新的 CacheManager bean。CacheManager
接口
有很多实现,本文演示的是和 Redis 的集成,自然就是用 RedisCacheManager 了。Redis 不是应用的共享内存,它只是一个内存服务器,就像 MySql 似的,我们需要将应用连接到它并使用某种“语言”进行交互,因此我们还需要一个连接工厂以及一个 Spring 和
Redis 对话要用的 RedisTemplate,这些都是 Redis 缓存所必需的配置,把它们都放在自定义的 CachingConfigurerSupport 中:

RedisCacheConfig.java

当然也别忘了把这些 bean 注入 Spring,不然配置无效。在 applicationContext.xml 中加入以下:<context:component-scan base-package="com.defonds.bdp.cache.redis" />

为了使用
spring cache 缓存方案,在工程的 classpath 必须具备下列 jar 包

3、缓存方法的执行结果

设置好缓存配置之后我们就可以使用 @Cacheable 注解来缓存方法执行的结果了,比如查询所有城市的
selectListCity方法:

@Cacheable("selectListCity")

public List<City> selectListCity() {

return  redisCityDao.selectListCity();

}

注意,此类的
selectListCity方法上有一个注释
selectListCity,即
@Cacheable("selectListCity"),这个注释的意思是,当调用这个方法的时候,会从一个名叫
selectListCity~keys的缓存中查询,如果没有,则执行实际的方法(即查询数据库),并将执行的结果存入缓存中,否则返回缓存中的对象。这里的缓存中的 key 就是参数
selectListCity + ~keys,即selectListCity~keys。 value
就是 List<City>对象。在redis中是zSet类型。操作命令Cmd
:zrange selectListCity~keys 0 -1 withscores

selectListCity~keys 为key值

4、缓存数据一致性的保证

CRUD (Create 创建,Retrieve 读取,Update 更新,Delete 删除) 操作中,除了 R 具备幂等性(多次执行和一次执行结果一样),其他三个发生的时候都可能会造成缓存结果和数据库不一致。为了保证缓存数据的一致性,在进行
创建、更新、删除的时候我们需要对可能影响到的缓存进行更新或者清除。

@CacheEvict(value = {
"selectListCity"}, allEntries =
true)

public int createCity(City city) {

return redisCityDao.createCity(city);

}

使用 @CacheEvict 清除缓存。将selectListCity 方法的所有缓存都清理掉。

@CachePut(value = {
"selectListCity" }, key="#city.cid")

public int updateCity(City city) {

return redisCityDao.updateCity(city);

}

使用 @CachePut 更新缓存策略。只更新key值为city.cid的缓存

5、自定义缓存数据KEY生成策略

对于使用 @Cacheable 注解的方法,每个缓存的 key 生成策略默认使用的是参数名+参数值,比如以下方法:

@Cacheable("selectCity")

public City selectCity(String id) {

return redisCityDao.selectCity(id);

}

这个方法的缓存将保存于 key 为
selectCity~keys 的缓存下,对于
"
的缓存,key 为 ""。一般情况下没啥问题,二般情况如方法
key 取值相等然后参数名也一样的时候就出问题了,如:

@Cacheable("selectCity")

public City selectCityCopy(String id) {

return redisCityDao.selectCityCopy(id);

}

这个方法的缓存也将保存于 key 为
selectCity~keys 的缓存下。对于
"
的缓存,key 也为 "",将另外一个方法的缓存覆盖掉。
解决办法是使用自定义缓存策略,对于同一业务(同一业务逻辑处理的方法,哪怕是集群/分布式系统),生成的 key 始终一致,对于不同业务则不一致:

自定义缓存生成策略.

* 生成缓存key值为  XXX~keys 下 的key值为 类名-方法名-参数名-参数值
,

* ey:emptyService-findUserById-id-110
和   emptyService-findUserInfoById-id-110,

* 上面两个例子的 缓存都存在了key 为 XXX~keys的缓存下,

* 第二个key值为   emptyService-findUserInfoById-id-110
,

* 对于集群系统、分布式系统之间共享缓存很重要,所以真正实现了分布式缓存。

* 建议:缓存方法的 @Cacheable 最好使用方法名,避免不同的方法的
@Cacheable 值一致,然后再配以以上缓存策略。

*
 6.缓存的验证
为了验证缓存是否生效,当第一次执行完查询之后,启动对mysql表手动锁表,后台请求还是可以获取数据,而redis库中存在上次查询的数据。手动清除redis库中的所有缓存数据,数据请求失败,所以使用注解配置redis缓存成功。

6.2缓存的一致性

使用 @CacheEvict 清除缓存。将selectListCity 方法的所有缓存都清理掉。

使用 @CachePut 更新缓存策略。只更新key值为city.cid的缓存

7、注意事项

1. 要缓存的 Java 对象必须实现 Serializable 接口,因为 Spring 会将对象先序列化再存入 Redis,比如demo中的
com.redis.bean.City 类,如果不实现 Serializable 的话将会遇到类似这种错误:nested exception
is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.redis.bean.City]。

2. 缓存的生命周期我们可以配置,然后托管 Spring CacheManager,不要试图通过 redis-cli 命令行去管理缓存。比如
selectCity方法的缓存,所有省份的查询结果会被以
key-value 的形式存放在 Redis,key 就是我们刚才自定义生成的 key,value 是序列化后的对象,这个 key 会被放在 key 名为
selectCity~keys key-value 存储中,"selectCity方法在
Redis 中的缓存情况"。可以通过 redis-cli 使用 del 命令将 selectCity~keys 删除,但每个省份的缓存却不会被清除。

3. CacheManager 必须设置缓存过期时间,否则缓存对象将永不过期,这样做的原因如上,避免一些野数据“永久保存”。此外,设置缓存过期时间也有助于资源利用最大化,因为缓存里保留的永远是热点数据。

4. 缓存适用于读多写少的场合,查询时缓存命中率很低、写操作很频繁等场景不适宜用缓存。

Spring+Redis配置的更多相关文章

  1. spring redis 配置

  2. Spring boot配置多个Redis数据源操作实例

    原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...

  3. Spring Boot 2 实践记录之 Redis 及 Session Redis 配置

    先说 Redis 的配置,在一些网上资料中,Spring Boot 的 Redis 除了添加依赖外,还要使用 XML 或 Java 配置文件做些配置,不过经过实践并不需要. 先在 pom 文件中添加 ...

  4. spring boot 配置redis

    先配置属性: # database name spring.redis.database=0 # server host spring.redis.host=127.0.0.1 # server pa ...

  5. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

  6. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_15-认证接口开发-Redis配置

    4.2 Redis配置 4.2.1 安装Redis 1.安装Redis服务 下载Windows版本的redis:https://github.com/MicrosoftArchive/redis/ta ...

  7. spring+redis 集群下的操作

    文章就是记录一下工作当中的用到的点,与测试方法以备用,会不断更新. 配置文件spring-redis.xml: <?xml version="1.0" encoding=&q ...

  8. spring+redis

    配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www ...

  9. redis之(二十一)redis之深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

随机推荐

  1. 4 DDD里面的界限上下文

    1 界限上下文概念的出现 当开发一个电子商务系统的时候,会给系统划分很多子域,销售子域是核心子域,此外还有物流子域,商品子域等支撑子域.在这些子域里面,一个商品product在销售子域和商品子域里面外 ...

  2. OpenGL(十一) BMP真彩文件的显示和复制操作

    glut窗口除了可以绘制矢量图之外,还可以显示BMP文件,用函数glDrawPixels把内存块中的图像数据绘制到窗口上,glDrawPixels函数原型: glDrawPixels (GLsizei ...

  3. Java数据存储机制的实现

    原文地址:http://yanwushu.sinaapp.com/java_data_storage/ Java程序在执行时须要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存 ...

  4. opencart框架分析与概况

    1. Opencart的系统架构 1.1. 架构分析 Opencart是有自己的开发架构的,其架构的核心都在system\engine 下,访问控制统一用 根目录下的 index.php 来协调. R ...

  5. 展讯通信:文章"紫光收购后展讯困难重重”失实(展讯的成就确实很高)

    6月22日上午消息,展讯通信官方微信对自媒体文章<五大危机缠身,紫光收购后展讯困难重重>作出声明,称,其中内容严重失实,对公司造成了不良影响,并表示,将坚决采取法律手段维护自身的合法权益. ...

  6. 微信小程序把玩(三十九)navigation API

    原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...

  7. Android零基础入门第24节:自定义View简单使用

    原文:Android零基础入门第24节:自定义View简单使用 当我们开发中遇到Android原生的组件无法满足需求时,这时候就应该自定义View来满足这些特殊的组件需求. 一.概述 很多初入Andr ...

  8. How to setup Assigned Access in Windows 10 (Kiosk Mode) 设置分配的访问权限(Kiosk模式)

    Let’s say you’re building some sort of ingenious mechanical contraption to be displayed in public th ...

  9. Delphi 编写ActiveForm窗体工程知识和样例(开发浏览器客户端应用程序)(有详细步骤)

    一.基础知识介绍: 1.ActiveForm的基础知识介绍: 在Delphi中,ActiveForm是封装了Delphi Form的一种ActiveX控件.ActiveForm其实是一种标准的Delp ...

  10. JS 浮点加减乘除运算

    //浮点数加法运算 function FloatAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1]. ...