余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

RedisJson,有望替代 Mongodb 和 ES

xiyangw 2023-05-13 15:47 17 浏览 0 评论


RedisJson,有望替代 Mongodb 和 ES


一个提供原生 JSON 功能的 Redis 模块——从GitHub 获取(https://github.com/RedisJSON/RedisJSON) 或在查阅在线文档(https://oss.redis.com/redisjson/)。

JSON 和 Redis 都不需要介绍,相信大家都很清楚他们。前者是现代应用程序交换数据的标准格式,而后者则是用在任何需要高性能数据管理的地方。比较令人震撼的是,这两个东西没法高效的结合在一起使用。(言外之意是,目前用redis存储 json 数据会比较消耗性能开销)。

Redis 又名“数据库的瑞士军刀”、“微服务的超级粘合剂” 等, 为特定任务提供了专门的工具。这里我们需要特别理解一点:Redis 可以开箱即用,也可以通过各种插件来达成我们的目的。开发人员使用这些插件作为抽象数据结构及其伴随操作公开的工具来为问题的最佳解决方案建模。之所以直接用 Redis 存储 Json 会不自然,是因为我们没有使用一个合适的插件。

事实上,尽管 Redis 有许多核心数据结构,但没有一个能符合JSON规范的要求。当然,我们也可以通过使用其他数据类型来解决这个问题:将 Json 序列化存储,或者对 Json 做hash。但是这些变通方案模式施加了限制,使其仅在少数用例中有用,即使这样,体验也会留下非 Redis 风格的回味。它们的笨拙与正常使用 Redis 的简单和优雅形成了鲜明的冲突。

但在去年(2020年) Salvatore Sanfilippo 访问 Tel Aviv 办公室后,这一切都发生了变化,Redis 模块化成为现实。这一点,直接提高了redis的上限。现在模块化可以让任何人做任何事情,在Dvir Volk 的指导下,诞生了 ReJSON。

该模块提供了一种新的数据类型,专为快速高效地操作 JSON 文档而设计。与任何 Redis 数据类型一样,ReJSON 的 value 存储在可以通过专门的命令访问的 key 中。这些命令或由模块公开的 API 旨在为从 JSON 世界来到 Redis 的用户提供直观的体验,反之亦然。考虑这个显示如何设置和获取值的示例:

127.0.0.1:6379> JSON.SET scalar . '"Hello JSON!"'
OK
127.0.0.1:6379> JSON.SET object . '{"foo": "bar", "ans": 42}'
OK
127.0.0.1:6379> JSON.GET object
"{\"foo\":\"bar",\"ans\":42}"
127.0.0.1:6379> JSON.GET object .ans
"42"
127.0.0.1:6379> ^C
~$

像任何表现良好的模块一样,ReJSON 的命令带有前缀。JSON.SET与JSON.GET 这两个方法都期望键的名称作为其第一个参数。在第一行中,我们将key 为 scalar 对应 value(由句点字符:“.”表示)设置为字符串。接下来,使用 JSON 对象(首先读取整个对象)设置另一个key 名为 object,然后输入json 字符串。

这背后的原理是,无论何时调用JSON.SET,该模块都会通过流式词法分析器获取值,该词法分析器解析输入 JSON 并从中构建树形数据结构:



ReJSON 以二进制格式将数据存储在树的节点中,并支持JSONPath的子集,以便于引用子元素。它拥有为每种 JSON 值类型量身定制的原子命令库,包括:JSON.STRAPPEND用于附加字符串;JSON.NUMMULTBY用于乘法;并JSON.ARRTRIM用于修剪阵列 等等。

因为 ReJSON 是作为 Redis 模块实现的,所以您可以将它与任何 Redis 客户端一起使用:a) 支持模块(无 ATM)

b) 允许发送原始命令(大多数是 ATM)

例如,您可以在 Python 代码中通过redis-py使用启用 ReJSON 的 Redis 服务器,如下所示:

import redis
import json
data = {
    'foo': 'bar',
    'ans': 42
}
r = redis.StrictRedis()
r.execute_command('JSON.SET', 'object', '.', json.dumps(data))
reply = json.loads(r.execute_command('JSON.GET', 'object'))

但这只是其中的一半。ReJSON 不仅是一个漂亮的 API——它在性能方面也是一个强大的动力。初始性能基准已经证明,例如:



上图比较了 3.4KB JSON (三层嵌套级别) 在执行的读取和写入操作的速率(操作/秒)和平均延迟,这里将 ReJSON 与字符串存储json的两种变体进行了对比。两种变体都实现为 Redis 服务器端 Lua 脚本,其中 json.lua 变体存储原始序列化 JSON,msgpack.lua 使用 MessagePack 编码。可以看出,如果不取 JSON 元素的值,Get 或者 Set 整个json 字符串,ReJson 的效果不如另外两种使用方法。但是一旦你对 json 中某个元素取值,或者做set 操作,会发现 Rejson 的性能甚至有所提高(内部使用了树索引,所以会更快一些)

以上这些,你今天就可以开始玩 ReJSON 了!

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: