最近在排查一个线上问题,发现redis使用了一个hash key里面存储了600w的filed,为啥这么多就是因为他把一个结构体中的字段分成了多个filed存储。下面来看看到底应该怎么设计比较合理。

一、问题

  1. 一种使用简单的字符串键和值。 键:用户,值:payload(整个JSON,可以为100-200 KB)
SET user:1 payload
  1. 使用哈希
HSET user:1 username "someone" HSET user:1 location "NY" HSET user:1 bio "STRING WITH OVER 100 lines"

请记住,如果使用哈希,则值长度是不可预测的。它们并不都是短的,例如上面的bio示例。哪个内存效率更高?使用字符串键和值,还是使用哈希?

二、讨论

1、将整个对象作为JSON编码的字符串存储在单个键中,并使用一组(或列表,如果合适的话)跟踪所有对象。例如:

INCR id:usersSET user:{id} '{"name":"Fred","age":25}'SADD users {id}

一般来说,在大多数情况下,这可能是最好的方法。如果对象中有很多字段,一个对象不会与其他对象嵌套,并且您一次只能访问一小部分字段,那么选择选项1可能不是很好。

优点:被认为是“良好实践”。每个对象都是具有用户信息的Redis key。JSON解析速度很快,尤其是当您需要一次访问此Object的多个字段时。

缺点:当您只需要访问一个字段时,速度较慢。

2、将每个对象的属性存储在Redis哈希中。

INCR id:usersHMSET user:{id} name "Fred" age 25SADD users {id}

优点:被认为是“良好实践”。每个对象都是具有用户信息的Redis key。无需解析JSON字符串。

缺点:当您需要访问对象中的所有/大多数字段时,速度可能会变慢。同样,嵌套对象(对象内的对象)也无法轻松存储。

3、将每个对象作为JSON字符串存储在Redis哈希中。

INCR id:usersHMSET users {id} '{"name":"Fred","age":25}'

这使您可以进行合并,并且仅使用两个键,而不是很多键。明显的缺点是您不能在每个用户对象上设置TTL(以及其他内容),因为它只是Redis哈希中的一个字段,而不是具有用户信息的Redis key。

优点:JSON解析速度很快,尤其是当您需要一次访问此Object的多个字段时。减少主键名称空间的“污染”。

缺点:当您有很多对象时,内存使用量与#1差不多。当您只需要访问单个字段时,速度比#2慢。可能不被视为“良好做法”。

4 、将每个对象的每个属性存储在专用key中。

INCR id:usersSET user:{id}:name "Fred"SET user:{id}:age 25SADD users {id}

根据上面的解释,几乎永远不会选择此方案(除非Object的属性需要具有特定的TTL或其他内容)。

优点:对象属性是具有用户信息的Redis key,对于您的应用程序来说可能并不算过大。

缺点:速度慢,占用更多内存,并且不被视为“最佳实践”。主键名称空间受到很多污染。

三、总结

方案4通常不是首选。方案1和2非常相似,而且都很常见。我更喜欢选项1(通常来说),因为它允许您存储更复杂的对象(具有多层嵌套等)。当您真正关心不污染主键名称空间时,可以使用方案3。

