Redis6.0 Client-Side缓存是什么

前言

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.mfbz.cn/a/274295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C#】.net core 6.0 依赖注入生命周期

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 对于.net core而言&#xff0c;依赖注入生命周期有三种瞬态&#xff08;Transient&#xff09;、作用域&#xff08;Scoped&#xff09;和单例&#xff08;Singleton&#xff09;&#xf…

【正则表达式】

概述 正则表达式又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式并不仅限于某一种语…

传统船检已经过时?AR智慧船检来助力!!

想象一下&#xff0c;在茫茫大海中&#xff0c;一艘巨型货轮正缓缓驶过。船上的工程师戴着一副先进的AR眼镜&#xff0c;他们不再需要反复翻阅厚重的手册&#xff0c;一切所需信息都实时显示在眼前。这不是科幻电影的场景&#xff0c;而是智慧船检技术带来的现实变革。那么问题…

中间件系列 - Redis入门到实战(高级篇-多级缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 JVM进程缓存Lua语法入…

scikit-learn文档中的数据生成器

目录 1. make_classification: 2. make_regression: 3. make_blobs: 4. make_moons: 5.make_circles 6. make_sparse_coded_signal: 1. make_classification: 这是一个用于生成复杂二维数据的函数&#xff0c;通常用于可视化分类器的学习过程或者测试机器学习算法的性能…

学习笔记:数据挖掘与机器学习

文章目录 一、数据挖掘、机器学习、深度学习的区别&#xff08;一&#xff09;数据挖掘&#xff08;二&#xff09;机器学习&#xff08;三&#xff09;深度学习&#xff08;四&#xff09;总结 二、数据挖掘体系三、数据挖掘的流程四、典型的数据挖掘系统 一、数据挖掘、机器学…

在Ubuntu20.04配置PX4环境

目录 1.下载PX4源码2.安装PX4所有工具链3.编译PX4工程1.下载PX4源码 打开Ubuntu,Ctrl+Alt+T打开终端输入下面代码: git clone https://github.com/PX4/PX4-Autopilot.git --recursive出现上图中出现“Command ‘git’ not found, but can be installed with”,使用以下代码…

山景32位蓝牙DSP音频应用处理芯片—BP1048B2

由工采网代理的BP1048B2是山景推出的一款高性能32位DSP蓝牙音频应用处理器&#xff1b;该芯片拥有32位RISC内核&#xff0c;支持DSP指令&#xff0c;集成FPU支持浮点运算&#xff0c;可应用于蓝牙K歌宝、蓝牙便携式音箱、蓝牙拖箱、蓝牙SoundBar、包头式蓝牙耳机、各类蓝牙音频…

2013年第二届数学建模国际赛小美赛A题数学与经济灾难解题全过程文档及程序

2013年第二届数学建模国际赛小美赛 A题 数学与经济灾难 原题再现&#xff1a; 2008年的市场崩盘使世界陷入经济衰退&#xff0c;目前世界经济仍处于低迷状态&#xff0c;其原因是多方面的。其中之一是数学。   当然&#xff0c;并非只有金融界依赖于并非总是可靠的数学模型…

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

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

3DV 2024 Oral | SlimmeRF:可动态压缩辐射场,实现模型大小和建模精度的灵活权衡

目前大多数NeRF模型要么通过使用大型模型来实现高精度&#xff0c;要么通过牺牲精度来节省内存资源。这使得任何单一模型的适用范围受到局限&#xff0c;因为高精度模型可能无法适应低内存设备&#xff0c;而内存高效模型可能无法满足高质量要求。为此&#xff0c;本文研究者提…

数据仓库 基本信息

数据仓库基本理论 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Support&#xff09…

redis中根据通配符删除key

redis中根据通配符删除key 我们是不是在redis中keys user:*可以获取所有key&#xff0c;但是 del user:*却不行这里我提供的命令主要是SCANSCAN 0 MATCH user:* COUNT 100使用lua保证原子性 SCAN参数描述 在示例中&#xff0c;COUNT 被设置为 100。这是一个防止一次性获取大…

仓储革新:AR技术引领物流进入智慧时代

根据《2022年中国物流行业研究&#xff1a;深度探析行业现状&#xff08;智能设备及智能软件&#xff09;》&#xff0c;报告中提及&#xff1a;“中国社会物流总额依然保持着较为良好的增长态势&#xff0c;年增速已恢复至常年平均水平。2021年社会物流总额细分中工业物流总额…

小机器人,电子锁,牙刷,表类开关,磁阀开关等一些安防直流驱动的选型介绍分析

安防监控是一门被人们日益重视的新兴行业&#xff0c;就目前发展来看&#xff0c;应用普及程度越来越广&#xff0c;科技含量也越来越高&#xff0c;几乎所有高新科技都可促进其发展&#xff0c;尤其是信息时代的来临&#xff0c;更为该行业的发展提供契机。其中安防领域最为典…

玩转MYSQL|详细分析mysql-MGR集群搭建

目录 1、简介 2、环境准备 2.1 数据库服务器规划 2.2 安装mysql5.7.20 2.3 设置hostname和ip映射 3、创建复制环境 3.1 服务器host68.cn 3.1.1 配置/etc/my.cnf 3.1.2 服务器host68.cn上建立复制账号&#xff1a; 3.1.3 在mysql服务器host68.cn上安装group replicatio…

OpenChat-3.5:70亿参数下的AI突破

引言 在对话AI的发展史上&#xff0c;OpenChat-3.5标志着一个新纪元的到来。拥有70亿参数的这一模型&#xff0c;不仅是对现有语言学习模型&#xff08;LLMs&#xff09;的重大改进&#xff0c;更是在多模态任务中树立了新的标准。 模型概述 OpenChat-3.5作为一款先进的多模…

修复Apache httpd中的SSL/TLS 协议信息泄露漏洞(CVE-2016-2183)

漏洞详情如下&#xff1a; 详细描述TLS是安全传输层协议&#xff0c;用于在两个通信应用程序之间提供保密性和数据完整性。 TLS, SSH, IPSec协商及其他产品中使用的IDEA、DES及Triple DES密码或者3DES及Triple 3DES存在大约四十亿块的生日界&#xff0c;这可使远程攻击者通过S…

【超图】SuperMap iClient3D for WebGL/WebGPU —— 数据集合并缓存如何控制对象样式

作者&#xff1a;taco 最近在支持的过程中&#xff0c;遇到了一个新问题&#xff01;之前研究功能的时候竟然没有想到。通常我们控制单个对象的显隐、颜色、偏移的参数都是根据对象所在的图层以及对象单独的id来算的。那么问题来了&#xff0c;合并后的图层。他怎么控制单个对象…

微信小程序开发系列-04获取用户图像和昵称

这个功能的实现对于我这个新手来说可谓是一波三折。该功能的实现经历了三个“版本”的迭代&#xff0c;我的运气不是很好&#xff0c;从第一个“版本”开始尝试&#xff0c;这篇文章也是记录下这个过程&#xff0c;以便其他新手能快速找到解决方案。 Gen1-getUserInfo 第一个…
最新文章