Redis 6.0的新特性:多线程、客户端缓存与安全
2020年5月份,6.0版本。
面向网络处理的多IO线程可以提高网络请求处理的速度,而客户端缓存可以让应用直接在客户端本地读取数据,这两个特性可以提升Redis的性能。
细粒度权限控制让Redis可以按照命令粒度控制不同用户的访问权限,加强了Redis的安全保护。
RESP 3协议则增强客户端的功能,可以让应用更加方便地使用Redis的不同数据类型。
1 从单线程处理网络请求到多线程处理
Redis单线程架构,虽有些命令操作可用后台线程或子进程执行(如数据删除、快照生成、AOF重写),但从网络IO处理到实际的读写命令处理,都是由单线程完成。
随着网络硬件的性能提升,Redis性能瓶颈有时会出现在网络I/O处理,即单个主线程处理网络请求的速度跟不上底层网络硬件的速度。
一般有两种方法:
- 用用户态网络协议栈(例如DPDK)取代内核网络协议栈,让网络请求的处理不用在内核里执行,直接在用户态完成处理就行。
让Redis避免频繁让内核进行网络请求处理,可很好地提升请求处理效率。但这个方法要求在Redis的整体架构中,添加对用户态网络协议栈的支持,需修改Redis源码中和网络相关的部分(例如修改所有的网络收发请求函数),这会带来很多开发工作量。而且新增代码还可能引入新Bug,导致系统不稳定。 - 采用多个IO线程来处理网络请求,提高网络请求处理的并行度。Redis 6.0采用
Redis的多I/O线程只是用来处理网络请求,对于读写命令,Redis仍使用单线程处理。因为,Redis处理请求时,网络处理经常是瓶颈,通过多个I/O线程并行处理网络操作,可提升实例的整体处理性能。而继续使用单线程执行命令操作,无需为了保证Lua脚本、事务的原子性,额外开发多线程互斥机制了。这样Redis线程模型实现就简单了。
6.0中,主线程和IO线程具体是怎么协作完成请求处理的?
可将主线程和多I/O线程的协作分成如下阶段:
服务端和客户端建立Socket连接,并分配处理线程
主线程负责接收建立连接请求。当有客户端请求和实例建立Socket连接时,主线程会创建和客户端的连接,并把 Socket 放入全局等待队列中。
紧接着,主线程通过轮询方法把Socket连接分配给IO线程。
IO线程读取并解析请求
主线程一旦把Socket分配给IO线程,就会进入阻塞状态,等待IO线程完成客户端请求读取和解析。因为有多个IO线程在并行处理,所以,这个过程很快就可以完成。
主线程执行请求操作
等到IO线程解析完请求,主线程还是会以单线程的方式执行这些命令操作

IO线程回写Socket和主线程清空全局队列
当主线程执行完请求操作后,会把需要返回的结果写入缓冲区,然后,主线程会阻塞等待IO线程把这些结果回写到Socket中,并返回给客户端。
和IO线程读取和解析请求一样,IO线程回写Socket时,也是有多个线程在并发执行,所以回写Socket的速度也很快。等到IO线程回写Socket完毕,主线程会清空全局队列,等待客户端的后续请求。
该阶段主线程和IO线程的操作:

2 启用多线程
6.0多线程机制默认关闭,要启用,需在redis.conf中完成两个设置:
1.设置io-threads-do-reads=yes,表示启用多线程。
io-threads-do-reads yes
2.设置线程个数。线程个数一般小于Redis实例所在机器的CPU核数。如8核机器,Redis官方建议6个IO线程。
io-threads 6
若你在实际应用中,发现Redis实例CPU开销不大,吞吐量却没提升,可考虑使用Redis 6.0的多线程机制,加速网络处理,提升实例吞吐量。
3 实现服务端协助的客户端缓存
6.0实现了服务端协助的客户端缓存功能,也称跟踪(Tracking)功能。业务应用中的Redis客户端就能将读取的数据缓存在业务应用本地,应用就能直接在本地快速读取数据。
问题也来了,若数据被修改或失效,如何通知客户端对缓存的数据做失效处理?6.0实现的Tracking功能提供两种模式解决这问题。
3.1 普通模式
实例会在服务端记录客户端读取过的key,并监测key是否有修改。一旦key值变化,服务端会给客户端发送invalidate消息,通知客户端缓存失效
服务端对记录的key只会报告一次invalidate消息,也就是说,服务端在给客户端发送过一次invalidate消息后,如果key再被修改,此时,服务端就不会再次给客户端发送invalidate消息。
只有当客户端再次执行读命令时,服务端才会再次监测被读取的key,并在key修改时发送invalidate消息。这样设计的考虑是节省有限的内存空间。毕竟,如果客户端不再访问这个key了,而服务端仍然记录key的修改情况,就会浪费内存资源。
我们可以通过执行下面的命令,打开或关闭普通模式下的Tracking功能。
CLIENT TRACKING ON|OFF
3.2 广播模式
服务端会给客户端广播所有key的失效情况,但这样做后,若K被频繁修改,服务端会发送大量失效广播消息,消耗大量网络带宽资源。
实际应用时,会让客户端注册希望跟踪的key的前缀,当带有注册前缀的K被修改时,服务端会把失效消息广播给所有注册的客户端。和普通模式不同,在广播模式下,即使客户端还没读取过K,但只要它注册了要跟踪的K,服务端都会把K失效消息通知给这客户端。
案例 -客户端如何使用广播模式接收key失效消息
当我们在客户端执行下面的命令后,如果服务端更新了user🆔1003这个key,那么,客户端就会收到invalidate消息。
CLIENT TRACKING ON BCAST PREFIX user
这种监测带有前缀的key的广播模式,和我们对key的命名规范非常匹配。我们在实际应用时,会给同一业务下的key设置相同的业务名前缀,所以,我们就可以非常方便地使用广播模式。
普通模式和广播模式,需要客户端使用RESP 3协议,RESP 3协议是6.0新启用的通信协议。
对于使用RESP 2协议的客户端来说,就需要使用另一种模式:
重定向模式(redirect)
想获得失效消息通知的客户端,需执行订阅命令SUBSCRIBE,专门订阅用于发送失效消息的频道_redis_:invalidate。同时使用另外一个客户端,执行CLIENT TRACKING,设置服务端将失效消息转发给使用RESP 2协议的客户端。
案例
如何让使用RESP 2协议的客户端也能接受失效消息?
假设客户端B想获取失效消息,但客户端B只支持RESP 2协议,客户端A支持RESP 3协议。我们可以分别在客户端B和A上执行SUBSCRIBE和CLIENT TRACKING,如下所示:
//客户端B执行,客户端B的ID号是303
SUBSCRIBE _redis_:invalidate//客户端A执行
CLIENT TRACKING ON BCAST REDIRECT 303
这样设置以后,如果有键值对被修改了,客户端B就可以通过_redis_:invalidate频道,获得失效消息了。
4 从简单的基于密码访问到细粒度的权限控制
实例的访问权限控制列表功能(Access Control List,ACL),这个特性可以有效地提升Redis的使用安全性。
在Redis 6.0 版本之前,要想实现实例的安全访问,只能通过设置密码来控制,例如,客户端连接实例前需要输入密码。
此外,对于一些高风险的命令(例如KEYS、FLUSHDB、FLUSHALL等),在Redis 6.0 之前,我们也只能通过rename-command来重新命名这些命令,避免客户端直接调用。
Redis 6.0 提供了更加细粒度的访问权限控制,这主要有两方面的体现。
首先,6.0版本支持创建不同用户来使用Redis。在6.0版本前,所有客户端可以使用同一个密码进行登录使用,但是没有用户的概念,而在6.0中,我们可以使用ACL SETUSER命令创建用户。例如,我们可以执行下面的命令,创建并启用一个用户normaluser,把它的密码设置为“abc”:
ACL SETUSER normaluser on > abc
另外,6.0版本还支持以用户为粒度设置命令操作的访问权限。我把具体操作列在了下表中,你可以看下,其中,加号(+)和减号(-)就分别表示给用户赋予或撤销命令的调用权限。
为了便于你理解,我给你举个例子。假设我们要设置用户normaluser只能调用Hash类型的命令操作,而不能调用String类型的命令操作,我们可以执行如下命令:
ACL SETUSER normaluser +@hash -@string
除了设置某个命令或某类命令的访问控制权限,6.0版本还支持以key为粒度设置访问权限。
具体的做法是使用波浪号“~”和key的前缀来表示控制访问的key。例如,我们执行下面命令,就可以设置用户normaluser只能对以“user:”为前缀的key进行命令操作:
ACL SETUSER normaluser ~user:* +@all
好了,到这里,你了解了,Redis 6.0可以设置不同用户来访问实例,而且可以基于用户和key的粒度,设置某个用户对某些key允许或禁止执行的命令操作。
这样一来,我们在有多用户的Redis应用场景下,就可以非常方便和灵活地为不同用户设置不同级别的命令操作权限了,这对于提供安全的Redis访问非常有帮助。
5 启用RESP 3协议
Redis 6.0实现了RESP 3通信协议,而之前都是使用的RESP 2。在RESP 2中,客户端和服务器端的通信内容都是以字节数组形式进行编码的,客户端需要根据操作的命令或是数据类型自行对传输的数据进行解码,增加了客户端开发复杂度。
而RESP 3直接支持多种数据类型的区分编码,包括空值、浮点数、布尔值、有序的字典集合、无序的集合等。
所谓区分编码,就是指直接通过不同的开头字符,区分不同的数据类型,这样一来,客户端就可以直接通过判断传递消息的开头字符,来实现数据转换操作了,提升了客户端的效率。除此之外,RESP 3协议还可以支持客户端以普通模式和广播模式实现客户端缓存。
6 总结