java解析多层嵌套json字符串_Redis使用字符串和hash存储JSON,哪个更高效?相关推荐

  1. java解析多层嵌套json字符串

    java解析多层嵌套json字符串 java分别解析下面两个json字符串 package jansonDemo;import com.alibaba.fastjson.JSON; import co ...

  2. python 处理json多层嵌套_python解析多层嵌套json

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 这样多层json结构已完成. 补充拓展:python 读取多层嵌套的json数据 ...

  3. python解析多层嵌套json_Python爬虫解析多个嵌套JSON,多级,json

    Python爬虫解析多级嵌套json 最近刚接触Python爬虫,正好最近肺炎在全国蔓延,所以准备从网站爬取肺炎实时数据,并解析自己想要的数据.获取json数据网址为 https://m.look.3 ...

  4. java解析多层json,手把手教你怎么解析多层嵌套的JSON数据(使用JSONModel)

    2018.11.14日更新 前言 没想到这篇简单介绍JSONModel的文章竟然已经破了两千阅读量,一跃成为我阅读量最高的文章,作为iOS小白的我感到万分惶恐 在这一个月的项目中,总是用到JSONMo ...

  5. java解析多层json数据

    当出现多层json数据时(如下图) 需要得到lives–>0–>weather的数据(即"阴") 步骤如下: 1.先获取全部json数据,用StringBuilder来 ...

  6. java解析string_java读取文件内容为string字符串的方法

    直接就把项目中的方法贴出来吧 /** * 读出城市列表文件 */ private String readCityFile() { File file02 = new File(path_xinfu, ...

  7. jpa 多层嵌套一对多_JPA一对多、多对多json序列化死循环问题解决

    Task import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; impor ...

  8. JAVA Socket实现实时接收TCP消息,让你的服务端通信更高效!

    本文主要介绍如何利用socket实现实时接收服务端发送的TCP消息. 目录 一.需要掌握 二.程序源码 三.运行演示 一.需要掌握 网络调试助手下载:https://www.aliyundrive.c ...

  9. android 生成泛型对象,java android解析多层含有泛型对象的json数据获取不到泛型类型解析失败解决办法...

    ####问题描述 * java 解析多层含有泛型对象的json数据获取不到泛型类型 * 如果将泛型改成实际的类型就能正常解析 * 如果不改成实际的类型泛型数据被解析成com.google.gson.i ...

  10. oracle中多层嵌套命名,一种多层嵌套的json格式数据的命名解析方法

    一种多层嵌套的json格式数据的命名解析方法 [专利摘要]一种n层嵌套的json格式数据的命名解析方法,包括以下步骤:首先,以n层嵌套的json格式数据为基础建立数据源:然后,以键值对为最小单元由外而 ...

最新文章

  1. 长篇自动驾驶技术综述论文(上)
  2. Python tips(
  3. git checkout 对工作目录的影响 —— Git 学习笔记 21
  4. c++Insertion Sort插入排序的实现算法(附完整源码)
  5. JavaScript浮点运算0.2+0.1 !== 0.3
  6. Order By 排序条件中带参数的写法(Oracle数据库、MyBatis)
  7. 新人报道,写的东西还请大神们多指导!也希望能让和我一样的同事少走弯路。...
  8. MySQL Connector/Net 5.20安装后无法在VS2008中正常使用的问题
  9. 【Python】Python运算符
  10. 漫谈程序员系列:程序员到底是什么角色
  11. appium之定位方式
  12. 最小径集的算法_【ZZ】最小割集Stoer-Wagner算法
  13. ssrf dict MySQL_SSRF之利用dict和gopher吊打Redis
  14. matlab工作区中的参数清除,【单选题】清空MATLAB工作区中所有变量的命令是_____。 (7.0分) A. clc B. c...
  15. xgboost算法_XGBoost算法背后的数学:尽可能简单地解释XGBoost算法背后的数学机制...
  16. DayDayUp:2019.01.24新东方年会—俞敏洪点赞并奖励吐槽神曲《释放自我》12万元!—附全歌词(牛逼的人在哪里都不会彷徨)
  17. vue+echarts+自适应 实现可视化大屏展示效果
  18. 【ybt金牌导航2-3-3】【luogu P3975】K小子串 / 弦论
  19. NeXT,NEXTSTEP,OPENSTEP,Cocoa,Cocoa Touch,GNUstep,xcode
  20. python如何生成指定均值向量和协方差矩阵的多维正态分布数据

热门文章

  1. 中国唯一入选 Forrester 领导者象限,阿里云 Serverless 产品能力全球第一
  2. 【CVRP】基于matlab蚁群算法求解带容量的车辆路径规划问题【含Matlab源码 1039期】
  3. 【数字信号处理】基于matlab GUI正选信号时域+频域分析【含Matlab源码 887期】
  4. 【路径规划】基于matlab GUI改进的DWA算法机器人静态避障路径规划【含Matlab源码 678期】
  5. 【水果识别】基于matlab GUI自助水果超市【含Matlab源码 594期】
  6. python unpack_Python使用struct处理二进制(pack和unpack用法)
  7. pip:你真的熟悉怎么用了吗?
  8. 文件大小超过配置限制(2560000),代码洞察功能不可用怎么办?
  9. python实现深度优先搜索_python 递归深度优先搜索与广度优先搜索算法模拟实现...
  10. 无线服务器软件,无线局域网AAA服务器的软件设计与实现