牛啊!性能碾压ES和Mongo的神器!

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 牛啊!性能碾压ES和Mongo的神器!

前言

redis 官方博客提供了一篇压测报告, 如下图所示:


按照压测报告所述,在隔离写入场景下,RedisJSON 比 MongoDB 快 5.4 倍,比 ElasticSearch 快 200 倍以上。隔离读取场景下,RedisJSON 比 MongoDB 快 12.7 倍,比 ElasticSearch 快 500 倍以上。

接下来,本文将通过实际案例带大家熟悉下这个神器。

RedisJson

RedisJSON 模块为 Redis 提供 JSON 支持。RedisJSON 允许您在 Redis 数据库中存储、更新和检索 JSON 值,类似于任何其他 Redis 数据类型。RedisJSON 还可以与 RediSearch 无缝协作,让您索引和查询 JSON 文档。

主要特点:

  • 完全支持 JSON 标准
  • 用于选择/更新文档中元素的 JSONPath 语法
  • 文档以二进制数据形式存储在树结构中,允许快速访问子元素
  • 支持对类型为 JSON 值的原子化操作

安装

  • 浏览器打开下载地址, 选择版本并下载。
  • 编译

确保服务器上已安装了如下依赖包:

sudo apt install build-essential llvm cmake libclang1 libclang-dev cargo

加压下载的源码,执行编译

make

或者

cargo build --release

编译成功,在 target/release 下有 librejson 模块文件。

  • 启动加载

注意:Redis 版本需在 v6.0 版本以上。

建议在启动期间通过向 redis.conf 文件添加以下内容来加载 Redis 加载模块:

loadmodule /path/to/module/target/release/librejson.so
`` `
或者命令行启动方式:
```cmd
redis-server --loadmodule {path}/target/release/librejson.so

基本使用

要了解如何使用 RedisJSON,最好从 Redis CLI 开始。

首先以交互模式启动 redis-cli, 并连接到 redis 服务器。

JSON.SET 命令用于给一个 key 设置一个 JSON 数据。JSON.SET 接受所有 JSON 值类型。本例创建了一个 JSON 字符串:

JSON.SET myKey $'{"user":{"name":"li","gender":"male"}}'
"OK"
JSON.GET myKey $
"{\"user\":{\"name\":\"li\",\"gender\":\"male\"}}"

指的是在哪个路径下添加。上述例子说明是在 下添加的,此处表述是根节点,如果想在 user 路径下再添加 json,可以这么写。

JSON.SET myKey $.user.job '{"type":"student"}'

下面是一些其他字符串操作。JSON.STRLEN 会告诉您字符串的长度,您可以使用 JSON.STRAPPEND 将另一个字符串附加到该字符串。

JSON.STRLEN myKey $
1) "38"

数字可以递增和乘以:

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.DEL 命令将删除使用 path 参数指定的任何 JSON 值。

您可以使用 RedisJSON 命令的专用子集操作数组:

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)

JSON 对象也有自己的命令:

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 响应,请在原始输出模式下运行 redis-cli,并在 JSON 中包含格式关键字(如缩进、换行符和空格)。

redis-cli --raw
JSON.GET obj INDENT "\t" NEWLINE "\n" SPACE " " $
[
    {
        "name": "Leonard Cohen",
        "lastSeen": 1478476800,
        "loggedOut": true
    }
]

