探索Redis 6.0的新特性

Redis(Remote Dictionary Server)是一个开源的内存中数据结构存储系统,通常被用作缓存、消息队列和实时数据处理等场景。它的简单性、高性能以及丰富的数据结构支持使其成为了众多开发者和企业的首选。在Redis 6.0版本中,引入了一系列令人期待的新特性和改进,本文将深入探讨这些新特性,以便开发者更好地理解和利用Redis在其项目中的潜力。
1.新特性
- 深度嵌套的从复制:在Redis 6.0中,引入了深度嵌套的从复制,使得从节点可以成为其他主节点的从节点,从而构建多级的从节点拓扑结构。这一特性提高了系统的可扩展性和灵活性,使得数据在分布式环境中更加可靠。
- 线程模型改进:Redis 6.0对线程模型进行了改进,引入了新的I/O线程,使得Redis能够更好地利用多核处理器的性能。这一改进提高了Redis在高负载环境下的性能表现,并降低了对单个CPU核心的依赖。
- 新的RDB版本:Redis 6.0引入了新的RDB版本(RDB版本 9),在处理大型数据库时具有更好的性能和可靠性。这一改进使得Redis在备份和恢复大规模数据时更加高效,降低了与持久化相关的性能开销。
- 慢查询日志改进:Redis 6.0对慢查询日志进行了改进,引入了新的命令
SLOWLOG GET,使得开发者能够更加灵活地检索和分析慢查询日志。这一改进有助于开发者更好地识别和优化性能瓶颈,提高系统的响应速度。 - TLS支持: Redis 6.0新增了对TLS(Transport Layer Security)的支持,通过加密保护数据在传输过程中的安全性。这一改进使得Redis在安全性方面更加强大,并能够满足更严格的安全要求。
2. 多线程模型
1. redis 6.0 提供了多线程的支持,redis 6 以前的版本,严格来说也是多线程,只不过执行用户命令的请求时单线程模型,还有一些线程用来执行后台任务, 比如 unlink 删除 大key,rdb持久化等。
redis 6.0 提供了多线程的读写IO, 但是最终执行用户命令的线程依然是单线程的,这样,就没有多线程数据的竞争关系,依然很高效。
redis 6.0 以前线程执行模式,如下操作在一个线程中执行完成

redis 6.0 线程执行模式:
可以通过如下参数配置多线程模型:
如:
io-threads 4 // 这里说 有三个IO 线程,还有一个线程是main线程,main线程负责IO读写和命令执行操作
默认情况下,如上配置,有三个IO线程, 这三个IO线程只会执行 IO中的write 操作,也就是说,read 和 命令执行 都由main线程执行。最后多线程将数据写回到客户端。

开启了如下参数:
io-threads-do-reads yes // 将支持IO线程执行 读写任务。

3. client side caching
客户端缓存:redis 6 提供了服务端追踪key的变化,客户端缓存数据的特性,这需要客户端实现

执行流程为, 当客户端访问某个key时,服务端将记录key 和 client ,客户端拿到数据后,进行客户端缓存,这时,当key再次被访问时,key将被直接返回,避免了与redis 服务器的再次交互,节省服务端资源,当数据被其他请求修改时,服务端将主动通知客户端失效的key,客户端进行本地失效,下次请求时,重新获取最新数据。
目前只有lettuce对其进行了支持:
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.0.0.RELEASE</version>
</dependency>
public static void main(String[] args) throws InterruptedException {RedisClient redisClient = RedisClient.create("redis://192.168.109.200");Map<String, String> clientCache = new ConcurrentHashMap<>();StatefulRedisConnection<String, String> myself = redisClient.connect();CacheFrontend<String, String> frontend =ClientSideCaching.enable(CacheAccessor.forMap(clientCache),myself,TrackingArgs.Builder.enabled().noloop());String key="csk";int count = 0;while (true){System.out.println(frontend.get(key));TimeUnit.SECONDS.sleep(3);if (count++ == Integer.MAX_VALUE){myself.close();redisClient.shutdown();}}
}
4.Acls访问权限控制
ACL 是对于命令的访问和执行权限的控制,默认情况下,可以有执行任意的指令,兼容以前版本
ACL设置有两种方式:
1. 命令方式
ACL SETUSER + 具体的权限规则, 通过 ACL SAVE 进行持久化
2. 对 ACL 配置文件进行编写,并且执行 ACL LOAD 进行加载
ACL存储有两种方式,但是两种方式不能同时配置,否则直接报错退出进程
1.redis 配置文件: redis.conf
2.ACL配置文件, 在redis.conf 中通过 aclfile /path 配置acl文件的路径
命令方式:
ACL SETUSER alice // 创建一个 用户名为 alice的用户
用如上的命令创建的用户语义为:
- 处于 off 状态, 它是被禁用的,不能用auth进行认证
- 不能访问任何命令
- 不能访问任意的key
- 没有密码
如上用户alice 没有任何意义。
创建一个对 cached: 前缀具有get命令执行权限的用户,并且设置密码:
acl setuser alice on >pass123 ~cached:* +get
auth alice pass123
set a a
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand
get a a
(error) NOPERM this user has no permissions to access one of the keys used as arguments
get cached:name
vvv
如上,如果访问没有被授权的命令,或者key, 将报错,set 命令没有被授权, key a 没有被授权,
cached:name 可以通过验证。
更符合阅读习惯的格式
ACL GETUSER alice
添加多个访问模式,空格分隔, 注意,切换其他用户进行登录,alice没有admin权限
ACL SETUSER alice ~objects:* ~items:* ~public:*
针对类型命令的约束
ACL SETUSER alice on +@all -@dangerous >密码 ~*
这里+@all: 包含所有得命令 然后用-@ 去除在redis command table 中定义的 dangerous 命令

