【Spring连载】使用Spring Data访问Redis(五)----Redis Cache

【Spring连载】使用Spring Data访问Redis(五)----Redis Cache

  • 一、Redis Cache 过期
    • 1.1 Time-To-Live (TTL) 过期
    • 1.2 Time-To-Idle (TTI) 过期

Spring Data Redis在org.springframework.data.redis.cache包中提供了Spring框架缓存抽象(Cache Abstraction)的实现。要使用Redis作为后台实现,请在配置中添加RedisCacheManager,如下所示:

@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {return RedisCacheManager.create(connectionFactory);
}

RedisCacheManager行为可以通过RedisCacheManagerBuilder进行配置,允许您设置默认的RedisCacheConfiguration、事务行为和预定义缓存。

RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory).cacheDefaults(RedisCacheConfiguration.defaultCacheConfig()).transactionAware().withInitialCacheConfigurations(Collections.singletonMap("predefined",RedisCacheConfiguration.defaultCacheConfig().disableCachingNullValues())).build();

如上面的示例所示,RedisCacheManager允许在每个缓存的基础上进行自定义配置。RedisCacheManager创建的RedisCache的行为由RedisCacheConfiguration定义。该配置允许您设置key过期时间、前缀和用于转换二进制存储格式的RedisSerializer实现,如下面的示例所示:

RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(1)).disableCachingNullValues();

RedisCacheManager默认为无锁RedisCacheWriter,用于读取和写入二进制值。无锁缓存提高了吞吐量。缺少条目锁定可能会导致Cache putIfAbsent和clean操作的非原子命令重叠,因为这些操作需要向Redis发送多个命令。锁定对应方(locking counterpart)通过设置显式锁定key并检查该key的存在来防止命令重叠,这会导致额外的请求和潜在的命令等待时间。
锁定适用于缓存级别,而不是每个缓存条目。
可以按如下方式选择加入锁定行为:

RedisCacheManager cacheMangager = RedisCacheManager.build(RedisCacheWriter.lockingRedisCacheWriter(connectionFactory)).cacheDefaults(RedisCacheConfiguration.defaultCacheConfig())...

默认情况下,缓存项的任何key都以实际的缓存名称为前缀,后跟两个冒号(😃。此行为可以更改为静态前缀,也可以更改为计算前缀。设置静态前缀的示例如下:

// static key prefix
RedisCacheConfiguration.defaultCacheConfig().prefixKeysWith("(͡° ᴥ ͡°)");The following example shows how to set a computed prefix:// computed key prefix
RedisCacheConfiguration.defaultCacheConfig().computePrefixWith(cacheName -> "¯\_(ツ)_/¯" + cacheName);

缓存实现默认使用KEYS和DEL来清除缓存。大的键空间可能导致性能问题。因此,可以使用BatchStrategy创建默认的RedisCacheWriter,以切换到基于SCAN的batch策略。SCAN策略需要一个batch大小来避免过多的Redis命令往返:

RedisCacheManager cacheManager = RedisCacheManager.build(RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, BatchStrategies.scan(1000))).cacheDefaults(RedisCacheConfiguration.defaultCacheConfig())...

KEYS批处理策略完全支持任何驱动程序和Redis操作模式(单机,集群)。使用Lettuce驱动程序时完全支持SCAN。Jedis仅在非集群模式下支持SCAN。
RedisCacheManager的默认设置如下表所示:
表1.RedisCacheManager默认值

SettingValue
Cache WriterNon-locking, KEYS batch strategy
Cache ConfigurationRedisCacheConfiguration#defaultConfiguration
Initial CachesNone
Transaction AwareNo

下表列出了RedisCacheConfiguration的默认设置:
表2.RedisCacheConfiguration默认值

Key ExpirationNone
Cache nullYes
Prefix KeysYes
Default Prefix实际缓存名称
Key SerializerStringRedisSerializer
Value SerializerJdkSerializationRedisSerializer
Conversion Service带有默认的缓存键转换器的DefaultFormattingConversionService

默认情况下,RedisCache的统计功能是关闭的。使用RedisCacheManagerBuilder.enableStatistics()通过RedisCache#getStatistics()收集本地命中和未命中,返回收集数据的快照。

一、Redis Cache 过期

