解析Redis Key Prefix配置之谜:双冒号“::”的由来与作用

devtools/2024/9/20 7:16:56/ 标签: redis, 数据库, 缓存

前言

在使用Spring Boot集成Redis进行应用开发时,为了增强缓存键的可读性和管理性,我们常常会在配置文件中设定一个全局的key-prefix。如果你发现存储至Redis的键自动附加了“::”,本文将深入探讨这一现象背后的原因,解析Spring Data Redis是如何基于你的配置自动生成这一格式的。

背景介绍

在Spring Boot应用中,通过application.propertiesapplication.yml配置Redis缓存时,可以设置如下属性来指定所有缓存键的前缀:

spring:cache:type: redisredis:cache:key-prefix: myapp

​​​​在这里插入图片描述
​​​​在这里插入图片描述

设置上述配置后,每当应用执行缓存操作时(如@Cacheable注解的方法被调用),实际存储到Redis中的键名会以前缀myapp::开头,紧随其后的才是具体的业务键值。这里的“::”正是引发好奇的地方。

源码透视:双冒号的起源

让我们追溯到Spring Data Redis的内部实现,揭秘双冒号的生成逻辑。核心在于CacheKeyPrefix接口及其默认实现SimpleCacheKeyPrefix。简化的源码逻辑如下:

public class SimpleCacheKeyPrefix implements CacheKeyPrefix {private final String prefix;public SimpleCacheKeyPrefix(String prefix) {this.prefix = prefix;}@Overridepublic String compute(String cacheName) {return this.prefix + "::";}
}

在这里插入图片描述

当你在配置文件中设定了key-prefix,如myapp,实际上就是初始化了SimpleCacheKeyPrefix实例,其中compute方法负责生成最终的缓存键前缀。这里,Spring框架巧妙地在用户定义的前缀后添加了双冒号“::”,形成了最终的格式化字符串,比如myapp::

双冒号的智慧
  1. 逻辑分隔:“::”作为一个明确的分隔符,清晰地区分了自定义前缀与原始键值,使得键名更具可读性,便于在Redis客户端直接辨认和操作特定前缀下的所有键。

  2. 冲突规避:即便原始键值中包含了冒号,通过固定格式的双冒号,依然能保证键名的唯一性和解析的准确性,避免了键名解析上的歧义。

  3. 统一管理:在多模块或大规模应用中,统一的前缀格式便于实施缓存策略,如一键清除某个模块下的所有缓存,提高了缓存维护的便捷性。

应用实践

了解了“::”生成的原理,你就可以更加自信地在自己的应用中运用这一机制。例如,通过调整不同的key-prefix配置,实现不同环境或模块间缓存的隔离,或者利用这一特性进行更精细化的缓存管理和监控。

结语

通过本次解析,我们不仅揭示了Redis缓存键中“::”的由来,也深刻理解了Spring Data Redis在此设计上的考量。这一小小的设计细节,体现了框架设计者对开发者体验和系统可维护性的高度关注。在未来的开发实践中,合理利用这一特性,将助力你的应用构建更加高效、有序的缓存体系。


http://www.ppmy.cn/devtools/24487.html

相关文章

07_for循环返回值while循环

文章目录 1.循环返回值2.yield接收for返回值3.scala调用yield方法创建线程对象4.scala中的while循环5.scala中的流程控制 1.循环返回值 for循环返回值是Unit 原因是防止产生歧义; 2.yield接收for返回值 // 2.yield关键字打破循环,可以使for循环输出…

Linux抓包工具tcpdump

一、tcpdump抓包工具 1.命令格式解析 命令格式:tcpdump option proto dir type proto(协议) 1.tcp、udp、icmp 2.ip、ipv6 3.arp dir(数据的方向 ) 1.src 192.168.7.130 只抓取源地址是7.130 2.…

Node.js 的 fs 模块分析及其应用

fs 模块,作为 Node.js 平台中的一个核心组件,主要负责处理文件系统相关的操作。该模块提供了一系列用于文件管理的功能,例如文件的读取、写入、更新以及删除等。 应用场景分析 fs 模块的应用范围广泛,下面是一些典型的使用实例&…

基于单片机的机械臂运行轨迹在线控制系统设计

摘要:基于PLC的机械臂运行轨迹控制系统通过PLC采集现场信号及输出信号的状态变化实现机械臂运行轨迹的控制,不能实现多自由度机械臂控制。设计基于单片机的机械臂运行轨迹在线控制系统,系统硬件由上位机PC在线控制、主控制板和机械臂舵机控制板构成,通过光电编码器位移传感…

maven冲突问题

在编写maven当中的依赖时&#xff0c;有时候会出现一些问题&#xff0c;这种问题为Maven的当中的依赖。 在导入依赖的时候&#xff1a;出现了两种依赖发生了版本冲突的问题&#xff1f; <?xml version"1.0" encoding"UTF-8"?> <project xmlns…

1394 笔记

RN节点工作模块&#xff0c;当接收到STOF包后开始计时&#xff0c;当达到节点的发送、接收、数据泵偏移时向应用层发送相应使能。并根据STOF判断CC的错误状态&#xff0c;只有以下条件全部满足时进入正常工作模式&#xff1a; 条件1&#xff0c;STOF消息的帧周期正确&#xff…

Rust的Vec<T>

Vec<T> 是 Rust 编程语言中用于表示动态大小的数组的数据结构。它提供了类似其他语言中动态数组&#xff08;如 C 的 std::vector 或 Python 的 list&#xff09;的功能&#xff0c;允许在运行时高效地添加、删除或修改元素&#xff0c;同时确保内存的有效管理。Vec<T…

