Redis6.0 Client-Side缓存是什么

news2025/1/22 21:53:18

前言

Redis在其6.0版本中加入了Client-side caching的支持,开启该功能后,Redis可以将指定的key-value缓存在客户端侧,这样当客户端发起请求时,如果客户端侧存在缓存,则无需请求Redis Server端。

Why Client-side Caching?

+-------------+                                +----------+
|             | ------- GET user:1234 -------> |          |
| Application |                                | Database |
|             | <---- username = Alice ------- |          |
+-------------+                                +----------+

一些场景下,Redis的一些热点数据需要高频访问,但是并不会频繁的更新,这种数据存储在Redis中,会对Redis的读有一定的压力,因此,将这种数据存储在客户端侧进行缓存,当需要读取时,直接从客户端侧的内存中读取,可以大幅度减轻Redis的读压力,当数据发生变更时,Redis Server通知Client,更新Client Cache。

+-------------+                                +----------+
|             |                                |          |
| Application |       ( No chat needed )       | Database |
|             |                                |          |
+-------------+                                +----------+
| Local cache |
|             |
| user:1234 = |
| username    |
| Alice       |
+-------------+

Why Not Pub/Sub?

在早期的Redis版本中,一些业务场景,我们一定也会考虑到将一些不常变化的热点数据,存储在本地内存中,使用例如Caffeine Cache等Localcache,定时周期频率读取最新的值,更新Localcache,或者使用Redis Pub/Sub,当key值发生更新时,通知整个集群更新Localcache。

使用Pub/Sub对于旧版本Redis来说,没有实现Client-side caching时,是一种解决方案,但是此种方案存在弊端,

首先Pub/Sub不可靠,如果部分集群中的Client没有收到Pub的通知,Localcache可能没有更新;

其次,对网络压力巨大,当Client Node非常多的时候,网络可能会出现阻塞,CPU压力也会增大,同时Client端需要自行实现Localcache的更新逻辑。

How to use it?

Redis Client-side Caching命令如下:

CLIENT TRACKING <ON | OFF> [REDIRECT client-id] [PREFIX prefix [PREFIX prefix ...]] [BCAST] [OPTIN] [OPTOUT] [NOLOOP]

客户端默认不开启 track 模式,我们需要在获取执行指令之前执行开启命令:

CLIENT TRACKING ON
+OK
GET foo
"bar"

默认情况下,Client开启Tracking后,Redis Server端会对所有的Client端请求查询的key开启Tracking,当 key的值发现变化时会发送失效信息给客户端 (invalidation message)。

server -> client: Invalidate foo

默认情况下,对所有的请求查询的key开启Tracking,这显然是不合适的,更多的场景下,我们只希望追踪部分热点且不经常变化的key,Redis支持对仅对特定的key开启手动追踪

CLIENT TRACKING ON OPTIN // 开启特定key追踪选项

CLIENT CACHING YES  // get请求前加入该命令
+OK
GET foo
"bar"

手动追踪模式下,需要用户在每次进行get命令之前,执行追踪的命令,这样的好处是非常的精确,但是也有点繁琐,Redis还提供了另一种追踪模式,即广播模式

CLIENT TRACKING ON BCAST PREFIX object: PREFIX user:

广播模式下,需要用户指定需要追踪的key的前缀,当key发生变化时,Redis Server端会发出广播通知全部订阅了该前缀key的客户端。

需要注意的是,在这个模式下,如果用户没有指定PREFIX,那么服务端会给客户端广播所有 key 的失效情况,如果 key 被频繁修改,服务端会发送大量的失效广播消息,这就会消耗大量的网络带宽资源,这是非常危险的一个行为,需要特别注意。

How to implement?

上面的篇幅我们简单介绍了Redis的客户端侧缓存如何开启,本小节我们来看一下Redis是如何实现的,在展开这个问题之前,我们可以思考一下,如果我们是Redis的设计者,我们该如何实现该功能?

很简单我们会想到,搞一个Array存一下嘛,对吧O(∩_∩)O,把需要追踪的key存一下,当key收到set之类的命令后,看一下Tracking Array中有没有,如果有,通知订阅的Client。

事实上,对于手动追踪模式,Redis的确是这样实现的,Redis内部使用了Invalidation Table存储Tracking Key Data,也可以叫做Tracking Table,其内部使用LRU淘汰机制维护,当Table内的key数量达到最大值,会移除最老的记录,同时触发该记录已过期的通知给客户端。

Invalidation Table中,Redis存储了Tracking key的指针地址与客户端之间的映射关系,使用了一种基数树(radix tree)的数据结构,因为键对象的指针就是内存地址,也就是长整型数据。客户端缓存的相关操作就是对该数据的增删改查:

tracking table

对于广播模式,实现的原理也是相似的,不过Redis并不是使用Invalidation Table存储,而是使用Prefixes Table存储key的前缀值与Client之间的关系:

Prefix Tracking Table

Problem

以上,我们简单了解了Redis的Client-side caching的使用方式与实现机制,这是一个非常好的功能,可以帮助我们更加高效的使用Redis,但是其也有对应的问题。

