SpringCache 分布式缓存的实现方法(规避redis解锁的问题)

简介

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 分布式缓存内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-11-20

浅谈SpringCache与redis集成实现缓存解决方案

缓存可以说是加速服务响应速度的一种非常有效并且简单的方式.在缓存领域,有很多知名的框架,如EhCache .Guava.HazelCast等.Redis作为key-value型数据库,由于他的这一特性,Redis也成为一种流行的数据缓存工具. 在传统方式下对于缓存的处理代码是非常臃肿的. 例如:我们要把一个查询函数加入缓存功能,大致需要三步. 一.在函数执行前,我们需要先检查缓存中是否存在数据,如果存在则返回缓存数据 二.如果不存在,就需要在数据库的数据查询出来. 三.最后把数据存放在缓存中,当

浅谈微信页面入口文件被缓存解决方案

缓存对于前端页面来说,是加速页面加载的利器之一,但也同时带来了很多问题,比如新版本发布之后,怎么替换客户端上的缓存文件呢?大家一般的的解决方案主要有以下几种形式, 一般情况 1.添加版本号,在静态资源文件的引用链接后面添加版本号,这样每次发布的时候更新版本号,就能让叫客户端加载新的资源文件,避免再次使用缓存的老文件,如 <script src="//m.test.com/build/activity/js/commons.js?v=20170608"></script

浅谈JSON的数据交换、缓存问题和同步问题

JSON轻量级的数据交换格式 相对于XML来说,JSON的解析速度更快,文档更小. JSON的格式 {属性名:属性值,属性名:属性值,--} 属性名的类型可以是string,number,boolean,null,object,且属性名必须用双引号引起来,如果属性值是字符串,也必须用双引号括起来. JSON表示数组 格式:[value,value,value],其中value可以是基本的数据类型,也可以是object类型.数组类型 数组类型 [ {"name":"yangjq

浅谈android获取设备唯一标识完美解决方案

本文介绍了浅谈android获取设备唯一标识完美解决方案,分享给大家,具体如下: /** * deviceID的组成为:渠道标志+识别符来源标志+hash后的终端识别符 * * 渠道标志为: * 1,andriod(a) * * 识别符来源标志: * 1, wifi mac地址(wifi): * 2, IMEI(imei): * 3, 序列号(sn): * 4, id:随机码.若前面的都取不到时,则随机生成一个随机码,需要缓存. * * @param context * @return */ p

浅谈angularJS的$watch失效问题的解决方案

本文介绍了浅谈angularJS的$watch失效问题的解决方案,分享给大家,顺便给自己留个笔记 $watch方法,它可以帮助我们在每个scope中监视其中的变量. $watch 单一的变量 对于普通的变量时,如数字,字符串等,直接如下写是可以监视到变量的变化,并执行相应的函数的. $scope.count=1; $scope.$watch('count',function(){ ... }); $watch 多个变量 对于多个变量的监视变化,执行同一函数的话,可以将这几个变量转为字符串,以'+

浅谈java实现redis的发布订阅(简单易懂)

redis的应用场景实在太多了,现在介绍一下它的几大特性之一   发布订阅(pub/sub). 特性介绍: 什么是redis的发布订阅(pub/sub)?   Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能.基于事件的系统中,Pub/Sub是目前广泛使用的通信模型,它采用事件作为基本的通信机制,提供大规模系统所要求的松散耦合的交互模式:订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件:发布者(如服务器)可将订阅者感兴趣的事件随时通知

浅谈Android 中图片的三级缓存策略

什么是三级缓存? 内存缓存,优先加载,速度最快 本地缓存,次优先加载,速度快 网络缓存,最后加载,速度慢,浪费流量 为什么要进行三级缓存 三级缓存策略,最实在的意义就是 减少不必要的流量消耗,增加加载速度 . 如今的 APP 网络交互似乎已经必不可少,通过网络获取图片再正常不过了.但是,每次启动应用都要从网络获取图片,或者是想重复浏览一些图片的时候,每次浏览都需要网络获取,消耗的流量就多了,在如今的流量资费来说,肯定会容易影响用户数量. 还有就是网络加载图片,有时候会加载很慢,影响了用户体验.

浅谈iOS UIWebView对H5的缓存功能

这两天在搞与H5交互的事,之前做的都是加载的静态的web页面,交互调试起来很快,这次搞的是js写的前端页面,跳转什么的都是动态的,然后就不响应了,搞了半天原来是缓存的问题,这里简单介绍一下,一般请求会使用下面的方法: + (instancetype)requestWithURL:(NSURL *)URL; 该方法的描述如下: Creates and returns a URL request for a specified URL with default cache policy and ti

浅谈VUE防抖与节流的最佳解决方案(函数式组件)

前言 有echarts使用经验的同学可能遇到过这样的场景,在window.onresize事件回调里触发echartsBox.resize()方法来达到重绘的目的,resize事件是连续触发的这意味着echarts实例会连续的重绘这是非常耗性能的.还有一个常见的场景在input标签的input事件里请求后端接口,input事件也是连续触发的,假设我输入了"12"就会请求两次接口参数分别是"1"和"12",比浪费网络资源更要命的是如果参数为&quo

浅谈Tomcat乱码与端口占用的解决方案

Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选.但是有些小伙伴在启动Tomcat时也会遇到各种各样的问题,比如Tomcat的startup.bat启动后出现乱码,端口占用,启动后闪退等问题,这里我们来一一进行解决 问题一:Tomcat的startup.bat启动后出现乱码 找到Tomcat文件下的conf目录,修改logging.properties文件中java.ut