RedisJson特性让我放弃了MongoDB,也让我放弃了Hash,我就问你们香不香?

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: RedisJson特性让我放弃了MongoDB,也让我放弃了Hash,我就问你们香不香?

640.png

说说RedisJson 重磅特性


[公众号:堆栈future]

干货:redis支持json文档存储了,你可以放弃mongodb了?


1. mongodb介绍


MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据NoSQL存储解决方案。


MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。


MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。

640.png


MongoDB在高负载的情况下,可以添加更多的节点,以此来保证服务器性能。


既然MongoDB是以类JSON文档存储,那么更新文档,删除文档或者获取文档等都是在操作类JSON。我们可以看下MongoDB插入,以下事例摘自网络哈:


>db.col.insert({title: 'MongoDB', 
    description: 'MongoDB是一个Nosql数据库',
    by: 'baidu',
    tags: ['mongodb', 'database', 'NoSQL'],
})


查询:

> db.col.find({"by":"baidu"}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "description" : "MongoDB是一个Nosql数据库",
        "by" : "baidu",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ]
}


这个类JSON文档其实它的数据结构和JSON基本一样,所有存储在集合中的数据都是BSON格式。


BSON是一种类似JSON的二进制形式的存储格式,是Binary JSON的简称。


2. RedisJson


RedisJSON - Redis的JSON数据类型


你没有看错,就是Redis最新出的一个特性:支持JSON存储和获取了。这个功能我觉得是王炸,对于我这种人来说存储json数据有很多好处,但是你可能会反对,redis已经有hash数据类型了,多一个json类型难免有点鸡肋,毕竟这么多年了,没有json类型大家也照样过来了,那么它到底解决什么问题呢?


别急,请往下看。


RedisJSON是一个Redis模块,实现了ECMA-404 JSON数据交换标准作为本地数据类型。它允许根据Redis键存储,更新和获取JSON值(文档)。


主要特性:

  • 完全支持JSON标准
  • 用类似JSONPath的语法在文档中选择元素
  • 文档以树状结构的二进制数据形式存储,可以快速访问子元素
  • 对于所有JSON值类型都定义了原子操作


RedisJSON是在Redis用<3开发的。源代码可以从https://github.com/RedisJSON/RedisJSON获得。


<3:是什么意思呢?哈哈哈哈哈哈,知道这个的挺厉害的,不知道的下去查下哦。


接下来我们给大家演示下:


  1. 使用Docker启动RedisJSON使用Docker在Windows、MacOS或Linux上运行以下命令:
docker run -p 6379:6379 --name redis-redisjson redislabs/rejson:latest


打印日志如下:

640.png


  1. 使用RedisJSON用redis-cli可以直接进入:
//插入json数据 key是doc value是json
➜  ~ redis-cli
127.0.0.1:6379> JSON.SET doc . '{"name": "jamlee", "age": 18}'
OK
//获取json里面的field
127.0.0.1:6379> JSON.GET doc .name
"\"jamlee\""
127.0.0.1:6379> JSON.GET doc .age
"18"
//把我的年龄加1
127.0.0.1:6379> JSON.NUMINCRBY doc .age 1
"19"
//我想在json中在插入一个field属性:
127.0.0.1:6379> JSON.SET doc .array '[1,2,3]'
OK
127.0.0.1:6379> JSON.GET doc
"{\"name\":\"jamlee\",\"age\":19,\"array\":[1,2,3]}"
//给json中的array数组增加三个元素
127.0.0.1:6379> JSON.ARRAPPEND doc .array true null false
(integer) 6
//从json的array中pop一个元素出来
127.0.0.1:6379> JSON.ARRPOP doc .array
"false"
//查看json的array
127.0.0.1:6379> JSON.GET doc .array
"[1,2,3,true,null]"
//查看type
127.0.0.1:6379> JSON.TYPE doc
"object"


再给大家展示一个比较厉害的:

