Redis 原生支持 JSON 了

号外

喜大普奔,Redis 官方支持 JSON 操作了,当我看到这个消息时,我的脑海中立马闪过这些操作:

  1. 把一个对象序列化成 json 字符串;
  2. 塞到 redis 的一个键上;
  3. 用的时候,拿到字符串,解析成对象,然后一顿操作猛如虎;
  4. 再序列化成字符串,塞回去。

而现在这一切简化成直接操作 Json 的了!下面赶紧来体验一番

安装 Redis

关于 redis 的安装,这里附上传送门:

https://blog.csdn.net/qq_24434251/article/details/121983628

安装 RedisJson

https://github.com/RedisJSON/RedisJSON/releases
Redis 原生支持 JSON 了

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

Redis 原生支持 JSON 了

修改 rejson.so 为可执行权限

chmod +x rejson.so

修改 redis.conf ,搜索 loadmodule

loadmodule /usr/local/redis-6.2.6/module/rejson.so

重启 redis

/usr/local/redis-6.2.6/bin/redis-cli -a 123456 shutdown
/usr/local/redis-6.2.6/bin/redis-server conf/redis.conf

命令行体验 json 的操作

# 创建一个 json_1
127.0.0.1:6379> JSON.SET json_1 . '{"name":"zz","age":22,"msg":"hello"}'
OK

# 设置 json_1 的 key=name 的值为 zhangsan
127.0.0.1:6379> JSON.SET json_1 .name '"zhangsan"'
OK

# 获得整个 json_1
127.0.0.1:6379> JSON.GET json_1
"{\"name\":\"zhangsan\",\"age\":22,\"msg\":\"hello\"}"

# 获得 json_1 键为 name 的值
127.0.0.1:6379> JSON.GET json_1 .name
"\"zhangsan\""

# 往 json_1 中添加一个数组对象
127.0.0.1:6379> json.set json_1 .list '[2,3,4]'
OK

# 往 json_1 的 list 对象中添加一个元素 6
127.0.0.1:6379> json.arrappend json_1 .list 6
(integer) 4

# 查看所有元素
127.0.0.1:6379> json.get json_1
"{\"name\":\"zhangsan\",\"age\":22,\"msg\":\"hello\",\"list\":[2,3,4,6]}"

体验下来,感觉 Redis 原生支持 json 之后,对于 redis 的操作更加灵活了。

想象空间更大了,一切复杂信息的存储皆可 JSON,并且操作十分简单,省去了序列化、反序列化的操作,那我们一起来看一下使用 Java Api 如何操作 Redis Json 的!

使用 Java 来操作 redis Json

当然我们还是要在一个 Java 工程中去操作一下:

package com.kkarch.rejson;

import com.redislabs.modules.rejson.JReJSON;
import com.redislabs.modules.rejson.Path;
import redis.clients.jedis.Jedis;

import java.util.Arrays;

/**
* @Author wangkai
* @Time 2021/12/16 21:21
*/
public class ReJsonMain {
   public static void main(String[] args) {
       Jedis jedis = new Jedis("192.168.0.110",6379);
       jedis.auth("123456");
       JReJSON redisClient = new JReJSON(jedis);

       System.out.println("初始化 json");
       redisClient.set("json_2",new Object());
       redisClient.set("json_2","zhangsan",new Path(".name"));
       redisClient.set("json_2",21,new Path(".age"));
       redisClient.set("json_2","hello",new Path(".msg"));
       redisClient.set("json_2",Arrays.asList(9,8,7),new Path(".arr"));
       Object result = null;
       result = redisClient.get("json_2");
       System.out.println(result);

       System.out.println("设置 name=lisi");
       redisClient.set("json_2","lisi",new Path(".name"));
       result = redisClient.get("json_2");
       System.out.println(result);

       System.out.println("在数组追加一个值:21");
       redisClient.arrAppend("json_2", new Path(".arr"), 21);
       result = redisClient.get("json_2");
       System.out.println(result);

  }
}

结果:

初始化 json
{name=zhangsan, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0]}
设置 name=lisi
{name=lisi, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0]}
在数组追加一个值:21
{name=lisi, age=21.0, msg=hello, arr=[9.0, 8.0, 7.0, 21.0]}

其他命令还有下面这些,总之可以覆盖 json 的所有操作了。

Redis 原生支持 JSON 了
Redis 原生支持 JSON 了
Redis 原生支持 JSON 了

使用 Python 操作 Redis Json

好久没用 Python,我的 PyCharm 都罢工了,遂直接用 cmd 来演示一把

首先要安装 rejson 模块

pip install rejson

然后进入命令行就可以直接操作了:

from rejson import Client, Path
rj = Client(host='192.168.0.110', port=6379, decode_responses=True,password="123456")
rj.jsonset("json_3",Path.rootPath(),{})
rj.jsonset("json_3",Path(".name"),"zhangsan")
rj.jsonset("json_3",Path(".age"),"19")
rj.jsonset("json_3",Path(".arr"),[1,3,4])
rj.jsonget("json_3")

