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

SpringData-Redis缓存

Spring Framework是领先的全堆栈Java/JEE应用程序框架。它提供了一个轻量级容器和一个通过使用依赖注入、AOP和可移植服务抽象实现的非侵入性编程模型。

NoSQL存储系统为传统RDBMS提供了一种横向可扩展性和速度的替代方案。就实现而言,键值存储代表NoSQL空间中最大(和最古老)的成员之一。

Spring Data Redis(SDR)框架通过Spring卓越的基础架构支持,消除了与存储交互所需的冗余任务和样板代码,从而使编写使用Redis键值存储的Spring应用程序变得容易。

一、Redis Cache

Spring Data Redis在org.springframework.Data.Redis.Cache包中提供了Spring Framework的Cache 抽象的实现。要使用Redis作为备份实现,请将RedisCacheManager添加到配置中,如下所示:

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

可以使用RedisCacheManager配置RedisCacheManager行为。RedisCacheManagerBuilder,允许您设置默认RedisCacheManager、事务行为和预定义缓存。

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

如前例所示,RedisCacheManager允许在每个缓存的基础上进行自定义配置。
RedisCacheManager创建的RedisCaache的行为是用RedisCachConfiguration定义的。该配置允许您设置密钥过期时间、前缀和RedisSerializer实现,以转换为二进制存储格式或从二进制存储格式转换,如下例所示:

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

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

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

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

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

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

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

下表列出了RedisCacheManager的默认设置:

Table 1.  RedisCacheManager defaults
SettingValue

Cache Writer

Non-locking, KEYS batch strategy

Cache Configuration

RedisCacheConfiguration#defaultConfiguration

Initial Caches

None

Transaction Aware

No

The following table lists the default settings for RedisCacheConfiguration:

Table 2. RedisCacheConfiguration defaults
Key ExpirationNone

Cache null

Yes

Prefix Keys

Yes

Default Prefix

The actual cache name

Key Serializer

StringRedisSerializer

Value Serializer

JdkSerializationRedisSerializer

Conversion Service

DefaultFormattingConversionService with default cache key converters

1、Redis缓存过期

即使在不同的数据存储中,空闲时间(TTI)和生存时间(TTL)的实现在定义和行为上也是不同的。
一般来说:

  • 生存时间(TTL)过期-TTL仅由创建或更新数据访问操作设置和重置。只要在TTL到期超时之前写入条目,包括在创建时,条目的超时将重置为配置的TTL过期超时持续时间。例如,如果TTL过期超时设置为5分钟,则在创建条目时超时将设置为5分,并在此后和5分钟间隔到期之前更新条目时重置为5分钟。如果在5分钟内没有发生更新,即使该条目被读取了几次,或者甚至在5分钟间隔内只读取了一次,该条目仍将过期。必须写入条目,以防止在声明TTL过期策略时条目过期。
  • 空闲时间(TTI)过期-无论何时也读取条目以及条目更新,TTI都会重置,并且是TTL过期策略的有效扩展。

 Time-To-Live (TTL)的过期

Spring Data Redis的缓存实现支持缓存项的生存时间(TTL)过期。用户可以通过提供新RedisCacheWriter的实现,将TTL过期超时配置为固定的持续时间,或者为每个缓存项配置动态计算的持续时间。TtlFunction接口。

如果所有缓存项都应在设置的持续时间后过期,则只需将TTL过期超时配置为固定的持续时间,如下所示:

