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的默认设置:
Setting | Value |
---|---|
Cache Writer | Non-locking, |
Cache Configuration |
|
Initial Caches | None |
Transaction Aware | No |
The following table lists the default settings for RedisCacheConfiguration
:
Key Expiration | None |
---|---|
Cache | Yes |
Prefix Keys | Yes |
Default Prefix | The actual cache name |
Key Serializer |
|
Value Serializer |
|
Conversion Service |
|
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提供了一种横向可扩展性和速度的替代方案。就实现而言,键值存储代表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 :单向绑定解析表达式,可简写为:xxx v-model :双向数据绑定。 v-for:遍历数组/对象/字符串 v-on:绑定事件监听,可简写为。 v-if:条件渲染(动态控制节点是否存存在) v-else:条件渲染(动态控制节点是否存存在) v-show:条件渲染…...

【深度学习】布匹寻边:抓边误差小于3px【附完整链接】
布匹寻边 项目简介 布匹寻边是指布料裁剪过程中,通过AI寻边技术自动识别布匹的边缘,将检测到的边缘信息输出,确保裁剪的准确性,减少浪费,并提高生产效率。 项目需求 将打满针眼的布匹边缘裁剪掉,且误差小…...
【学习笔记】理解深度学习的基础:机器学习
1. 机器学习基础 1.1 机器学习的定义与重要性 定义:深度学习是机器学习的一种特定形式。为了深入理解深度学习,必须牢固掌握机器学习的基本原理。机器学习算法是一种能够从数据中学习的算法,通过经验E在任务T上提高性能度量P(Mi…...

提升租赁效率的租赁小程序全解析
内容概要 在如今快节奏的生活中,租赁小程序俨然成为了提升租赁效率的一把利器。无论是个人还是企业,都会因其便捷的功能而受益。简单来说,租赁小程序能让繁琐的租赁流程变得轻松、高效。在这里,我们将带您畅游租赁小程序的海洋&a…...
Windows自动化Python pyautogui RPA操作
依赖包 import time import pyautogui import pyperclip import os import psutil from pywinauto.application import Application睡眠: pyautogui.sleep(1)鼠标事件: 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 内置搜狗输入法小计
问:为什么写? 答:网上搜出来的都试过了,不行!下面直接上代码和注意事项! 首先到这个目录(/RK3568/Rockchip_Android13_SDK_Release/device/rockchip/rk356x/tl3568_evm/preinstall)…...

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

《机器学习》之贝叶斯(Bayes)算法
目录 一、前言 二、贝叶斯算法原理解析 1、贝叶斯公式 2、朴素贝叶斯算法 3、计算步骤 4、例题: (1)、 计算先验概率 (2)、计算条件概率 (3)、计算后验概率 (4)…...
Redis实现高效的负载均衡算法
1. Redis存储设计 我们需要在 Redis 中存储以下信息: 配置列表(List<Config>):存储所有配置项。总权重:存储所有配置的总权重。当前轮询状态:存储当前的轮询状态(如当前随机值或索引&am…...

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

基于Android的民宿租赁系统的设计与实现
博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…...

数据链路层-STP
生成树协议STP(Spanning Tree Protocol) 它的实现目标是:在包含有物理环路的网络中,构建出一个能够连通全网各节点的树型无环逻辑拓扑。 选举根交换机: 选举根端口: 选举指定端口: 端口名字&…...
OceanBase环境搭建与熟悉全攻略:开启分布式数据库探索之旅
《OceanBase环境搭建与熟悉全攻略:开启分布式数据库探索之旅》 在当今数字化浪潮汹涌澎湃的时代,数据量呈爆炸式增长,业务对数据库的性能、可靠性和扩展性提出了前所未有的要求。OceanBase作为一款极具创新性的分布式数据库,正逐…...
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系列】容器内目录显示异常的解决之道
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
echarts:dataZoom属性横向滚动条拖拽不生效
问: 拖拽的过程中,第一次向右拖拽正常,然后就报错: echarts报错: var pointerOption pointerShapeBuilder[axisPointerType](axis,pixeValue,otherExtent),(axis,pixeValue,otherExtent)下划线红色报错:…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...