Redis 6.0是刚刚推出的,新的功能特性还需要在实际应用中进行部署和验证,所以,如果你想试用Redis 6.0,可以尝试先在非核心业务上使用Redis 6.0:
- 可以验证新特性带来的性能或功能优势
- 避免因为新特性不稳定而导致核心业务受到影响
相关文章:
Redis 6.0的新特性:多线程、客户端缓存与安全
2020年5月份,6.0版本。 面向网络处理的多IO线程可以提高网络请求处理的速度,而客户端缓存可以让应用直接在客户端本地读取数据,这两个特性可以提升Redis的性能。 细粒度权限控制让Redis可以按照命令粒度控制不同用户的访问权限,…...
【雕爷学编程】MicroPython动手做(37)——驱动LCD与图文显示3
MixPY——让爱(AI)触手可及 MixPY布局 主控芯片:K210(64位双核带硬件FPU和卷积加速器的 RISC-V CPU) 显示屏:LCD_2.8寸 320*240分辨率,支持电阻触摸 摄像头:OV2640,200W像素 扬声器&#…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:序列化提示信息]
分类目录:《自然语言处理从入门到应用》总目录 将提示信息存储为文件而不是Python代码通常更好。这样可以方便共享、存储和版本控制提示信息。本文介绍了如何在LangChain中进行提示信息的序列化,包括不同类型的提示信息和不同的序列化选项。 在高层次上…...
【LinearAlgebra】Chapter 12 - Linear Algebra in Probability Statistics
文章目录 Chapter 12 - Linear Algebra in Probability & StatisticsVariance (around athe mean) 方差(接近均值)Continuous Probability Distributions 连续概率分布Mean and Variance of p ( x ) p(x) p(x) p ( x ) p(x) p(x) 的均值和方差Norm…...
webshell详解
Webshell详解 一、 Webshell 介绍二 、 基础常见webshell案例 一、 Webshell 介绍 概念 webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与…...
数据结构 | 搜索和排序——搜索
目录 一、顺序搜索 二、分析顺序搜索算法 三、二分搜索 四、分析二分搜索算法 五、散列 5.1 散列函数 5.2 处理冲突 5.3 实现映射抽象数据类型 搜索是指从元素集合中找到某个特定元素的算法过程。搜索过程通常返回True或False,分别表示元素是否存在。有时&a…...
【python】对象
对象 初识对象成员方法类和对象构造方法其它内置方法封装继承类型注释多态综合案例二级目录三级目录 初识对象 设计表格-生产表格-填写表格 对应于程序中:设计类-创建对象-对象属性赋值 class Student:nameNonegenderNone # 基于类创建对象 stu_1Student() stu_2S…...
k8s概念-污点与容忍
k8s 集群中可能管理着非常庞大的服务器,这些服务器可能是各种各样不同类型的,比如机房、地理位置、配置等,有些是计算型节点,有些是存储型节点,此时我们希望能更好的将 pod 调度到与之需求更匹配的节点上。 此时就需要…...
“从零开始学习Spring Boot:构建高效、可扩展的Java应用程序“
标题:从零开始学习Spring Boot:构建高效、可扩展的Java应用程序 简介: Spring Boot是一种用于简化Java应用程序开发的开源框架,它提供了一种快速、高效的方式来构建可扩展的应用程序。本文将介绍如何从零开始学习Spring Boot&…...
通向架构师的道路之tomcat集群
一、为何要集群 单台App Server再强劲,也有其瓶劲,先来看一下下面这个真实的场景。 当时这个工程是这样的,tomcat这一段被称为web zone,里面用springws,还装了一个jboss的规则引擎Guvnor5.x,全部是ws没有se…...
结构体,枚举,联合大小的计算规则
目录 1.结构体大小的计算 补充(位段) 2.枚举的大小(4个字节) 3.联合大小的计算 1.结构体大小的计算 (1)结构体内存对齐的规则 1. 第一个成员在与结构体变量偏移量为 0 的地址处。 2. 其他成员变量要对…...
Vue2 第十七节 Vue中的Ajax
1.Vue脚手架配置代理 2.vue-resource 一.Vue脚手架配置代理 1.1 使用Ajax库 -- axios ① 安装 : npm i axios ② 引入: import axios from axios ③ 使用示例 1.2 解决开发环境Ajax跨域问题 跨域:违背了同源策略,同源策略规定协议名࿰…...
ES6 - 字符串新增的一些常用方法
文章目录 0,新增的一些方法1,includes()、startsWith()、endsWith()2,repeat()3,padStart()、padEnd()4,trimStart()、trimEnd()5,replaceAll()6,at() 0,新增的一些方法 介绍一些ES6…...
最新SQLMap安装与入门技术
点击星标,即时接收最新推文 本文选自《web安全攻防渗透测试实战指南(第2版)》 五折购买链接:u.jd.com/3ibjeF6 SQLMap详解 SQLMap是一个自动化的SQL注入工具,其主要功能是扫描、发现并利用给定URL的SQL注入漏洞。SQLMa…...
Java 使用 Google Guava 实现接口限流
一、引入依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version> </dependency>二、自定义注解及限流拦截器 自定义注解:Limiter package com.haita…...
帮助中心的价值是什么?怎样才能在线搭建官网网站帮助中心?
帮助中心(Help Center)是一个提供公司或组织产品或服务相关信息的在线平台。它的价值在于为用户提供便捷的自助服务和解决问题的渠道,同时也能减轻客服人员的负担。 如何在线搭建官网网站帮助中心的步骤 确定需求:在搭建帮助中心…...
Kubernetes——理论基础
Kubernetes——理论基础 一、Kubernetes 概述1.K8S 是什么?2.为什么要用 K8S?3.Kubernetes 主要功能 二、Kubernetes 集群架构与组件三、Master 组件1.Kube-apiserver2.Kube-controller-manager3.Kube-scheduler4.配置存储中心——etcd 四、Node 组件1.Kubelet2.Ku…...
【VUE3】
Vue 3 是当下最流行的前端框架之一,其主要特点是性能更好、体积更小、更易于维护。下面是 Vue 3 的一些重要知识点和代码示例: 创建 Vue 实例 import { createApp } from vueconst app createApp({data() {return {message: Hello, Vue 3!}} })app.mo…...
《金融数据保护治理白皮书》发布(137页)
温馨提示:文末附完整PDF下载链接 导读 目前业界已出台数据保护方面的治理模型,但围绕金融数据保护治理的实践指导等尚不成熟,本课题围绕数据保护治理的金融实践、发展现状,探索和标准化相关能力要求,归纳总结相关建…...
上海亚商投顾:沪指震荡微涨 金融、地产午后大幅走强
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数早盘震荡,午后集体拉升反弹,创业板指涨超1%。券商等大金融板块午后再度走强&#…...
从理论到实践:深入解析Matlab cameraParameters对象及其在相机标定中的应用
1. 相机标定与cameraParameters对象基础 当你第一次接触计算机视觉项目时,相机标定可能是最让你头疼的环节之一。想象一下,你用相机拍摄了一张棋盘格照片,但发现边缘出现了明显的弯曲变形——这就是典型的镜头畸变现象。而cameraParameters对…...
Hermes Agent技术架构详解:从OpenClaw迁移到自进化AI助手的工程实践
如果你在使用AI助手工作流时遇到过"金鱼记忆"问题——同一个问题昨天刚解释过,今天又要从头开始,那么Hermes Agent的发布正是你需要的解决方案。Nous Research刚刚正式发布了Hermes Agent,这是首个内置学习循环的商业化AI Agent系统…...
春招求职如何用AI工具做简历?5款主流AI简历工具推荐与使用思路
每到求职和春招节点,简历都会变成很多应届生最先焦虑的一关。不会写、不会改、不知道项目经历怎么量化、不清楚岗位关键词怎么放进简历里,几乎是每一届毕业生都会遇到的问题。也正因为如此,越来越多人开始搜索各种 AI工具,希望更高…...
通义千问3-VL-Reranker-8B效果展示:建筑图纸+施工照片+工程视频关联排序
通义千问3-VL-Reranker-8B效果展示:建筑图纸施工照片工程视频关联排序 想象一下,你是一个建筑项目经理,手头有上千张设计图纸、数万张现场施工照片,还有几百段工程进度视频。现在,你想快速找到“上周三A栋5层混凝土浇…...
如何突破Windows屏幕限制?开源虚拟显示器驱动让你免费扩展10个虚拟屏幕
如何突破Windows屏幕限制?开源虚拟显示器驱动让你免费扩展10个虚拟屏幕 【免费下载链接】virtual-display-rs A Windows virtual display driver to add multiple virtual monitors to your PC! For Win10. Works with VR, obs, streaming software, etc 项目地址…...
高通QCM8550传感器驱动移植与调试实战指南
1. 高通QCM8550传感器驱动移植概述 第一次接触高通QCM8550平台的传感器驱动移植时,我被它独特的SEE(Sensors Execution Environment)架构搞得一头雾水。这个平台把传感器数据处理从Android系统剥离出来,放在独立的ADSP(…...
如何避免职业停滞?测试工程师的5年跃迁计划
停滞的陷阱与破局契机在技术迭代加速的2026年,软件测试领域正经历深刻变革:AI测试工具覆盖率突破40%,云原生架构普及率达75%,持续测试成为DevOps核心环节。然而行业调研显示,73%的测试从业者在工作5年后陷入能力平台期…...
国内知名论文辅导机构中,爱毕业aibiye等7家专业团队凭借在线指导服务位列行业前列。
核心工具对比速览 工具名称 核心优势 适用场景 降重效果 处理速度 aibiye 专业术语保留度高 理工科论文 40%→7% 快速 aicheck 逻辑结构保持好 社科类论文 38%→6% 极快 askpaper 上下文连贯性强 人文类论文 45%→8% 中等 秒篇 多语种支持 外语论文 42%…...
ARM64缓存一致性实战:手把手教你理解PoC和PoU,搞定DMA与JIT编译器的坑
ARM64缓存一致性实战:深入理解PoC与PoU的工程实践 在底层系统开发领域,缓存一致性始终是工程师们面临的核心挑战之一。特别是在ARM64架构下,PoC(Point of Coherency)和PoU(Point of Unification)…...
深入解析qmc-decoder:专业解决QQ音乐加密音频格式转换难题
深入解析qmc-decoder:专业解决QQ音乐加密音频格式转换难题 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder QQ音乐作为国内主流的音乐平台,为了保护版…...