time-to-idle(TTI)和time-to-live(TTL)的实现在定义和行为上各不相同,甚至在不同的数据存储中也是如此。
一般来说:

  • time-to-live(TTL)expiration-TTL仅通过创建或更新数据访问操作进行设置和重置。只要在TTL过期超时之前写入条目,包括在创建时,条目的超时将重置为配置的TTL过期超时时间。例如,如果TTL过期超时设置为5分钟,则在创建条目时将超时设置为五分钟,并在此后和5分钟间隔过期之前更新条目时将其重置为五分钟。如果在5分钟内没有更新,即使该条目被读取了几次,或者在5分钟的时间间隔内只读取了一次,该条目仍将过期。在声明TTL过期策略时,必须写入条目以防止条目过期。
  • time-to-idle(TTI)expiration-TTI在条目读取以及条目更新的时候都会重置,并且是TTL到期策略的有效扩展。
    当配置TTL时,无论条目上发生何种类型的数据访问操作(读取、写入或其他),某些数据存储都会使条目过期。在设置的TTL过期超时之后,不管怎样,条目都会从数据存储中逐出(evicted )。逐出操作(例如:destroy, invalidate, overflow-to-disk(对于持久存储)等)是特定于数据存储的。

1.1 Time-To-Live (TTL) 过期

Spring Data Redis的Cache实现支持缓存条目的time-to-live(TTL)过期。用户可以通过提供RedisCacheWriter.TtlFunction接口的实现,将TTL过期超时配置为固定的持续时间,也可以为每个缓存条目动态计算持续时间。
RedisCacheWriter.TtlFunction接口是在Spring Data Redis 3.2.0中引入的。
如果所有缓存条目都应在设置的持续时间后过期,则只需配置具有固定持续时间的TTL过期超时,如下所示:

RedisCacheConfiguration fiveMinuteTtlExpirationDefaults =RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5));

但是,如果TTL过期超时因缓存条目而异,则必须提供RedisCacheWriter.TtlFunction接口的自定义实现:

enum MyCustomTtlFunction implements TtlFunction {INSTANCE;@Overridepublic Duration getTimeToLive(Object key, @Nullable Object value) {// compute a TTL expiration timeout (Duration) based on the cache entry key and/or value}
}

框架默认的实现是,一个固定持续时间的TTL 到期被封装在TtlFunction实现中,返回所提供的持续时间。
然后,你可以使用以下方法在全局范围内配置固定的TTL过期“持续时间”或动态的TTL过期“每个缓存条目的持续时间”:
全局固定TTL超时时间

RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(fiveMinuteTtlExpirationDefaults).build();

全局动态计算的每个缓存条目TTL超时时间

RedisCacheConfiguration defaults = RedisCacheConfiguration.defaultCacheConfig().entryTtl(MyCustomTtlFunction.INSTANCE);RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(defaults).build();

当然,你可以使用以下命令组合全局的和每个缓存的配置:

RedisCacheConfiguration predefined = RedisCacheConfiguration.defaultCacheConfig().entryTtl(MyCustomTtlFunction.INSTANCE));Map<String, RedisCacheConfiguration> initialCaches = Collections.singletonMap("predefined",predefined);RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(fiveMinuteTtlExpirationDefaults).withInitialCacheConfiguration().build();

1.2 Time-To-Idle (TTI) 过期

Redis本身不支持真正的time-to-idle(TTI)到期的概念。不过,使用Spring Data Redis的Cache实现,可以实现类似于time-to-idle(TTI)到期的行为。
Spring Data Redis的Cache实现中TTI的配置必须显式启用。此外,你还必须使用固定的持续时间或TtlFunction接口的自定义实现以提供TTL配置,如上文Redis Cache 过期中所述。
例如:

@Configuration
@EnableCaching
class RedisConfiguration {@BeanRedisConnectionFactory redisConnectionFactory() {// ...}@BeanRedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {RedisCacheConfiguration defaults = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)).enableTimeToIdle();return RedisCacheManager.builder(connectionFactory).cacheDefaults(defaults).build();}
}

因为Redis服务器没有实现真正的TTI概念,所以TTI只能通过Redis命令接受过期选项来实现。在Redis中,从技术上讲,“过期”是一种time-to-live(TTL)策略。然而,当读取key的值时,可以设置TTL过期,从而有效地重置TTL过期超时,就像现在Spring Data Redis的Cache.get(key)操作中的情况一样。
RedisCache.get(key)是通过调用Redis GETEX 命令来实现的。
Redis GETEX命令仅在Redis 6.2.0及更高版本中可用。因此,如果您没有使用Redis 6.2.0或更高版本,则无法使用Spring Data Redis的TTI过期。如果针对不兼容的Redis(服务器)版本启用TTI,则会引发命令执行异常。没有方法来确定Redis服务器版本是否正确并且是否支持GETEX命令。

为了在Spring Data Redis应用程序中实现真正的空闲时间(TTI)到期行为,必须在每次读取或写入操作中一致地访问具有(TTL)到期的条目。这条规则没有例外。如果你在Spring data Redis应用程序中混合和匹配不同的数据访问模式(例如:caching、使用RedisTemplate调用操作,以及使用Spring Data Repository CRUD操作时),那么即使设置了TTL过期,访问条目也不一定会阻止该条目过期。例如,在使用TTL过期参数调用@Cacheable服务方法期间(例如SET ),一个条目可能“put”(写入)缓存,然后在过期超时之前使用Spring Data Redis Repository读取(使用不带过期选项的GET)。不指定过期选项的简单GET不会重置条目的TTL过期超时。因此,该条目可能在下一次数据访问操作之前过期,即使它刚刚被读取。由于这不能在Redis服务器中强制执行,因此应用程序有责任在配置time-to-idle时间时,一致地使用RedisCache中的方法访问条目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

logback自定义生成DB日志(java环境)

目的&#xff1a; 未来在生成日志写入数据库中加一个特殊的字段&#xff0c;官方老版本提供的DBAppender无法实现&#xff0c;并且好巧不巧&#xff0c;在新版本这个实现也被删除了&#xff0c;所以重写一个实现。 1. 安装依赖 安装logback maven依赖 注意&#xff1a; lo…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

[高阶·产品经理]业务建模和需求高阶2月26-3月1日晚8点

等级 高阶 介绍 软件开发中&#xff0c;需求是解决“系统怎样好卖”的问题&#xff0c;设计是解决“降低开发成本”的问题。 本训练聚焦第一个方面&#xff0c;在点上强化业务建模和需求的技能。每期的教材都会根据当期学员所整理的学习《软件方法》的过程中以及工作中碰到的…

SELinux,android自启动自定义程序

rc文件仿照代码&#xff1a; service test_que /vendor/bin/test_que user root group system oneshot seclabel u:r:test_que:s0 on boot start test_que Android.bp文件仿照&#xff1a; init_rc: ["test_que.rc"], product.package.mk文件…

conda虚拟环境基础

【一文搞定最新版Anaconda】Win11 安装 Anaconda&#xff08;2023.9&#xff09;详解&#xff08;不删除旧版情况下下载、安装、注册、登录、设置环境变量、迁移旧环境、配置修改换源等&#xff09;连接Pycharm_win11安装anaconda-CSDN博客 conda命令大全&#xff08;create/in…

产品经理必备知识——API接口(获取电商商品订单数据API)

前言 在古代&#xff0c;我们的传输信息的方式有很多&#xff0c;比如写信、飞鸽传书&#xff0c;以及在战争中使用的烽烟&#xff0c;才有了著名的烽火戏诸侯&#xff0c;但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代&#xff0c;我通过…

网络安全之漏洞扫描

漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷&#xff0c;从而可以使攻击者能够在未授权的情况下访问或破坏系统。这些缺陷、错误或不合理之处可能被有意或无意地利用&#xff0c;从而对一个组织的资产或运行造成不利影响&#xff0c;如信息系统被攻击或控制…

github上传代码遇到的问题

今晚跟着这一篇文章在GitHub上测试上传项目。《怎样在GitHub上传自己的项目》 在最后一步 git push -u origin master 遇到了问题 warning: redirecting to https://github. com/xxx/test.git/ error: RPC failed;cur1 28 Recv failure: Connection was reset send-pack: unex…

关于node.js奇数版本不稳定 将11.x.x升级至16.x.x不成功的一系列问题(一)

据说vue2用16稳定一些 vue3用18好一点&#xff08;但之前我vue3用的16.18.1也可以&#xff09; 为维护之前的老项目 先搞定node版本切换 下载nvm node版本管理工具 https://github.com/coreybutler/nvm-windows/releases 用这个nvm-setup.zip安装包 安之前最好先将之前的nod…

算法篇:递归、搜索与回溯算法

一、递归、深搜、穷举vs暴搜vs深搜vs回溯vs剪枝&#xff1a; 01、面试题 08.06. 汉诺塔问题 class Solution { public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {dfs(a, b, c, a.size());}void dfs(vector<int>&a…

基于WordPress开发微信小程序2:决定开发一个wordpress主题

上一篇&#xff1a;基于WordPress开发微信小程序1&#xff1a;搭建Wordpress-CSDN博客 很快发现一个问题&#xff0c;如果使用别人的主题模板&#xff0c;多多少少存在麻烦&#xff0c;所以一咬牙&#xff0c;决定自己开发一个主题模板&#xff0c;并且开源在gitee上&#xff…

C++类和对象的属性

C类和对象的属性 千钧一发&#xff0c;让一根头发去承受三万斤的重量&#xff0c;但是它没有断。-----余华 const修饰结构体指针 内部值不能修改&#xff0c;即&#xff1a;只能读&#xff0c;不能写。防止误操作 #include <iostream> using namespace std;struct Po…

计算机网络自顶向下Wireshark labs-HTTP

我直接翻译并在题目下面直接下我的答案了。 1.基本HTTP GET/response交互 我们开始探索HTTP&#xff0c;方法是下载一个非常简单的HTML文件 非常短&#xff0c;并且不包含嵌入的对象。执行以下操作&#xff1a; 启动您的浏览器。启动Wireshark数据包嗅探器&#xff0c;如Wir…

【数据结构】 - 队列 栈

theme: smartblue 一、队列 1、概念 队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它按照先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的原则进行元素操作。在队列中&#xff0c;新元素总是被添加到队列的末尾&#xff0c;而…

spring-boot-actuator 服务监控

1 概述 服务启动时&#xff0c;通过spring-boot-actuator 监控es等服务是否连接成功等 2 依赖 <!-- 服务监控 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><…

2024年美国大学生数学建模竞赛(E题)财产保险建模|MCDA/随机森林建模解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮500人完成了建模与思路的构建的处理了&#xff5e; 本文运用利用时间序列和强化学习结合DQN算法&#xff0c;解决保险业可持续性问题&#xff1b;采用MCDA和随机森林&#xff0c;应对地产业保险挑战&…

[Unity Sentis] Unity Sentis 详细步骤工作流程

文章目录 1. 导入模型文件支持的模型创建运行时模型导入错误 2. 为模型创建输入将数组转换为张量创建多个输入进行操作 3. 创建一个引擎来运行模型创建一个Worker后端类型 4. 运行模型5. 获取模型的输出获取张量输出多个输出打印输出 1. 导入模型文件 要导入 ONNX 模型文件&am…

电脑怎么录屏?打造专业级视频内容!

随着科技的进步&#xff0c;电脑已经深入到我们的日常生活和工作中。而在这个数字时代&#xff0c;录制屏幕内容变得日益重要。无论是制作教程、分享游戏技巧&#xff0c;还是记录重要的演示&#xff0c;录屏都是一个不可或缺的功能。可是电脑怎么录屏呢&#xff1f;本文将深入…

Cmake语法学习3:语法

1.双引号 1.1 命令参数 1&#xff09;介绍 命令中多个参数之间使用空格进行分隔&#xff0c;而 cmake 会将双引号引起来的内容作为一个整体&#xff0c;当它当成一个参数&#xff0c;假如你的参数中有空格&#xff08;空格是参数的一部分&#xff09;&#xff0c;那么就可以使…

web前端较新的前端技术和趋势

Web前端的技术发展迅速&#xff0c;不断有新工具和框架出现。以下是一些较新的前端技术和趋势&#xff1a; 框架和库&#xff1a; React&#xff1a;Facebook开发的一个用于构建用户界面的JavaScript库&#xff0c;目前非常流行。 Vue.js&#xff1a;一个渐进式JavaScript框架…