在Redis的官方文档中,Client-side caching功能并未提及Master/Slave 与 Cluster集群模式的特别支持,这意味着,Client端需要对key的Tracking做出特别的适配,而在Redis Cluster集群模式下,连接状态信息是分散在不同的节点上的,难以实现集中管理。

Redis的客户端Jedis、lettuce与Redisson均不提供Client-side caching相关支持,lettuce的committer在Github中关于对Client-side caching问题做出了回复:

There are a few challenges to address:

  1. Re-apply CLIENT TRACKING settings upon reconnect: While that is primary a resiliency feature, in Master/Replica or Cluster mode that is a must since we don’t get hold easily of cluster connections. We also need to apply tracking settings when creating a new connection
  2. Topology changes: Whenever the topology changes, we need to adapt to that. Meaning also that we need to carry over tracking settings. More over, how does the migration path look like when in Redis Cluster a slot assignment gets migrated to a new node? What about the server side, does it carry over also all touched keys? I assume not so reconfiguration can cause dropped notifications since the new server is no longer aware of the key subscriptions from the old server. While this could be done (with a lot of effort) on the client side, I think that is too complex.
  3. Finally, I don’t have time to do that in the near future nor I see how I can do that alone in 2021.

有一些挑战需要解决:

重新连接时重新应用客户端跟踪设置:虽然这主要是一个弹性功能,但在主/复制或群集模式下,这是必须的,因为我们不容易掌握群集连接。我们还需要在创建新连接时应用跟踪设置
拓扑变化:每当拓扑结构发生变化时,我们都需要适应这种变化。这也意味着我们需要沿用跟踪设置。此外,当 Redis 集群中的插槽分配迁移到新节点时,迁移路径是怎样的?在服务器端,是否也会继承所有被触及的密钥?我认为不会,因此重新配置可能会导致通知丢失,因为新服务器不再知道旧服务器的密钥订阅。虽然这可以在客户端完成(需要付出很多努力),但我认为这太复杂了。
最后,我近期没有时间去做这件事,我也不知道 2021 年我如何能单独完成这件事。

对于我们普通开发者,希望在生产环境中使用Client-side caching,也许还需要观望后续Java Redis Client社区的支持情况。

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

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

相关文章

C语言实验1:C程序的运行环境和运行C程序的方法

一、算法原理 这是学C语言的入门&#xff0c;并不需要很高深的知识&#xff0c;一个hello world 或者一个简单的加法即可 二、实验要求 了解所用的计算机系统的基本操作方法&#xff0c;学会独立使用该系统。 了解在该系统上如何编辑、编译、连接和运行一个C程序。 通过运…

macOS系统下载安装PyCharm社区版本的流程(详细)

第一步 进入PyCharm官网 链接&#xff1a;Get Your Educational Tool - JetBrains 第二步 选择下拉框&#xff0c;根据自己的电脑芯片选择下载版本 电脑芯片的查看位置&#xff1a;设置-通用-关于本机。选择完版本再点击Download按钮 -- 第三步 下载完以后在右上角打开文件&…

AGV智能搬运机器人-替代人工工位让物流行业降本增效

在当今快速发展的世界中&#xff0c;物流业面临着巨大的挑战&#xff0c;包括提高效率、降低成本和优化工作流程。为了应对这些挑战&#xff0c;一种新型的自动化设备——智能搬运机器人正在崭露头角。本文将通过一个具体的案例来展示富唯智能转运机器人在实际应用中的价值。 案…

uniApp中uView组件库的丰富布局方法

目录 基本使用 #分栏间隔 #混合布局 #分栏偏移 #对齐方式 API #Row Props #Col Props #Row Events #Col Events UniApp的uView组件库是一个丰富的UI组件库&#xff0c;提供了各种常用的UI组件和布局方法&#xff0c;帮助开发者快速构建美观、灵活的界面。下面给你写一…

第2课 用FFmpeg读取rtmp流并显示视频

这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本功能其实就两个:显示画面和播放声音。在实现这两个功能前&#xff0c;我们需要先用ffmpeg连接到rtmp服务器&#xff0c;当然也可以打开一个文件。 1.压缩备份上节课工程文件夹为demo.rar&#xff0c;并修…

网站显示不安全警告怎么办?消除网站不安全警告超全指南

网站显示不安全警告怎么办&#xff1f;当用户访问你的网站&#xff0c;而您的网站没有部署SSL证书实现HTTPS加密时&#xff0c;网站就会显示不安全警告&#xff0c;这种警告&#xff0c;不仅有可能阻止用户继续浏览网站&#xff0c;影响网站声誉&#xff0c;还有可能影响网站在…

视频格式网络地址转换视频到本地,获取封面、时长,其他格式转换成mp4

使用ffmpeg软件转换网络视频&#xff0c;先从官网下载对应操作系统环境的包 注意:网络地址需要是视频格式结尾&#xff0c;例如.mp4,.flv 等 官网地址&#xff1a;Download FFmpeg window包&#xff1a; linux包&#xff1a; 如果下载缓慢&#xff0c;下载迅雷安装使用…

RabbitMQ核心概念记录