可以通过如下命令进行查看具体有哪些命令属于某个类别
acl cat // 查看所有类别
acl cat dangerous // 查看所有的 dangerous 命令
开放子命令
ACL SETUSER myuser -client +client|setname +client|getname
禁用client 命令,但是开放 client 命令中的子命令 setname 和 getname ,只能是先禁用,后追加子命令,因为后续可能会有新的命令增加。
5. 总结
以下是使用表格对比Redis 6.0与旧版本的主要特性和改进:
| 特性/改进 | Redis 6.0 | 旧版本 |
|---|---|---|
| 深度嵌套的从复制 | 支持深度嵌套的从复制,构建多级从节点拓扑结构 | 仅支持单级从节点拓扑结构 |
| 线程模型改进 | 引入新的I/O线程,更好地利用多核处理器性能 | 线程模型相对简单,性能受限 |
| 新的RDB版本 | 引入RDB版本 9,处理大型数据库性能更优 | 旧版本存在性能瓶颈,处理大规模数据效率低 |
| 慢查询日志改进 | 引入新的命令SLOWLOG GET,更灵活地检索和分析慢查询日志 | 慢查询日志功能相对简单,缺乏灵活性 |
| TLS支持 | 新增对TLS的支持,保护数据在传输过程中的安全性 | 缺乏对传输层安全性的支持 |
更多文章
Redis为何如此快速?-CSDN博客
Redis持久化、主从与哨兵架构详解-CSDN博客
Redis集群选举流程详解-CSDN博客
ZAB 协议解析:ZooKeeper分布式一致性的核心-CSDN博客
MySQL8:开启数据库管理的新时代-CSDN博客
相关文章:
探索Redis 6.0的新特性
Redis(Remote Dictionary Server)是一个开源的内存中数据结构存储系统,通常被用作缓存、消息队列和实时数据处理等场景。它的简单性、高性能以及丰富的数据结构支持使其成为了众多开发者和企业的首选。在Redis 6.0版本中,引入了一…...
关于CSS中定位的教程
在CSS中,定位是一种强大的工具,可以帮助我们控制元素在页面上的位置。通过使用定位属性,我们可以精确地放置元素在页面的任何位置,并且可以实现各种复杂的布局效果。在本教程中,我们将深入探讨CSS中的定位属性…...
抽象类、模板方法模式
抽象类概述 在Java中abstract是抽象的意思,如果一个类中的某个方法的具体实现不能确定,就可以申明成abstract修饰的抽象方法(不能写方法体了),这个类必须用abstract修饰,被称为抽象类。 抽象方法定义&…...
消息队列kafka
消息队列解决的问题 1. 解耦,通过消息队列实现应用之间解耦,模块儿之间解耦 2. 跨线程/进程通信,通过消息队列传递数据,实现不同线程/进程间通信 3. 提升系统稳定性,在高并发场景通过消息队列缓冲,可以实…...
复盘成长——2024.2月复盘
复盘的目的和范围 每月一次的精心复盘,不仅是对自身工作成就、学习进步与成长轨迹的深度梳理,更是一种对未来路径的细致规划。通过这一过程,我期望能够更加精准地把握生活的节奏和职场的航向,从中汲取经验、聚焦目标,…...
Kafka安全模式之身份认证
一、简介 Kafka作为一个分布式的发布-订阅消息系统,在日常项目中被频繁使用,通常情况下无论是生产者还是消费者只要订阅Topic后,即可进行消息的发送和接收。而kafka在0.9.0.0版本后添加了身份认证和权限控制两种安全服务,本文主要…...
3、Redis-List【常用】
目录 一、重要特点 二、常用命令 三、Redis中List类型应用场景 一、重要特点 ①Redis中的List,视为双向链表 ②Redis中的List,数据可以重复 二、常用命令 常用命令 格式含义例子rpush key value从右边往key中添加value值rpush hobby java pythonlpu…...
黑马c++ STL部分 笔记(7) list容器
list基本概念 功能:将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素…...
关于使用Mxnet GPU版本运行DeepAR报错解决方案
1.引言 我们经常使用GPU来训练和部署神经网络,因为与CPU相比,它提供了更多的计算能力。在本教程中,我们将介绍如何将GPU与MXNet GluonTS一起使用。 首先,确保您的机器中至少有一个Nvidia GPU,并正确安装了CUDA以及CUDN…...
【STM32】江科大STM32学习笔记汇总(50)
00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【STM32】STM…...
LabVIEW非接触式电阻抗层析成像系统
LabVIEW非接触式电阻抗层析成像系统 非接触式电阻抗层析成像(NEIT)技术以其无辐射、非接触、响应速度快的特点,为实时监测提供了新的解决方案。基于LabVIEW的电阻抗层析成像系统,实现了数据的在线采集及实时成像,提高…...
蓝桥杯备战刷题three(自用)
1.合法日期 #include <iostream> #include <map> #include <string> using namespace std; int main() {map<string,int>mp;int days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i1;i<12;i){for(int j1;j<days[i];j){string sto_strin…...
密码学——二次剩余
引言 二次剩余在许多密码学算法和数论问题中具有重要的作用,这个概念涉及到同余方程等概念。 同余 学习二次剩余的概念,首先要了解同余方程的概念,首先默认研究范围为整数,假设 f ( x ) f(x) f(x)是一个整系数多项式,我们讨论是否有整数值x满足同余式 f (...
10.7、华为数通HCIP-DataCom H12-821单选题:121-140
121、关于OSPF特性描述错误的是:D A、OSPF采用链路状态算法。 B、每个路由器通过泛洪 LSA 向外发布本地链路状态信息 C、每台 OSPF 设备都会收集其它路由器发来的LSA 所有的LSA 放在一起便组成了链路状态数据库LSDB, D、OSPF 区域0中所有路由器的 LSDB 都相同。 E、每台…...
多租户篇 | MatrixOne与MySQL全面对比
MySQL 是经典的关系型数据库管理系统,以其简单易用的特性在中小型业务系统中广受开发人员的喜爱。但是MySQL的架构也具有一定的局限性,在需要具备"隔离性"的业务,例如 SaaS 系统或微服务架构等对"数据隔离"及"资源隔…...
python Matplotlib Tkinter-->导出pdf报表
环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 reportlab 4.0.9 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox impor…...
react-组件基础
1.目标 能够使用函数创建组件 能够使用class创建组件 能够给React元素绑定事件 能够使用state和setState() 能够处理事件中的this指向问题 能够使用受控组件方式处理表单 2.目录 React组件介绍 React组件的两种创建方式 React事件处理 有状态组件和无状态组件 组件中的state…...
The authenticity of host ‘github.com (20.205.243.166)‘ can‘t be established.
1、运行git clone报错: The authenticity of host github.com (20.205.243.166) cant be established. ECDSA key fingerprint is SHA256:p2QAC1TJYererOttrVc98/R1BWERWu3/LiyFdHfQM. Are you sure you want to continue connecting (yes/no/[fingerprint])? 这个…...
arduino uno R3驱动直流减速电机(蓝牙控制)
此篇博客用于记录使用arduino驱动直流减速电机的过程,仅实现简单的功能:PID调速、蓝牙控制 1、直流减速电机简介2、DRV8833电机驱动模块简介3、HC-05蓝牙模块简介电机转动测试4、PID控制5、蓝牙控制电机 1、直流减速电机简介 我在淘宝购买的电机&#x…...
智能家居控制系统(51单片机)
smart_home_control_system 51单片机课设,智能家居控制系统 使用及转载请标明出处(最好点个赞及star哈哈) Github地址,带有PPT及流程图 Gitee码云地址,带有PPT及流程图 以STC89C52为主控芯片,以矩阵键…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