结果:

>>> rj.jsonget("json_3")
{'name': 'zhangsan', 'age': '19', 'arr': [1, 3, 4]}

使用 json 也是相当简单的。

当然,官方还支持更多的客户端(https://github.com/RedisJSON/RedisJSON):

Redis 原生支持 JSON 了

关注了实用性,下面到了我们最关注的点了,性能如何?

RedisJson 的性能如何

官网也给了一个性能测试报告,可谓碾压其他 NoSQL,下面是核心的报告结论:

  • 对于隔离写入(isolated writes),RedisJSON 比 MongoDB 快 5.4 倍,比 ElasticSearch 快 200 倍以上。
  • 对于隔离读取(isolated reads),RedisJSON 比 MongoDB 快 12.7 倍,比 ElasticSearch 快 500 倍以上。

在混合工作负载场景中,实时更新不会影响 RedisJSON 的搜索和读取性能,而 ElasticSearch 会受到影响。以下是具体的数据:

  • RedisJSON* 支持的操作数/秒比 MongoDB 高约 50 倍,比 ElasticSearch 高 7 倍/秒。
  • RedisJSON* 的延迟比 MongoDB 低约 90 倍,比 ElasticSearch 低 23.7 倍。

此外,RedisJSON 的读取、写入和负载搜索延迟在更高的百分位数中远比 ElasticSearch 和 MongoDB 稳定。当增加写入比率时,RedisJSON 还能处理越来越高的整体吞吐量,而当写入比率增加时,ElasticSearch 会降低它可以处理的整体吞吐量。

其他更加详细的报告可以参看官网的基准测试博客:

https://redis.com/blog/redisjson-public-preview-performance-benchmarking/

有人已经将他翻译成了中文:

https://blog.csdn.net/xiangzhihong8/article/details/121530019

原创文章,作者:kk,如若转载,请注明出处:http://www.wangkai123.com/14/

(1)
上一篇 2022-06-18 13:37
下一篇 2022-06-18 13:26

相关推荐

  • Flink-Clients 源码阅读(2)

    一、我们本次的目的是什么? 这次我们的目的是,在本地的 IDEA 中去 debug flink-clients 代码,然后远程提交给 flink standalone 集群上去执行…

    Flink 2022-06-19
  • Hive执行流程源码解析

    最近在出差,客户现场的 HiveServer 在很长时间内不可用,查看 CM 的监控发现,HiveServer 的内存在某一时刻暴涨,同时 JVM 开始 GC,每次 GC 长达 1…

    技术 2022-06-18
  • Flink 异步 I/O 解析

    一、简介 我们知道 flink 对于外部数据源的操作可以通过自带的连接器,或者自定义 sink 和 source 实现数据的交互。 那么为啥还需要异步 IO 呢?那时因为对于实时处…

    Flink 2022-06-19
  • Flink Sql 核心概念剖析

    本次,我们从 0 开始逐步剖析 Flink SQL 的来龙去脉以及核心概念,并附带完整的示例程序,希望对大家有帮助! 本文大纲 一、快速体验 Flink SQL 为了快速搭建环境体…

    Flink 2022-06-19
  • Flink-Clients 模块源码阅读

    本文大纲 一、Flink 官方文档这么全面,为什么还要读 Flink 源码 读文档和读源码的目的是不一样的,就拿 Apache Flink 这个项目来说,如果你想知道 Flink …

    Flink 2022-06-19
  • vim 的使用

    一、命令模式中最常用的一些命令 dd 删除(剪切)光标所在行 5dd 删除(剪切)从光标处开始的5行 yy 复制光标所在的整行 5yy 复制从光标处开始的5行 n 显示搜索命令定位…

    Linux 2022-07-03
  • Flink 异步编程模型介绍

    本次我们来实现一个支持百万并发连接数的采集服务器,并且找到异步+ NIO 的编程方式和实时流模型的那些千丝万缕的联系。 一、需求说明 简单的需求功能如下: 数据采集是一个 web …

    Flink 2022-06-19
  • Flink metrics 介绍和应用

    一、Flink metrics简介 Flink 的 metrics 是 Flink 公开的一个度量系统,metrics 也可以暴露给外部系统,通过在 Flink 配置文件 conf…

    Flink 2022-06-19
  • Flink 用户代码如何生成 StreamGraph(下)

    九、一小段源码 上次说到了所有的算子都会转化成 transformation ,并放到一个 List 列表中,那么今天我们开始遍历这个列表,来生成 StreamGraph。 打开这…

    Flink 2022-06-19
  • Flink 源码阅读准备之 – Java8 异步编程

    阅读 Flink 源码前必会的知识 Java8 异步编程 本文大纲速看 一、异步编程 通常来说,程序都是顺序执行,同一时刻只会发生一件事情。如果一个函数依赖于另一个函数的结果,它只…

    Flink 2022-06-19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注