本文来记录下RabbitMQ核心概念 文章目录 什么叫消息队列为何用消息队列RabbitMQ简介RabbitMQ基本概念RabbitMQ 特点具体特点包括 Rabbitmq的工作过程RabbitMQ集群RabbitMQ 的集群节点包括Rabbit 模式大概分为以下三种单一模式普通模式镜像模式 本文小结 什么叫消息队列 消息&am…

Spring 是如何解决循环依赖问题的方案

文章目录 Spring 是如何解决循环依赖问题的&#xff1f; Spring 是如何解决循环依赖问题的&#xff1f; 我们都知道&#xff0c;如果在代码中&#xff0c;将两个或多个 Bean 互相之间持有对方的引用就会发生循环依赖。循环的依赖将会导致注入死循环。这是 Spring 发生循环依赖…

基于Docker的软件环境部署脚本,持续更新~

使用时CtrlF搜索你想要的环境&#xff0c;如果没有你想要的环境&#xff0c;可以评论留言&#xff0c;会尽力补充。 本文提供的部署脚本默认参数仅适合开发测试&#xff0c;请根据实际情况调节参数。 数据库 MySQL version: 3.9 services:mysql:image: mysql:8.0.35container…

在 iPhone 手机上恢复数据的 7 个有效应用程序

我们的生活离不开 iPhone。无论我们走到哪里&#xff0c;他们都陪伴着我们&#xff0c;让我们保持联系、拍摄照片和视频&#xff0c;并提供娱乐。与此同时&#xff0c;您将计算机安全地放在办公桌上&#xff0c;不受天气影响&#xff0c;也不受伤害。如果您要在任何地方丢失重要…

Jmeter 性能 —— 监控服务器!

Jmeter 监控Linux需要三个文件 JMeterPlugins-Extras.jar (包&#xff1a;JMeterPlugins-Extras-1.4.0.zip)JMeterPlugins-Standard.jar (包&#xff1a;JMeterPlugins-Standard-1.4.0.zip)ServerAgent-2.2.3.zip 1、Jemter 安装插件 在插件管理中心的搜索Servers Performa…

cpp_07_类型转换构造_析构函数_深拷贝_静态成员

1 类型转换构造函数 1.1 why? 基本类型之间的转换&#xff0c;编译器内置转换规则&#xff1a;int -> double 类类型之间的转换&#xff0c;编译器不知道转换规则&#xff0c;需要用户提供&#xff1a;Cat -> Dog // consconv_why.cpp 为什么需要自定义转换 #includ…

多出口-热备---实验

多出口-热备 拓扑 需求 1&#xff09;增加出口路由器&#xff0c;实现路由器冗余&#xff0c;实现出口设备热备份 配置步骤 1&#xff09;SW5和SW6创建vlan25 vlan26 2) SW5配置vlanif 25的IP地址 3&#xff09;S 4&#xff09;统一规划设计一下MSTP 5&#xff09;R2配…

Java中利用Redis,ZooKeeper,数据库等实现分布式锁(遥遥领先)

1. 分布式锁 1.1 什么是分布式锁 在我们进行单机应用开发涉及并发同步的时候&#xff0c;我们往往采用synchronized或者ReentrantLock的方式来解决多线程间的代码同步问题。但是当我们的应用是在分布式集群工作的情况下&#xff0c;那么就需要一种更加高级的锁机制&#xff0…

奇富科技跻身国际AI学术顶级会议ICASSP 2024,AI智能感知能力迈入新纪元

近日&#xff0c;2024年IEEE声学、语音与信号处理国际会议ICASSP 2024&#xff08;2024 IEEE International Conference on Acoustics, Speech, and Signal Processing&#xff09;宣布录用奇富科技关于语音情感计算的最新研究成果论文“MS-SENet: Enhancing Speech Emotion Re…

java设计模式学习之【状态模式】

文章目录 引言状态模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用状态示例代码地址 引言 设想你正在使用一个在线视频播放器观看电影。随着你的互动&#xff0c;播放器可能处于不同的状态&#xff1a;播放、暂停、缓冲或结束。每个状态下&#xff0c;播放…

IDEA安装教程及使用

一、IDEA简介 ​ IDEA全称IntelliJ IDEA&#xff0c;是用于Java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境&#xff1a;把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试等多种功能综合到一起的开发工具。 二、ID…

数据分析之词云图绘制

试验任务概述&#xff1a;如下为所给CSDN博客信息表&#xff0c;分别汇总了ai, algo, big-data, blockchain, hardware, math, miniprog等7个标签的博客。对CSDN不同领域标签类别的博客内容进行词频统计&#xff0c;绘制词频统计图&#xff0c;并根据词频统计的结果绘制词云图。…

使用streampark进行flink on k8s LoadBalancer配置域名访问flink ui

在使用yarn部署flink任务时&#xff0c;yarn自动代理了flink web ui&#xff0c;通过yarn的地址即可访问任务web页面。 k8s模式下想访问flink web ui&#xff0c;要么使用NodePort的方式启动任务&#xff0c;然后通过k8s主机IPNodePort端口来进行访问。但是这种方法&#xff0…