当前位置: 首页 > news >正文

中国建设银行的网站eclipse开发安卓app

中国建设银行的网站,eclipse开发安卓app,丰台电子网站建设,建筑网农村别墅一、自定义全局缓存key和双冒号替换 使用 Redis的客户端 Spring Cache时,会发现生成 key中会多出一个冒号,而且有一个空节点的存在。 查看源码可知,这是因为 Spring Cache默认生成key的策略就是通过两个冒号来拼接。 同时 Spring Cache缓存…

一、自定义全局缓存key和双冒号替换

使用 Redis的客户端 Spring Cache时,会发现生成 key中会多出一个冒号,而且有一个空节点的存在。

查看源码可知,这是因为 Spring Cache默认生成key的策略就是通过两个冒号来拼接。

在这里插入图片描述

同时 Spring Cache缓存到 Redis的 key为:Cache注解的value|cacheNames的值与其 key的值的拼接。

在这里插入图片描述

我们可以自定义 CacheKeyPrefix来替换双冒号,也可以自定义全局缓存 key的前缀。

    /*** 项目名*/private final static String SPRING_APPLICATION_NAME = "ws";/*** Cache 默认的 key前缀为空,key的格式为(@Cacheable注解上的信息): value|cacheNames::key。* 自定义需求:* 1、key前缀分隔符:: 不习惯,换成:前缀分隔符。* 2、在 Cache相关注解 key的生成规则上,添加全局缓存 key的前缀。*/private static final CacheKeyPrefix CUSTOM_CACHE_KEY_PREFIX = cacheName -> SPRING_APPLICATION_NAME + ":" + cacheName0 + ":";

二、自定义过期时间

CacheManager 是 Spring 各种缓存的抽象接口。抽象的意义在于屏蔽不同实现细节的差异和提供扩展性。

对于 Spring Cache的缓存注解,原生没有额外提供一个指定 ttl 的配置,它是不支持在注解上添加过期时间的。

实际的业务场景中,如果希望通过缓存注解指定过期时间TTL,我们就需要自定义 RedisCacheManager来完成。

自定义TTL约定:

  • 1、支持使用 Cache注解的value|cacheNames来自定义过期时间。#ttlOfSecond不作为key的一部分。

    示例:value|cacheNames = “keyName#ttlOfSecond”。 keyName为业务缓存key。#为自定义TTL连接符。ttlOfSecond为过期时间,单位秒。

  • 2、Spring Cache缓存到 Redis的 key需要过滤掉 #ttlOfSecond这部分。

实现逻辑步骤:

  • 1、自定义缓存管理器并继承RedisCacheManager,同时重写createRedisCache方法
  • 2、将默认的缓存管理器改成我们自定义的缓存管理器

1、自定义缓存管理器

