2022 RedisDays 内容揭秘

上个月,Redis举办了3场线上会议,分别介绍了即将正式发布的Redis 7中包括的重要更新的内容,还有Redis完全重写的RedisJSON 2.0模块,和新发布的Redis Stack模块。除此之外,在此次线上会议中还介绍了现代化的软件架构与Redis是如何紧密结合在一起,例如Redis与Machine Learning或者人工智能的结合。下面让我们来具体看一下在会议中提到的具体内容吧。下面我们来看一个具体的例子:

首先,让我们来看一下Redis 7提供的新特性

1、Redis Functions: 在Redis 7.0中作为Lua脚本的升级内容

在2012年发布的Redis2.6中,Redis引入了Lua脚本这个概念。Lua脚本概念的引入使得Redis中的数据与客户的应用程序结合的更加紧密,但是不可否则,Lua脚本依然有它的局限性:Lua脚本是存在于客户端应用程序中的,一旦客户端应用重新启动,那么Lua脚本需要重新加载,这样就增加了对客户端应用程序的代码量与程序员维护程序的成本。为了解决这些问题,Redis 7.0加入了Redis Functions这个概念,Redis Functions可支持持久化,可复制,并且在节点重启之后可以直接从server端读取,并且还提供未来多种语言的API支持(目前只支持Lua)。下面我们来看一个具体的例子:

图一:是一个名字为myscript.lua 的Lua脚本文件
我们可以看到当脚本成功执行,server端的log显示:Execution started 和Execution ended。

图二:是这个脚本文件在客户端运行的情况

当server被重启后,这个Lua脚本如果不重新加载,那么它不会被执行,会显示错误信息。

图三:显示信息
那么下面我们来看一下如果是Redis Functions,运行的情况是什么样的。首先让我们来看一下Lua脚本和Redis Functions脚本的共同点和区别。下图是一个名为mylib.lua的Redis Functions脚本与之前的Lua脚本的一个对比。我们可以看到,唯一的不同是在Redis Functions中执行了一条语句:

redis.register_function("hgetset", hgetset);

图四:前后对比

我们看到客户端首先运行: redis-cli --x FUNCTION LOAD Lua mylib 将这个mylib加载进Redis 服务器端,然后调用redis-cli FCALL hgetset 1 myhash myfield "some other value" 去调用这个函数,最后我们可以看到成功的被执行了。

在server被重新启动之后,如果我们直接执行redis-ci FCALL .... 去调用这个函数,mylib中的函数依然可以执行成功,而不需要像Lua脚本那样重新加载。

2、ACL Selectors: 对于Redis 6.0 ACL功能的扩展(V1),可以支持更丰富和更方便的权限设置
在Redis 7 之前的ACL功能具有很多限制:例如一个用户不能对不同的键设置不同的权限(permissions);或者用户也不能对不同的键赋予不同的读写权限。在Redis 7中的ACL V2中,这些方面得到了进一步的改善:新增加了一个selector的概念,这个概念是将一系列的权限规则放在一起作为一个整体来执行(Selectors are a collection of authorization rules that are evaluated as a group), 并且用户可以执行命名以root权限执行或者作为某一个selector来执行(A user can execute a command if either the root permission or any selector authorizes the commands)。另外,在ACL V2中,Redis 新增了用户对键(key based)的权限控制能力,下面我们来看一个具体的例子:

基于Selector的例子,我们可以看到基于MADELYN用户,它对于itamar_q 是有LPOP操作权限而没有LPUSH操作权限的,但是对于madelyn_q是有LPUSH操作权限的。

基于key based 权限的例子

3、在集群方面

增加了对分片的Pub/Sub支持,并且还增加了对主机名的支持。

4、在底层数据结构中

使用listpacks替换了ziplists,并且使用了RDB 10的格式。

5、对于AOF文件,使用了多AOF机制

使得在重写过程中使用更少的内存和占用更低的I/O;第二个特点是在AOF中增加了每个键值对所对应的时间戳,为之后的Redis版本提供回滚和恢复提供了很好的支持。

RedisJSON 2.0

RedisJSON 2.0是由RUST完全重写的,它比上一个版本提供了更强的性能,更好的稳定性和更低的内存占用率。同时,RedisJSON2.0 对文档中的特定内容提供了JSONPath的语法支持。**新的版本具有以下新特点:**1.支持文档中子元素(sub-element)的更新。这种能力基于使用了JSON 数据交换格式(ECMA 404)作为元数据类型对子元素执行原子化的更新操作,其结果是大大提高的开发者的效率并且加快了应用程序的相应速度2.RediSearch可以支持索引(index),可以在JSON文档中进行全文查找3.新版本不但对大多数流行的主流语言(JavaScript, Python, Java C#)和平台(Spring, ASP.NET, Node.js, DJango)提供支持,而且还对RedisInsight提供良好的GUI和入门指导下面提供一个具体的例子来说明一下以上提到的特点:

更新user = 1 的score部分从5到100

更新user = 1 的内嵌的profile的属性name为Sue

为user=1的属性friends数组增加user:3

如果想了解更多关于RedisJSON2.0的内容,可以查看链接:

https://redis.com/press/redisjson-2-0-serves-as-fast-flexible-document-database/
Redis Stack

在此次RedisDay中,Redis官方几乎花了2个小时全方面的介绍了Redis Stack,并列举了几个具体的例子来说明Redis Stack是如何与应用程序结合的。

事实上,Redis Stack一个Redis对于数据模型和处理引擎的扩展模块。它支持可查询的JSON文档,基于时间序列的数据的操作等功能。并且,Redis Stack还包括了RedisInsight,一个Redis的可视化工具。

如果想了解更多的关于Redis Stack的内容,可以查看链接(https://redis.io/docs/stack/)及我们后续关于Redis Stack专题的博客。

除了以上内容,在这3天的RedisDay中还介绍了一些Redis与人工智能,机器学习相关的应用与API,有感兴趣的各位读者可以登录Redis网站去观看相关视频:

https://redis.com/redisdays/,谢谢您继续关注我们关于Redis的相关文章。

*注:本文所有图片和例子都取自于RedisDays中的视频,感谢Redis 开源社区所有贡献者对Redis所作的贡献。

相关推荐
奋斗的老史1 小时前
Spring Retry + Redis Watch实现高并发乐观锁
java·redis·spring
loop lee2 小时前
Redis - Token & JWT 概念解析及双token实现分布式session存储实战
java·redis
大G哥4 小时前
k8s创建单例redis设置密码
数据库·redis·云原生·容器·kubernetes
A22745 小时前
Redis——双写一致性
java·redis·缓存
小沈同学呀6 小时前
Redis KEYS查询大批量数据替代方案(推荐SCAN 命令)
redis
04Koi.14 小时前
Redis--常用数据结构和编码方式
数据库·redis·缓存
weisian15116 小时前
Redis篇--常见问题篇8--缓存一致性3(注解式缓存Spring Cache)
redis·spring·缓存
HEU_firejef17 小时前
Redis——缓存预热+缓存雪崩+缓存击穿+缓存穿透
数据库·redis·缓存
weisian15118 小时前
Redis篇--常见问题篇7--缓存一致性2(分布式事务框架Seata)
redis·分布式·缓存
白云coy18 小时前
Redis 安装部署[主从、哨兵、集群](linux版)
linux·redis