更详细的命令说明可以参考官方文档(https://redis.io/commands/?group=json)。

Java 操作 RedisJson

支持 RedisJson 命令的客户端有 Jedis、JRedisJSON、redis-modules-java 以及 redis-om-spring,一般采用 Jedis 进行操作。

maven

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.0.0</version>
</dependency>

操作 json 对象

public class RedisJsonTest {
    @Test
    public void jsonTest(){
        // 获取连接
        HostAndPort config = new HostAndPort("127.0.0.1", 6379);
        PooledConnectionProvider provider = new PooledConnectionProvider(config);
        UnifiedJedis client = new UnifiedJedis(provider);
        IntStream.range(1,10).boxed().forEach(i -> {
            Apple apple = new Apple("a" + i, i);
            // 添加json
            client.jsonSet("apple:" + i, redis.clients.jedis.json.Path.ROOT_PATH,apple);
        });
        // 删除索引
        client.ftDropIndex("apple-index");
        // 创建索引
        // 创建要索引的字段
        Schema schema = new Schema().
                addTextField("$.name",1.0).
                addTextField("$.size", 1.0);
        // 只索引key以apple:开头的
        IndexDefinition rule = new IndexDefinition(IndexDefinition.Type.JSON).setPrefixes("apple:");
        // 创建索引
        client.ftCreate("apple-index",IndexOptions.defaultOptions().setDefinition(rule),schema);
        // 查询字符串需要转义
        Query q = new Query("@\\$\\.name:a*").
                highlightFields(new Query.HighlightTags("<b>","</b>"),"$.name").
                returnFields("$.name","$.size").limit(1,10);
        SearchResult searchResult = client.ftSearch("apple-index", q);
        List<Document> documents = searchResult.getDocuments();
        for(Document document : documents){
            Console.log(JSONUtil.toJsonStr(document));
        }
    }
}

小结

Redis JSON 是为了能够操作 JSON 数据而存在的。命令的使用与普通 Redis 命令的差异之处在于 Path 的概念。为了更好的操作 JSON 数据,Path 是不可避免的。有需要可以学习一下 JSONPath 的使用。关于 JSONPath 可以参考JsonPath(https://goessner.net/articles/JsonPath/)。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 关系型数据库 MySQL
《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)
82 2
|
6月前
|
机器学习/深度学习 搜索推荐 关系型数据库
号称Elasticsearch 10倍性能搜索引擎到底有多强悍
号称Elasticsearch 10倍性能搜索引擎到底有多强悍
230 0
|
6月前
|
NoSQL 关系型数据库 MySQL
《MySQL 简易速速上手小册》第10章:未来趋势和进阶资源(2024 最新版)
《MySQL 简易速速上手小册》第10章:未来趋势和进阶资源(2024 最新版)
55 0
|
监控 NoSQL 数据可视化
Redis 官方可视化工具,功能真心强大
一、RedisInsight 简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具,它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用 CLI 和连接的 Redis 进行交互(RedisInsight 内置对 Redis 模块支持): https://docs.redis.com/latest/ri/ RedisInsight 提供的功能: 唯一支持 Redis Cluster 的 GUI 工具; 可以基于 Browser 的界面来进行搜索键、查看和编辑数据; 支持基于 SSL/TLS 的连接,同时还可以在界面上进行内存分
|
3月前
|
缓存 前端开发 Java
"揭秘!SpringBoot携手Nginx,性能飙升秘籍大公开:轻松掌握配置优化,让你的应用快如闪电!"
【8月更文挑战第11天】随着微服务架构的发展,SpringBoot成为构建RESTful API的首选,Nginx则作为高性能的反向代理服务器提升应用性能。本文将探讨两者如何协同工作,包括Nginx的负载均衡策略、静态资源缓存及数据压缩配置;同时讨论SpringBoot的线程池优化、缓存策略及性能监控。通过这些方法,帮助开发者显著提高系统的整体性能和可用性。
154 1
|
6月前
|
XML 存储 测试技术
性能工具之Taurus进阶场景使用
【5月更文挑战第9天】性能工具之Taurus进阶场景使用
147 3
性能工具之Taurus进阶场景使用
|
6月前
|
监控 Java 测试技术
性能工具之 nGrinder 入门安装及使用
【5月更文挑战第1天】性能工具之 nGrinder 入门安装及使用
77 5
性能工具之 nGrinder 入门安装及使用
|
6月前
|
编解码 监控 NoSQL
告别复杂操作:体验Tiny RDM,下一代Redis GUI神器登场!
告别复杂操作:体验Tiny RDM,下一代Redis GUI神器登场!
730 0
|
6月前
|
SQL 关系型数据库 MySQL
调优攻略:10个提高MySQL性能的实用技巧
调优攻略:10个提高MySQL性能的实用技巧
1205 0
调优攻略:10个提高MySQL性能的实用技巧
|
存储 Java 关系型数据库
【Elasticsearch 技术分享】—— 十张图带大家看懂 ES 原理 !明白为什么说:ES 是准实时的!
说到 Elasticsearch ,其中最明显的一个特点就是 near real-time 准实时 —— 当文档存储在Elasticsearch中时,将在1秒内以几乎实时的方式对其进行索引和完全搜索。那为什么说 ES 是准实时的呢?
1247 0