追求性能极致 - Redis:使用 Redis Module 扩展功能

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

1 啥是Redis Module

Redis Module是Redis的一种扩展模块,从 4.0版本开始,允许用户自定义扩展模块,在Redis内部实现新的数据类型和功能,使用统一的调用方式和传输协议格式扩展Redis的能力。它本身的设计目的就是在不同版本的Redis中运行,因此无需重新编译模块即可与特定版本(Redis > 4.0)一起运行。

通过使用Redis Module,可以在Redis中添加新的命令和数据类型,以实现更高级的功能。例如,一些第三方模块支持全文搜索、JSON数据的存储和查询、自定义分布式锁、时间序列数据的存储和查询等。我们也可以基于 Redis 去定制开发属于自己的 Module,来支撑自己的业务发展。

2 有哪些常见的Redis Module

目前,被 Redis 官方推荐的 Module 有:

2.1 RediSearch

一个功能齐全,可实现 快速检索、二次索引和全文搜索的搜索引擎模块


地址:GitHub - RediSearch/RediSearch: A query and indexing engine for Redis, providing secondary indexing, full-text search, vector similarity search and aggregations.

2.2 RedisJSON

RedisJSON是一个用于处理 JSON 数据的模块,它实现了JSON数据交换标准,允许从Redis 文档中存储、更新和获取JSON值。
地址:GitHub - RedisJSON/RedisJSON: RedisJSON - a JSON data type for Redis

2.3 RedisTimeSeries

RedisTimeSeries是Redis的一个时间序列数据库(TSDB)管理模块。RedisTimeSeries可以保存多个时间序列,每个时间序列都可以通过一个Redis键访问(类似于任何其他Redis数据结构)。
地址:GitHub - RedisTimeSeries/RedisTimeSeries: Time Series data structure for Redis

2.4 RedisGraph

用于实现图形数据库的模块
GitHub - RedisGraph/RedisGraph: A graph database as a Redis module

2.5 RedisBloom

RedisBloom为Redis增加了一组概率数据结构,包括Bloom filter(布隆过滤器), Cuckoo filter, Count-min sketch, Top-K和t-digest。使用此功能,您可以查询流数据,而无需存储流的所有元素。每种概率数据结构都应对不同的业务场景。
地址:GitHub - RedisBloom/RedisBloom: Probabilistic Datatypes Module for Redis

2.6 RedisCell

实现分布式限流能力的模块,使用了相对精妙的算法 generic cell rate algorithm (GCRA) 。
地址:GitHub - brandur/redis-cell: A Redis module that provides rate limiting in Redis as a single command.

2.7 RedisAI

RedisAI是一个Redis模块,用于执行深度学习/机器学习模型并管理其数据。它的目的是成为模型服务的“主力军”,为流行的DL/ML框架提供开箱即用的支持和无与伦比的性能。RedisAI坚持数据本地化原则,最大限度地提高了计算吞吐量,减少了延迟。
地址:GitHub - RedisAI/RedisAI: A Redis module for serving tensors and executing deep learning graphs

上面给出的几个都是GitHub小星星比较高的模块,如果你想要了解很多的内容,可以参考官方文档:https://redis.io/modules。

3 Redis module 实践指南

3.1 安装Redis

因为这些扩展模块是依赖于Redis服务存在的,所以前提是Redis安装完成。
Redis官方安装指南:Install Redis | Docs

3.2 以RedisJson 为例子

3.2.1 下载RedisJSON

github上下载ReJSON的地址:Releases · RedisJSON/RedisJSON · GitHub
官方使用文档:JSON | Docs
可以看到,最新的版本是 v2.6.10

3.2.2 安装

1、获取文件

在 redis 安装目录下新建 module 文件夹,把获取到的rejson.so文件 放到 module 文件夹中

    # 先进入redis的安装目录
    cd /usr/local/soft/redis-6.2.6/
    
    # 然后新建一个module文件夹
    mkdir module
    
    # 最后rejson.so文件放到module文件夹即可

2、修改配置

    # 进入到module目录下
    cd ./module
    
    # 为文件加X,即修改rejson.so为可执行文件
    chmod +x rejson.so
    
    # 修改 redis.conf,初始时自动 loadmodule
    loadmodule /usr/local/soft/redis-6.2.6/module/rejson.so
    
    # 重启 redis
    redis-cli -a 123456 shutdown
    redis-server conf/redis.conf
    redis-cli -p 6379

3.2.3 RedisJSON操作实践

1、写入JSON.SET