GPS时钟服务器(北斗授时设备)助某数据中心项目部署

GPS时钟服务器&#xff08;北斗授时设备&#xff09;助某数据中心项目部署 GPS时钟服务器&#xff08;北斗授时设备&#xff09;助某数据中心项目部署 1.1 项目概述 本次某数据中心时间同步项目中&#xff0c;设计目标是为了满足该数据中心同一区域数万台设备的时间高精度同步要…

RustGUI学习(iced)之小部件(三):如何使用下拉列表pick_list?

前言 本专栏是学习Rust的GUI库iced的合集&#xff0c;将介绍iced涉及的各个小部件分别介绍&#xff0c;最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个&#xff0c;目前处于发展中&#xff08;即版本可能会改变&#xff09;&#xff0c;本专栏基于版本0.12.1. 概述…

typeScript 安装

1、安装typescript 安装npm i -g typescript 查看是否安装成功 tsc -v 2、使用ts // 浏览器不支持ts 需要编译成 es5 let str: string ts 在终端输入 tsc index.ts 会将其生成一个对应的index.js文件 在电脑上首次使用TS的时候&#xff0c;执行TS 的命令的时候报错 打开PowerS…

网际协议IP

一、概念导入 网际协议IP是TCP/IP体系中最重要的协议之一。与IP协议配套使用的还有三个协议&#xff1a; 地址解析协议ARP网际控制报文协议ICMP网际组管理协议IGMP 二、虚拟互联网络 &#xff08;1&#xff09;定义 现实世界中&#xff0c;不同网络的主机进行通信&#xf…

【matplot】【matlab】绘制简洁美观二维坐标系的一个例子

觉得下图不错美观大方&#xff0c;现仿制下图&#xff1a; import numpy as np import matplotlib.pyplot as pltdef sigmoid(x):return 1 / (1 np.exp(-x))def sigmoid_derivative(x):return sigmoid(x) * (1 - sigmoid(x))# 设置中文字体 plt.rcParams[font.family] [Tim…

JavaEE技术之MySql高级(索引、索引优化、sql实战、View视图、Mysql日志和锁、多版本并发控制)

文章目录 1. MySQL简介2. MySQL安装2.1 MySQL8新特性2.2 安装MySQL2.2.1 在docker中创建并启动MySQL容器&#xff1a;2.2.2 修改mysql密码2.2.3 重启mysql容器2.2.4 常见问题解决 2.3 字符集问题2.4 远程访问MySQL(用户与权限管理)2.4.0 远程连接问题1、防火墙2、账号不支持远程…

论文阅读_股票预测强化学习_StockFormer

1 StockFormer PLAINTEXT 1 2 3 4 5 6 7中文名称&#xff1a;StockFormer: 混合交易机与预测编码 英文名称&#xff1a;StockFormer: Learning Hybrid Trading Machines with Predictive Coding 作者&#xff1a;Siyu Gao, Yunbo Wang∗, and Xiaokang Yang 机构&#xff1a;M…

React面试题(一)

react的优缺点 优点 虚拟DOM&#xff1a;减少对真实DOM的操作&#xff0c;提高性能。组件化&#xff1a;将代码分成一个个小的、可复用的组件&#xff0c;利于管理、维护。使用JSX&#xff1a;在React中可以嵌入HTML和JavaScript。单向数据流&#xff1a;React的单向数据流使得…

发那科FANUC机器人R-2000iB平衡缸维修攻略

在发那科机器人中&#xff0c;平衡缸扮演着稳定机械臂运动的关键角色。它通过内部的压力调节来平衡负载&#xff0c;保证机器人的精准定位和平稳操作。一旦出现法兰克机械手平衡缸故障或损坏&#xff0c;机器人的性能可能会大打折扣&#xff0c;因此及时且正确的FANUC机械手平衡…

【Python】如何使用Python和keyboard库解决内网字符无法复制到外网的问题

但我的心每分每刻仍然被她占有 她似这月儿仍然是不开口 提琴独奏独奏着明月半倚深秋 我的牵挂我的渴望 直至以后 &#x1f3b5; 李克勤《月半小原夜曲》 在一些特定的工作环境中&#xff0c;可能会存在内网与外网隔离的情况&#xff0c;这意味着直接的数据…

基于深度学习的SAR图像舰船检测方案设计

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 项目简介&#xff1a;基于深度学习的SAR图像舰船检测方案设计 本项目旨在设计一种基于深度学习的SAR图像舰船检测方…

深入理解Python多进程:从基础到实战

title: 深入理解Python多进程&#xff1a;从基础到实战 date: 2024/4/29 20:49:41 updated: 2024/4/29 20:49:41 categories: 后端开发 tags: 并发编程多进程管理错误处理资源调度性能优化异步编程Python并发库 引言 在Python编程中&#xff0c;多进程是一种重要的并发编程…

Kafka 3.x.x 入门到精通(03)——Kafka基础生产消息

Kafka 3.x.x 入门到精通&#xff08;03&#xff09;——对标尚硅谷Kafka教程 2. Kafka基础2.1 集群部署2.2 集群启动2.3 创建主题2.4 生产消息2.4.1 生产消息的基本步骤2.4.2 生产消息的基本代码2.4.3 发送消息2.4.3.1 拦截器2.4.3.1.1 增加拦截器类2.4.3.1.2 配置拦截器 2.4.3…