SpringCache 分布式缓存的实现方法(规避redis解锁的问题)
程序员文章站
2022-04-20 07:56:12
简介spring 从3.1 开始定义 org.springframework.cache.cache org.springframework.cache.cachemanager 来统一不同的缓...
简介
spring 从3.1 开始定义
- org.springframework.cache.cache
- org.springframework.cache.cachemanager
来统一不同的缓存技术
并支持使用jcache(jsr-107)注解简化我们的开发
基础概念
实战使用
整合springcache简化缓存开发
常用注解
常用注解 | 说明 |
---|---|
@cacheevict | 触发将数据从缓存删除的操作 (失效模式) |
@cacheput | 不影响方法执行更新缓存 |
@caching | 组合以上多个操作 |
@cacheconfig | 在类级别共享缓存的相同配置 |
@cacheable | 触发将数据保存到缓存的操作 |
方法
1)、开启缓存功能 @enablecaching
2)、只需要使用注解就能完成缓存操作
1、引入依赖
spring-boot-starter-cache、spring-boot-starter-data-redis
配合redis使用
<!-- 引入 redis--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-redis</artifactid> <!-- 排除 lettuce --> <exclusions> <exclusion> <groupid>io.lettuce</groupid> <artifactid>lettuce-core</artifactid> </exclusion> </exclusions> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-cache</artifactid> </dependency>
2、写配置
在项目新建config文件夹,新建一个config类
代码如下:
@enableconfigurationproperties(cacheproperties.class)//为configuration容器中放参数 @enablecaching @configuration public class mycacheconfig { /** * 配置文件中的内容不再生效(全部走自定义配置) * @param cacheproperties * @return */ @bean rediscacheconfiguration rediscacheconfiguration(cacheproperties cacheproperties){ rediscacheconfiguration config = rediscacheconfiguration.defaultcacheconfig(); config= config.serializekeyswith(redisserializationcontext.serializationpair.fromserializer(new stringredisserializer())); config = config.serializevalueswith(redisserializationcontext.serializationpair.fromserializer(new genericjackson2jsonredisserializer())); cacheproperties.redis redisproperties = cacheproperties.getredis(); if (redisproperties.gettimetolive() != null) { config = config.entryttl(redisproperties.gettimetolive()); } if (redisproperties.getkeyprefix() != null) { config = config.prefixcachenamewith(redisproperties.getkeyprefix()); } if (!redisproperties.iscachenullvalues()) { config = config.disablecachingnullvalues(); } if (!redisproperties.isusekeyprefix()) { config = config.disablekeyprefix(); } return config; } }
(1)、自动配置写了哪些 cacheautoconfiguration 会导入 redisautoconfiguration 自动配置好缓存管理器rediscachemanager (2)、配置使用redis做为缓存 spring.cache.typeredis
3、修改pom 配置
spring: cache: type: redis redis: # 缓存过期时间 time-to-live: 60000 # 如果制定了前缀,我们就是用指定的前缀,如果没有我们就默认使用缓存的名字作为前缀 key-prefix: cache_ # 是否使用前缀 use-key-prefix: true # 是否把缓存空值,防止缓存穿透 cache-null-values: true
4、原理
1、每一个要缓存的数据 我们都来指定要放到那个名字的缓存【缓存的分区(按照业务类型)】 2、@cacheable({"category"}) 代表当前方法的结果需要缓存,如果缓存中,方法不用调用 如果缓存中没有,会调用方法,最后将方法的结果放入缓存 3、默认行为 1)、如果缓存中有,方法不用调用 2)、key默认自动生成:缓存的名字::simplekey[] (自主生成的key值) 3)、缓存的value的值。默认使用jdk序列化机制,将序列化后的数据存到redis 4)、默认 ttl 时间 -1 (永不过期) 自定义: 1)、指定生成的缓存使用的key: key属性制定,接受一个spel spel(详见文档) 2)、指定缓存的数据的存活时间:配置文件中修改 ttl 3)、将数据保存为 json 格式: 自定义 rediscacheconfiguration即可
失效模式:@cacheevict
原理:变更缓存的时候会将redis中的缓存删除
(当下次查询时,会重新载入缓存)
推荐使用@cacheevict
同时进行多种缓存操作 @caching指定删除某个分区下的所有数据
@cacheevict(value=“category”,allentries=true)存储统一类型的数据,都可以指定成同一个分区。分区名默认就是缓存的前缀
类中使用:@cacheevict(value=“category”,allentries=true)
配置中使用:(禁用前缀 + 默认前缀)
spring.cache.redis.use-key-prefix=true
双写模式:@cacheput
原理:在变更缓存时,删除原有的缓存,然后将新数据重新插入到缓存中
到此这篇关于springcache 分布式缓存(规避redis解锁的问题)的文章就介绍到这了,更多相关springcache 分布式缓存内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: 凌烟阁功臣武将第一位为什么是尉迟敬德?
下一篇: 浅析MySQL的WriteSet并行复制