//创建json 不过里面是list
127.0.0.1:6379> JSON.SET lst . '[ true, { "answer": 42 }, null ]'
OK
//获取第二个元素的answer属性
127.0.0.1:6379> JSON.GET lst [1].answer
"42"


到这里我就不一一列举了,支持的操作非常多而且灵活,你就说用它来存储json香不香,我觉得太香了。


那大家可能会说你是docker启动的,我如果想用它但不想用docker启动怎么办?好说啊,上干货:


  1. 先从Redis下载中心下载预编译版本 https://redis.com/download-center/modules/
  2. 接下来,使用RedisJSON运行Redis
$ redis-server --loadmodule /path/to/module/rejson.so


3. 小结


既然redis支持json了,你们还会用MongoDB吗?我相信大家通过上面的操作演示就可以看出来了,你们心里也一定有答案了。


而且通过上面演示,我相信你也立马看出来RedisJson和Hash的区别了,有时候hash做不了的,RedisJson非常轻松的都可以搞定。


参考:https://oss.redis.com/redisjson/#redis-cloud

相关实践学习
基于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
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
MySQL中的 where 1=1会不会影响性能?看完官方文档就悟了!
本文探讨了在Mybatis中使用`where 1=1`进行动态SQL拼接是否会影响性能。通过MySQL官方资料和实际测试表明,`where 1=1`在MySQL 5.7及以上版本中会被优化器优化,因此对性能影响不大。文中详细对比了`where 1=1`与`&lt;where&gt;`标签的使用方法,并建议根据MySQL版本和团队需求选择合适的方式。最后,推荐查找官方资料以确保技术路线正确。
41 4
|
3月前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
410 4
|
3月前
|
存储 关系型数据库 MySQL
"揭秘!MySQL为何独宠B+树?跳表再牛,也敌不过这性能王者的N重诱惑!"
【8月更文挑战第11天】MySQL作为主流关系型数据库,优选B+树而非跳表作为索引结构,基于其对范围查询的支持、低磁盘I/O开销及事务处理能力。B+树叶节点构成有序链表,利于范围查询;较矮的树形结构减少了磁盘访问次数;支持多版本并发控制,保障事务ACID特性。而跳表在线性扫描范围查询时效率低,难以高效实现事务管理,且额外指针增加空间消耗。示例代码展示了B+树节点分裂过程,突显其内部机制。综上,B+树为MySQL提供了高性能、可靠的数据存储与检索能力。
131 4
|
3月前
|
缓存 关系型数据库 MySQL
MySQL调优秘籍曝光!从索引到事务,全方位解锁高可用秘诀,让你的数据库性能飞起来!
【8月更文挑战第6天】MySQL是顶级关系型数据库之一,其性能直接影响应用的高可用性与用户体验。本文聚焦MySQL的高性能调优,从索引设计到事务管理,逐一解析。介绍如何构建高效索引,如联合索引`CREATE INDEX idx_order_customer ON orders(order_id, customer_id);`,以及索引覆盖查询等技术。
79 0
|
消息中间件 监控 NoSQL
[大环境不好]那是因为你没有掌握这项redis技术二!
[大环境不好]那是因为你没有掌握这项redis技术二!
69 0
|
关系型数据库 MySQL Java
【五一创作】基于mysql关系型实现分布式锁(三)
【五一创作】基于mysql关系型实现分布式锁(三)
|
Cloud Native 安全 NoSQL
​【五一创作】基于mysql关系型实现分布式锁(一)
​【五一创作】基于mysql关系型实现分布式锁
|
安全 关系型数据库 MySQL
【五一创作】基于mysql关系型实现分布式锁(四)
【五一创作】基于mysql关系型实现分布式锁(四)
|
负载均衡 关系型数据库 MySQL
【五一创作】基于mysql关系型实现分布式锁(二)
【五一创作】基于mysql关系型实现分布式锁(二)
|
SQL 缓存 关系型数据库
故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
故障案例:MySQL唯一索引有重复值,官方却说This is not a bug
216 0