RedisCacheConfiguration fiveMinuteTtlExpirationDefaults =RedisCacheConfiguration.defaultCacheConfig().enableTtl(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过期:
全局固定持续时间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();

当然,您可以使用以下命令组合全局配置和每个缓存配置:
全局固定持续时间TTL过期超时:

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

Time-To-Idle (TTI)的过期

Redis本身不支持true,time-to-idle(TTI)过期的概念。尽管如此,使用SpringDataRedis的Cache实现,仍然可以实现类似于空闲时间(TTI)过期的行为。
必须显式启用Spring Data Redis缓存实现中的TTI配置,即选择加入。此外,您还必须使用固定的持续时间或自定义的TtlFunction接口实现来提供TTL配置,如上面在Redis缓存过期中所述。
例如:

@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概念,因此只有通过接受到期选项的Redis命令才能实现TTI。在Redis中,“过期”从技术上讲是生存时间(TTL)策略。然而,在读取密钥的值时可以传递TTL过期,从而有效地重置TTL过期超时,就像现在Spring Data Redis的Cache.get(key)操作中的情况一样。
get(key)通过调用Redis GETEX命令实现。

相关文章:

SpringData-Redis缓存

Spring Framework是领先的全堆栈Java/JEE应用程序框架。它提供了一个轻量级容器和一个通过使用依赖注入、AOP和可移植服务抽象实现的非侵入性编程模型。 NoSQL存储系统为传统RDBMS提供了一种横向可扩展性和速度的替代方案。就实现而言&#xff0c;键值存储代表NoSQL空间中最大…...

Hadoop3.3.4伪分布式环境搭建

文章目录 前言一、准备1. 下载Hadoop2. 配置环境变量3. 配置免密 二、Hadoop配置1. hadoop-env.sh2. hdfs-site.xml3. core-site.xml4. mapred-site.xml5. yarn-site.xml 三、格式化四、启动 前言 hadoop学习——伪分布式环境——普通用户搭建 一、准备 1. 下载Hadoop 2. 配…...

【VUE 指令学习笔记】

v-bind :单向绑定解析表达式&#xff0c;可简写为:xxx v-model :双向数据绑定。 v-for&#xff1a;遍历数组/对象/字符串 v-on&#xff1a;绑定事件监听&#xff0c;可简写为。 v-if:条件渲染(动态控制节点是否存存在) v-else:条件渲染(动态控制节点是否存存在) v-show:条件渲染…...

【深度学习】布匹寻边:抓边误差小于3px【附完整链接】

布匹寻边 项目简介 布匹寻边是指布料裁剪过程中&#xff0c;通过AI寻边技术自动识别布匹的边缘&#xff0c;将检测到的边缘信息输出&#xff0c;确保裁剪的准确性&#xff0c;减少浪费&#xff0c;并提高生产效率。 项目需求 将打满针眼的布匹边缘裁剪掉&#xff0c;且误差小…...

【学习笔记】理解深度学习的基础:机器学习

1. 机器学习基础 1.1 机器学习的定义与重要性 定义&#xff1a;深度学习是机器学习的一种特定形式。为了深入理解深度学习&#xff0c;必须牢固掌握机器学习的基本原理。机器学习算法是一种能够从数据中学习的算法&#xff0c;通过经验E在任务T上提高性能度量P&#xff08;Mi…...

提升租赁效率的租赁小程序全解析

内容概要 在如今快节奏的生活中&#xff0c;租赁小程序俨然成为了提升租赁效率的一把利器。无论是个人还是企业&#xff0c;都会因其便捷的功能而受益。简单来说&#xff0c;租赁小程序能让繁琐的租赁流程变得轻松、高效。在这里&#xff0c;我们将带您畅游租赁小程序的海洋&a…...

Windows自动化Python pyautogui RPA操作

依赖包 import time import pyautogui import pyperclip import os import psutil from pywinauto.application import Application睡眠&#xff1a; pyautogui.sleep(1)鼠标事件&#xff1a; pyautogui.moveTo(100, 100, duration0.25) pyautogui.click(100, 100, duration0.…...

蓝桥杯_B组_省赛_2022(用作博主自己学习)

题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…...

RK3568 Android 13 内置搜狗输入法小计

问&#xff1a;为什么写&#xff1f; 答&#xff1a;网上搜出来的都试过了&#xff0c;不行&#xff01;下面直接上代码和注意事项&#xff01; 首先到这个目录&#xff08;/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall&#xff09…...

单片机Day1

目录 一.什么是单片机&#xff1f; 二.单片机的组成 三.封装形式 四.优势 五.分类 通用型&#xff1a; 专用型&#xff1a; 按处理的二进制位可以分为&#xff1a; 六.应用&#xff1a; 七.发展趋势 1.增加CPU的数据总线宽度。 2.存储器的发展。 3.片内1/0的改进 …...

《机器学习》之贝叶斯(Bayes)算法

目录 一、前言 二、贝叶斯算法原理解析 1、贝叶斯公式 2、朴素贝叶斯算法 3、计算步骤 4、例题&#xff1a; &#xff08;1&#xff09;、 计算先验概率 &#xff08;2&#xff09;、计算条件概率 &#xff08;3&#xff09;、计算后验概率 &#xff08;4&#xff09;…...

Redis实现高效的负载均衡算法

1. Redis存储设计 我们需要在 Redis 中存储以下信息&#xff1a; 配置列表&#xff08;List<Config>&#xff09;&#xff1a;存储所有配置项。总权重&#xff1a;存储所有配置的总权重。当前轮询状态&#xff1a;存储当前的轮询状态&#xff08;如当前随机值或索引&am…...

虚拟文件系统 VFS

目录 虚拟文件系统 VFS 文件系统挂载过程 虚拟文件系统 VFS 统一标准的系统调用接口&#xff1a; VFS定义了一组标准的文件操作API&#xff0c;如open(), read(), write(), close()等&#xff0c;使得用户空间的应用程序无需关心底层文件系统的具体类型。 下层文件系统必须实现…...

基于Android的民宿租赁系统的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…...

数据链路层-STP

生成树协议STP&#xff08;Spanning Tree Protocol&#xff09; 它的实现目标是&#xff1a;在包含有物理环路的网络中&#xff0c;构建出一个能够连通全网各节点的树型无环逻辑拓扑。 选举根交换机&#xff1a; 选举根端口&#xff1a; 选举指定端口&#xff1a; 端口名字&…...

OceanBase环境搭建与熟悉全攻略:开启分布式数据库探索之旅

《OceanBase环境搭建与熟悉全攻略&#xff1a;开启分布式数据库探索之旅》 在当今数字化浪潮汹涌澎湃的时代&#xff0c;数据量呈爆炸式增长&#xff0c;业务对数据库的性能、可靠性和扩展性提出了前所未有的要求。OceanBase作为一款极具创新性的分布式数据库&#xff0c;正逐…...

tensor core实现flash_attn_mma_share_kv源码分析

一 源码分析 1.1 函数入口 void flash_attn_mma_stages_split_q_shared_kv(torch::Tensor Q, torch::Tensor K, torch::Tensor V, torch::Tensor O, int stages) {CHECK_TORCH_TENSOR_DTYPE(Q, torch::kHalf) // Q [B,H,N,D]CHECK_TORCH_TENSOR_DTYPE(K, torch::kHalf) // K …...

【源码解析】Java NIO 包中的 MappedByteBuffer

文章目录 1. 前言2. MappedByteBuffer3. 例子4. 属性5. 构造器6. mappingOffset、mappingAddress、mappingLength7. isLoaded 判断内存是否还在内存中8. load 方法将 ByteBuffer 加载到 Page Cache 中9. force 刷盘 1. 前言 上一篇文章我们介绍了 HeapByteBuffer 的源码&#…...

【Docker系列】容器内目录显示异常的解决之道

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

echarts:dataZoom属性横向滚动条拖拽不生效

问&#xff1a; 拖拽的过程中&#xff0c;第一次向右拖拽正常&#xff0c;然后就报错&#xff1a; echarts报错&#xff1a; var pointerOption pointerShapeBuilder[axisPointerType](axis,pixeValue,otherExtent),(axis,pixeValue,otherExtent)下划线红色报错&#xff1a;…...

Halcon轮廓拟合与排序:从基础算子到工业检测实战

1. Halcon轮廓处理技术概览 在工业视觉检测领域&#xff0c;轮廓处理技术扮演着至关重要的角色。想象一下&#xff0c;你站在一条自动化产线旁&#xff0c;传送带上快速移动着各种形状的金属零件。这些零件可能摆放得杂乱无章&#xff0c;表面可能有划痕或油污&#xff0c;但生…...

别再只盯着LSB了:用Python实战对比空间域与DCT/DWT变换域水印的鲁棒性

别再只盯着LSB了&#xff1a;用Python实战对比空间域与DCT/DWT变换域水印的鲁棒性 数字水印技术作为信息隐藏领域的重要分支&#xff0c;其核心挑战始终是如何在不可见性与抗攻击能力之间找到最佳平衡点。传统教材和理论课程往往将LSB&#xff08;最低有效位&#xff09;算法作…...

护网行动入门指南:零基础也能参与,快速积累网安实战经验

护网行动入门指南&#xff1a;如何参与并积累实战经验 护网行动是国内最高规格的网络安全实战演练&#xff0c;旨在检验企业、单位的网络安全防御能力&#xff0c;现已成为网络安全领域的“实战练兵场”。对计算机专业学生而言&#xff0c;参与护网行动不仅能积累宝贵的实战经…...

深度解析:利用pmap+gdb精准诊断Linux进程内存异常

1. 为什么需要pmapgdb组合排查内存问题 第一次遇到线上服务内存爆涨时&#xff0c;我盯着top命令里那个不断攀升的RES数值束手无策。传统的内存监控工具就像医院的体温计&#xff0c;只能告诉你"发烧了"&#xff0c;但查不出具体病因。这就是pmap和gdb这对"黄金…...

Vue3项目实战:CKEditor5自定义构建与插件深度集成指南

1. 为什么需要自定义CKEditor5构建 第一次在Vue3项目中使用CKEditor5时&#xff0c;我直接安装了官方提供的经典编辑器包&#xff08;ckeditor/ckeditor5-build-classic&#xff09;。但很快就发现一个问题&#xff1a;默认构建缺少很多常用功能。比如字体颜色、背景色、对齐方…...

告别Lottie和SVGA:用Unity给Android应用做高性能动态引导动画的实战踩坑记录

告别Lottie和SVGA&#xff1a;用Unity给Android应用做高性能动态引导动画的实战踩坑记录 在移动应用开发中&#xff0c;动态引导动画一直是提升用户体验的关键元素。从早期的帧动画到后来的Lottie、SVGA等方案&#xff0c;开发者们不断寻求更高效、更灵活的动画实现方式。然而&…...

Apache Paimon面试通关秘籍-快照机制深度解析

1. 快照机制&#xff1a;Paimon的时光机原理 第一次接触Paimon的快照功能时&#xff0c;我脑海中浮现的是《哆啦A梦》里的时光机——它能带你回到任意时间点查看数据的历史状态。这个看似简单的功能背后&#xff0c;其实藏着Paimon最核心的设计哲学。 快照本质上就是数据表在某…...

G-Helper:重塑华硕硬件控制体验的轻量级开源解决方案

G-Helper&#xff1a;重塑华硕硬件控制体验的轻量级开源解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sca…...

实战指南:Autofac 依赖注入在微服务架构中的高效应用

1. Autofac在微服务架构中的核心价值 微服务架构最大的挑战之一就是如何优雅地管理数百个服务的依赖关系。我经历过一个电商系统重构项目&#xff0c;当单体应用拆分成30多个微服务后&#xff0c;手工管理服务依赖就像在玩多米诺骨牌——改一个服务参数可能引发连锁反应。这时候…...

深度解析 Claude Code v2.1.88 源码:技术栈与底层实现全揭秘(基于流出架构资料)

深度解析 Claude Code v2.1.88 源码:技术栈与底层实现全揭秘(基于流出架构资料) 摘要:2026年3月31日,Claude Code v2.1.88 相关技术资料(含TypeScript工程架构、核心模块实现逻辑,合计51.2万行代码量级)公开流出,包含其核心架构、工具系统、安全机制等全部实现细节。…...