Spring+Redis配置

更新时间:2023-06-19 07:24:38 阅读: 评论:0

Spring+Redis配置
二手房网签流程
既上次把同事屁屁龙的tomcat数据源⽂档摘抄过来之后,这次获得其同意后,再次怀着感激涕零的⼼情,抄个爽。
全⽂⾮本⼈所写,所以若转载时,请标明⽂章来源于本⼈原创(不要脸真爽哈哈哈哈),谢谢!
1、jar⽂件安装
描写下雪的场景l 加⼊:
<!-- redis 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 d -->
2、Spring项⽬集成进缓存⽀持
要启⽤缓存⽀持,我们需要创建⼀个新的  bean。有很多实现,本⽂演⽰的是和 Redis 的集成,⾃然就是⽤ RedisCacheManager 了。Redis 不是应⽤的共享内存,它只是⼀个内存服务器,就像 MySql 似的,我们需要将应⽤连接到它并使⽤某种“语⾔”进⾏交互,因此我们还需要⼀个连接⼯⼚以及⼀个 Spring 和 Redis 对话要⽤的 RedisTemplate,这些都是 Redis 缓存所必需的配置,把它们都放在⾃定义的
CachingConfigurerSupport 中:
RedisCacheConfig.java
当然也别忘了把这些 bean 注⼊ Spring,不然配置⽆效。在 l 中加⼊以下:<context:component-scan ba-package="com.defonds.dis"/>
为了使⽤ spring cache 缓存⽅案,在⼯程的 classpath 必须具备下列 jar 包
3、缓存⽅法的执⾏结果
设置好缓存配置之后我们就可以使⽤ @Cacheable 注解来缓存⽅法执⾏的结果了,⽐如查询所有城市的lectListCity⽅法:
@Cacheable("lectListCity")
public List<City> lectListCity() {
return redisCityDao.lectListCity();
}
注意,此类的lectListCity⽅法上有⼀个注释lectListCity,即@Cacheable("lectListCity"),这个
注释的意思是,当调⽤这个⽅法的时候,会从⼀个名叫lectListCity~keys的缓存中查询,如果没有,则执⾏实际的⽅法(即查询数据库),并将执⾏的结果存⼊缓存中,否则返回缓存中的对象。这⾥的缓存中的 key 就是参数lectListCity + ~keys,即lectListCity~keys。 value 就是List<City>对象。在redis中是zSet类型。操作命令Cmd :zrange lectListCity~keys 0 -1 withscores
lectListCity~keys 为key值
4、缓存数据⼀致性的保证
CRUD (Create 创建,Retrieve 读取,Update 更新,Delete 删除) 操作中,除了 R 具备幂等性(多次执⾏和⼀次执⾏结果⼀样),其他三个发⽣的时候都可能会造成缓存结果和数据库不⼀致。为了保证缓存数据的⼀致性,在进⾏创建、更新、删除的时候我们需要对可能影响到的缓存进⾏更新或者清除。永山瑛太
@CacheEvict(value = { "lectListCity"}, allEntries = true)
public int createCity(City city) {
ateCity(city);
}
使⽤ @CacheEvict 清除缓存。将lectListCity ⽅法的所有缓存都清理掉。职业化
@CachePut(value = { "lectListCity" }, key="#city.cid")
教资真题
public int updateCity(City city) {
return redisCityDao.updateCity(city);
}
使⽤ @CachePut 更新缓存策略。只更新key值为city.cid的缓存
其孰能讥之乎5、⾃定义缓存数据KEY⽣成策略
对于使⽤ @Cacheable 注解的⽅法,每个缓存的 key ⽣成策略默认使⽤的是参数名+参数值,⽐如以下⽅法:
@Cacheable("lectCity")
public City lectCity(String id) {
return redisCityDao.lectCity(id);
}
这个⽅法的缓存将保存于 key 为 lectCity~keys 的缓存下,对于 id取值为 "2230" 的缓存,key 为 "id-2230"。⼀般情况下没啥问题,⼆般情况如⽅法 key 取值相等然后参数名也⼀样的时候就出问题了,如:
@Cacheable("lectCity")
public City lectCityCopy(String id) {
return redisCityDao.lectCityCopy(id);
}
这个⽅法的缓存也将保存于 key 为 lectCity~keys 的缓存下。对于 id取值为 "2230" 的缓存,key 也为 "id-2230",将另外⼀个⽅法的缓存覆盖掉。
解决办法是使⽤⾃定义缓存策略,对于同⼀业务(同⼀业务逻辑处理的⽅法,哪怕是集群/分布式系统),⽣成的 key 始终⼀致,对于不同业务则不⼀致:
⾃定义缓存⽣成策略.
* ⽣成缓存key值为XXX~keys 下的key值为类名-⽅法名-参数名-参数值,
入党自传要求* ey:emptyService-findUrById-id-110 和  emptyService-findUrInfoById-id-110,
* 上⾯两个例⼦的缓存都存在了key 为XXX~keys的缓存下,
* 但是因为第⼀个key值为  emptyService-findUrById-id-110
* 第⼆个key值为  emptyService-findUrInfoById-id-110 ,卤水鸭头
* 对于集群系统、分布式系统之间共享缓存很重要,所以真正实现了分布式缓存。
* 建议:缓存⽅法的@Cacheable最好使⽤⽅法名,避免不同的⽅法的@Cacheable值⼀致,然后再配以以上缓存策略。
*
6.缓存的验证
为了验证缓存是否⽣效,当第⼀次执⾏完查询之后,启动对mysql表⼿动锁表,后台请求还是可以获取数据,⽽redis库中存在上次查询的数据。⼿动清除redis库中的所有缓存数据,数据请求失败,所以
使⽤注解配置redis缓存成功。
6.2缓存的⼀致性
使⽤ @CacheEvict 清除缓存。将lectListCity ⽅法的所有缓存都清理掉。
使⽤ @CachePut 更新缓存策略。只更新key值为city.cid的缓存
7、注意事项
1. 要缓存的 Java 对象必须实现 Serializable 接⼝,因为 Spring 会将对象先序列化再存⼊ Redis,⽐如demo中的 dis.bean.City 类,如果不实现 Serializable 的话将会遇到类似这种错误:nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [dis.bean.City]。
2. 缓存的⽣命周期我们可以配置,然后托管 Spring CacheManager,不要试图通过 redis-cli 命令⾏去管理缓存。⽐如 lectCity⽅法的缓存,所有省份的查询结果会被以 key-value 的形式存放在 Redis,key 就是我们刚才⾃定义⽣成的 key,value 是序列化后的对象,这个 key 会被放在 key 名为 lectCity~keys key-value 存储中,"lectCity⽅法在 Redis 中的缓存情况"。可以通过 redis-cli 使⽤ del 命令将lectCity~keys 删除,但每个省份的缓存却不会被清除。
3. CacheManager 必须设置缓存过期时间,否则缓存对象将永不过期,这样做的原因如上,避免⼀些野数据“永久保存”。此外,设置缓存过期时间也有助于资源利⽤最⼤化,因为缓存⾥保留的永远是热点数据。
4. 缓存适⽤于读多写少的场合,查询时缓存命中率很低、写操作很频繁等场景不适宜⽤缓存。

本文发布于:2023-06-19 07:24:38,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1045255.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:缓存   查询   策略   数据   缓存数据   参数   定义   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图