/*** 自定义 RedisCacheManager配置。*/
@Slf4j
public class CustomRedisCacheManager extends RedisCacheManager {/*** 项目名*/private final static String SPRING_APPLICATION_NAME = "ws";/*** 自定义缓存参数的TTL分隔符* 示例:value|cacheNames = “keyName#ttlOfSecond”。*/private static final String CUSTOM_TTL_SEPARATOR = "#";public CustomRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {super(cacheWriter, defaultCacheConfiguration);}/*** @param name        must not be {@literal null}. 业务 Cache注解的value|cacheNames* @param cacheConfig can be {@literal null}.* @return*/@Overrideprotected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {Duration ttl = getTtlByCustomName(name);if (ttl == null) {// 如果自定义 TTL为空,则设置全局 TTL为7天。ttl = Duration.ofDays(7);}/*** Cache缓存配置*/cacheConfig = cacheConfig.computePrefixWith(CUSTOM_CACHE_KEY_PREFIX) // 设置缓存key.entryTtl(ttl)  // 设置缓存的过期时间,查询不会更新过期时间;return super.createRedisCache(name, cacheConfig);}/*** Cache 默认的 RedisKey的格式为(@Cacheable注解上的信息): value|cacheNames::key。* 自定义需求:* 1、key前缀分隔符:: 不习惯,换成:前缀分隔符。* 2、在 Cache相关注解 key的生成规则上,添加全局缓存 key的前缀。*/private static final CacheKeyPrefix CUSTOM_CACHE_KEY_PREFIX = cacheName -> {// 过滤掉自定义的 TTL分隔符String cacheName0 = cacheName.split(CUSTOM_TTL_SEPARATOR)[0];return SPRING_APPLICATION_NAME + ":" + cacheName0 + ":";};/*** 根据 TTL分隔符拆分字符串,并进行过期时间 TTL的解析** @param name 业务 Cache注解的value|cacheNames* @return*/private Duration getTtlByCustomName(String name) {if (StringUtils.isBlank(name)) {return null;}/*** 根据 TTL分隔符拆分字符串,并进行过期时间 TTL的解析* 数组元素0 = 缓存的名称* 数组元素1 = 缓存过期时间TTL*/String[] cacheParams = name.split(CUSTOM_TTL_SEPARATOR);if (cacheParams.length > 1) {// 如果 TTL解析异常或者小于等于0,则返回null;Long ttl = null;try {ttl = Long.parseLong(cacheParams[1]);} catch (NumberFormatException e) {log.debug(" CacheManager 解析自定义 TTL异常,e.getMessage = {}", e.getMessage());}if (ttl != null && ttl > 0) {return Duration.ofSeconds(ttl);}}return null;}
}

2、注入自定义缓存管理器

在自定义的 CacheConfiguration类中,注入我们自定义的缓存管理器。

@EnableCaching
@Configuration
public class CacheConfiguration {@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {// 初始化一个RedisCacheWriterRedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);// 初始化一个RedisCacheConfigurationRedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();// 返回一个自定义的CacheManagerreturn new CustomRedisCacheManager(redisCacheWriter, defaultCacheConfig);}}

3、业务使用

    @Cacheable(value = "userCache_#120", key = "#id", unless = "#result==null")//@Cacheable(value = "userCache_", key = "#id", unless = "#result==null")//@Cacheable(value = "userCache_#0asa", key = "#id", unless = "#result==null")@Overridepublic UserDTO getById(Long id) {if (id == null || id <= 0L) {return null;}UserDO userDO = userMapper.selectById(id);return do2DTO(userDO);}

在这里插入图片描述

– 求知若饥,虚心若愚。

http://www.yayakq.cn/news/886708/

相关文章:

  • 上海哪家做网站资兴市网站建设哪个好
  • 网站建设需要哪些功能php做网站需要啥技术
  • 多人运动免费正能量网站链接网站上的支付接口怎么做
  • 北京学设计去哪个网站好jsp网站开发的使用表格
  • 网站页头页尾怎么做浏览器缓冲设置交网站建设 域名计入什么科目
  • 百度引流免费推广怎么做太原seo团队
  • 网站维护的方式有哪几种阳江网络公司
  • 泰州泛亚信息做网站怎么样中国铁路总公司建设管理部网站
  • 网站做微信公众号范县网站建设电话
  • 怎么样建设一个网上教学网站qq空间的网站
  • 12388网站建设管理情况重庆网站制作工作室
  • 东莞凤岗网站建设制作wordpress留言代码
  • vs网站中的轮播怎么做四川成都旅游必去十大景点推荐
  • 网站建设后备案多少钱建设专业网站平台
  • 2019年建设银行安徽招聘网站做音响的是哪个网站
  • 中国小说网站策划与建设试述建设一个网站的具体步骤
  • 哪个网站微博做的最好自然堂网站建设情况
  • 甘孜网站建设北京做电商网站设计
  • 对网站外部的搜索引擎优化广州自助网站搭建建站公司
  • 万荣做网站jq网站特效插件
  • 网站推广指的是什么农业公园网站建设
  • 广东佛山网站建设电商主图一键生成免费
  • 免费发布信息网站做外贸生意上国外网站
  • 建设网站需要花费python app开发
  • 动易网站首页制作河南比较出名的外贸公司
  • 网站建设费用评估长沙营销网站建站公司
  • 中国都有哪些网站猪八戒网可以做福彩网站吗
  • thinkphp做网站好吗网站如何添加统计代码
  • 免费阅读小说大全下载常用seo站长工具
  • 网络商城网站怎样做关键词优化正确设置网站keywords