既上次把同事屁屁龙的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. cocos2dx-3.1加入cocosStudio参考库 libCocosStudio

    一个,创建好项目 两,在"解(项目名称)".选择现有项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2dzbHVja3k=/fon ...

  2. 从源码角度看MySQL memcached plugin——1. 系统结构和引擎初始化

    本章尝试回答两个问题: 一.memcached plugin与MySQL的关系: 二.MySQL系统如何启动memcached plugin. 1. memcached plugin与MySQL的关系 ...

  3. 目标检测的图像特征提取(一)HOG特点

    1.HOG特点: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检測的特征描写叙述子.它通过计算和统计图像局部区 ...

  4. 使用 install.packages() 安装所需的包

    1. 从 CRAN 上安装 install.packages("tm", dependencies = TRUE) tm 程序包用于文本挖掘(text mining) 2. 本地安 ...

  5. libuv windows 下编译及使用出现的问题(异步IO)

    1. 下载源码:http://dist.libuv.org/dist/ 我下载的是 v1.8.0 版本,打开可看见四个文件,如下: 说明:.tar.gz 版本的是可以在Linux和Windows下编译 ...

  6. 在微信浏览器里使用js或jquery实现页面重新刷新

    function refresh() { var random = Math.floor((Math.random() * 10000) + 1); var url = decodeURI(windo ...

  7. 最简单的IdentityServer实现——Client

    客户端控制台演示请求访问令牌,然后使用此令牌访问API 1.新建项目并添加引用 新建一个.net core的控制台程序IdentityServer.EasyDemo.Client   1 引用Iden ...

  8. WPF DataGrid 的RowDetailsTemplate的使用

    <Window x:Class="DataGridExam.DataGridRowDetailsExam"        xmlns="http://schemas ...

  9. sql执行分页查询

    declare  @PageSize int,@PageIndex int;set @PageSize=5;set @PageIndex=2;WITH Pagination AS(  SELECT * ...

  10. Android Java调用Qt写的so库

    有时候,我们反编译apk得到一个so库,如果直接使用这个so库的话,必须使用原来so库同样的package名字,才能用.这样人家反编译你的apk,就知道你侵犯了人家的版权.为了达到混淆的目的,我们可以 ...