首页 > 数据库 >Redis系列:使用 Redis Module 扩展功能

Redis系列:使用 Redis Module 扩展功能

时间:2024-01-18 10:37:21浏览次数:30  
标签:模块 redis 扩展 Module JSON https Redis

Redis24篇集合

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

一个功能齐全,可实现 快速检索、二次索引和全文搜索的搜索引擎模块
image
地址:https://github.com/RediSearch/RediSearch

2.2 RedisJSON

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

2.3 RedisTimeSeries

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

2.4 RedisGraph

用于实现图形数据库的模块
https://github.com/RedisGraph/RedisGraph?tab=readme-ov-file#trying-redisgraph

2.5 RedisBloom

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

2.6 RedisCell

实现分布式限流能力的模块,使用了相对精妙的算法 generic cell rate algorithm (GCRA) 。
地址:https://github.com/brandur/redis-cell

2.7 RedisAI

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

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

3 Redis module 实践指南

3.1 安装Redis

因为这些扩展模块是依赖于Redis服务存在的,所以前提是Redis安装完成。
Redis官方安装指南:https://redis.io/docs/install/install-redis/

3.2 以RedisJson 为例子

3.2.1 下载RedisJSON

github上下载ReJSON的地址:https://github.com/RedisJSON/RedisJSON/releases
官方使用文档:https://redis.io/docs/data-types/json/
可以看到,最新的版本是 v2.6.8
image

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、其他操作类行
除了上面的几种常见操作,官方还支持如下命令,官方命令地址:https://redis.io/docs/data-types/json/
常用命令(数字可以递增、相乘):

# 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的效果。

标签:模块,redis,扩展,Module,JSON,https,Redis
From: https://www.cnblogs.com/wzh2010/p/17962177

相关文章

  • redis高可用哨兵篇
    https://redis.io/docs/manual/sentinel/#sentinels-and-replicas-auto-discovery官网资料在上文主从复制的基础上,如果注节点出现故障该怎么办呢?在Redis主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的问题。哨兵机制(RedisSen......
  • redis自动化安装
    1.ruby脚本自动化安装1.安装ruby开发环境yuminstallrubygems-y2.通过ruby包管理工具,安装操作redis的模块gemsources--removehttps://rubygems.org/gemsources--removehttp://mirrors.aliyun.com/rubygems/gemsources-ahttps://mirrors.cloud.tencent.com/ru......
  • redis实战技巧
    1.分析key大小[root@db-51~]#redis-cli-h10.0.0.51-p6380--bigkeys#Scanningtheentirekeyspacetofindbiggestkeysaswellas#averagesizesperkeytype.Youcanuse-i0.1tosleep0.1sec#per100SCANcommands(notusuallyneeded).--------......
  • redis数据持久化篇
    为什么需要持久化Redis是个基于内存的数据库。那服务一旦宕机,内存中的数据将全部丢失。通常的解决方案是从后端数据库恢复这些数据,但后端数据库有性能瓶颈如果是大数据量的恢复,1、会对数据库带来巨大的压力,2、数据库的性能不如Redis。导致程序响应慢。所以对Redis来说,实现数......
  • redis安全篇
    redis被攻击,作为突破口,服务器惨遭毒手的事太常见了。大多数云服务器被攻击,都是redis,mongodb等数据库被入侵。因此修改端口,密码,以及注意bind运行地址,是必须。思考是否要暴露redis到公网。1.设置密码、端口配置[root@db-51~]#cat/opt/redis_6379/conf/redis_6379.confdae......
  • 从python 单机版爬虫 scrapy 到 分布式scrapy-redis 爬虫用最简单的步骤创建实例
    scrapy是很强大的模块化爬虫框架,具有很高的灵活性,使用频率很高,使用该框架能大大提高开发效率,scrapy-redis是在scrapy框架开发了组件,替换队列部分,实现多台服务器并行运行爬虫,提高爬取速度。下面是用最简单的例子从建立普通scrapy爬虫,然后数据保存mysql,最后简单替换几行就能使用s......
  • TS中扩展window对象
    TS中扩展window对象ts中扩展widows对象,方法四种:使用windows的地方,利用断言将window变为any;使用windows地方,利用接口继承扩展Window接口;利用@ts-ignore命令利用声明合并,扩展全局声明;利用声明合并,定义全局接口;示例函数://widow对象动态添加globalConfig对象functi......
  • jax框架的 Pallas 方式的GPU扩展不可用
    说下深度学习框架的GPU扩展功能的部分,也就是使用个人定制化的GPU代码编写方式来为深度学习框架做扩展。深度学习框架本身就是一种对GPU功能的一种封装和调用,但是由于太high-level,因此就会摒弃掉一些原有的GPU底层的编程功能,为此可以使用GPU原始功能的代码来为深度学习编写扩展函......
  • 多模块之间的循环依赖:java: Annotation processing is not supported for module cycl
    问题描述java:Annotationprocessingisnotsupportedformodulecycles.Pleaseensurethatallmodulesfromcycle[BDCloud-business,BDCloud-admin]areexcludedfromannotationprocessing  本质:BDCloud-admin模块为主启动模块,其包含了BDCloud-business模块;但在......
  • Redis - Search
                        ......