语法解析

    JSON.SET <key> <path> <json>  [NX | XX]
  • key:要操作的键。

  • path:JSON路径,用于指定要设置值的对象或数组的路径。

  • json:要设置的JSON值。

  • [NX | XX]:可选参数,用于指定操作的条件。

    • NX:仅当指定的键不存在时,才设置值。
    • XX:仅当指定的键存在时,才设置值。

比如下面,保存两条数据

    # 保存两条记录
    127.0.0.1:6379> JSON.SET user1 $ '{"name":"Brand", "age":18, "sex":"1"}'
    127.0.0.1:6379> JSON.SET user2 $ '{"name":"Candy", "age":17, "sex":"0"}'

2、读取操作JSON.GET

语法解析

    JSON.GET <key>
             [INDENT indentation-string]
             [NEWLINE line-break-string]
             [SPACE space-string]
             [path ...]
  • Key:要获取值的键
  • INDENT:查询结果替换掉默认缩进字符
  • NEWLINE:查询结果替换掉默认换行符
  • SPACE:查询结果替换掉默认空格
  • path:允许使用多个path进行查询
  • 获取JSON对象中的属性时需要以.开头

比如下面,获取相关信息

    # 得到myjson的所有数据
    127.0.0.1:6379> JSON.GET user1
    1) '{"name":"Brand", "age":18, "sex":"1"}'
    
    # 得到json数据中的键name的值
    127.0.0.1:6379> JSON.GET user1 name
    1) "Brand"

3、批量读取操作JSON.MGET

这是一个批量操作的语法,语法解析:

    JSON.MGET <key> [key ...] <path>
  • key:是一个列表,指的是可以有多个key
  • path:指所有key的path,即遍历每一个key的path,如果不存在,则返回null

下面的语句演示MGET获取批量数据:

    127.0.0.1:6379> JSON.MGET user1 user2 $.name
    1) "Brand"
    2) "Candy"

4、除操作JSON.DEL
这是删除操作的语法,语法解析:

    JSON.DEL <key> [path]
  • path是可选参数,如果没有提供,则默认整个Key删除掉

下面语句中

    # 删除整个Json
    127.0.0.1:6379> JSON.DEL user1
    (integer) 1
    
    # 删除某个字段
    127.0.0.1:6379> JSON.DEL user2  $.age
    1) "17"

5、其他操作类行
除了上面的几种常见操作,官方还支持如下命令,官方命令地址:JSON | Docs
常用命令(数字可以递增、相乘):

    # JSON.NUMINCRBY,JSON.NUMMULTBY,JSON.STRAPPEND,JSON.STRLEN
    
    > JSON.SET num $ 0
    OK
    > JSON.NUMINCRBY num $ 1
    "[1]"
    > JSON.NUMINCRBY num $ 1.5
    "[2.5]"
    > JSON.NUMINCRBY num $ -0.75
    "[1.75]"
    > JSON.NUMMULTBY num $ 24
    "[42]"

数组命令:

    #  JSON.ARRAPPEND,JSON.ARRINDEX,JSON.ARRINSERT,JSON.ARRLEN,JSON.ARRPOP,JSON.ARRTRIM
    
    > JSON.SET arr $ []
    OK
    > JSON.ARRAPPEND arr $ 0
    1) (integer) 1
    > JSON.GET arr $
    "[[0]]"
    > JSON.ARRINSERT arr $ 0 -2 -1
    1) (integer) 3
    > JSON.GET arr $
    "[[-2,-1,0]]"
    > JSON.ARRTRIM arr $ 1 1
    1) (integer) 1
    > JSON.GET arr $
    "[[-1]]"
    > JSON.ARRPOP arr $
    1) "-1"
    > JSON.ARRPOP arr $
    1) (nil)

对象命令(对象长度和key值输出):

    #  JSON.OBJKEYS,JSON.OBJLEN
    
    > JSON.SET obj $ '{"name":"Leonard Cohen","lastSeen":1478476800,"loggedOut": true}'
    OK
    > JSON.OBJLEN obj $
    1) (integer) 3
    > JSON.OBJKEYS obj $
    1) 1) "name"
       2) "lastSeen"
       3) "loggedOut"

组件命令:
JSON.TYPE,JSON.DEBUG,JSON.FORGET,JSON.RESP

4 总结

本文介绍了Redis的扩展模块Redis Module,设计目的就是使用加载Redis Module,在Redis中添加新的命令和数据类型,以实现更高级的功能。
文章介绍了目前官方推荐的几个Module,并演示了RedisJSON的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值