Redis - 存储对象信息是用 Hash 还是 String

日常工作中存储对象信息时,一般有两种做法,一种是用 String存储,另一种是Hash 存储。既然两种数据结构都可以存储结构体信息。到底哪种更加合适呢?

String 和 Hash 占用内存的比较

首先用代码先插入 10000 条数据,然后用可视化工具来看看内存的占用情况。

复制代码
const Redis = require("ioRedis");
const Redis0 = new Redis({port: 6370});
const Redis1 = new Redis({port: 6371});

const user = {
  name: 'name12345',
  age: 16,
  avatar: 'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=256767015,24101428&fm=26&gp=0.jpg',
  phone: '13111111111',
  email: '1111111@11.email',
  lastLogon: '2021-04-28 10:00:00',
}

async function main() {
  for (let i = 0; i < 10000; i++) {
    await Redis0.set(`String:user:${i}`, Json.Stringify(user));
    await Redis1.hmset(`Hash:user:${i}`, user);
  }
}

main().then(process.exit);
复制代码

先看 Redis0:(String)

 再来看看 Redis1:(Hash)

可以看到还是有点差距的,但是差距并不明显。

结论:

适合用 String 存储的情况:

  • 每次需要访问大量的字段
  • 存储的结构具有多层嵌套的时候

适合用 Hash 存储的情况:

  • 在大多数情况中只需要访问少量字段
  • 自己始终知道哪些字段可用,防止使用 mget 时获取不到想要的数据

总结

本文主要介绍了 Redis 存储对象信息是用 Hash 还是 String,建议是大部分情况下使用 String 存储就好,毕竟在存储具有多层嵌套的对象时方便很多,占用的空间也比 Hash 小。当需要存储一个特别大的对象时,而且在大多数情况中只需要访问该对象少量的字段时,可以考虑使用 Hash。

适合用 String 存储的情况:每次需要访问大量的字段存储的结构具有多层嵌套

适合用 Hash 存储的情况:在大多数情况中只需要访问少量字段,自己始终知道哪些字段可用,防止使用 mget 时获取不到想要的数据。

String存数据注重的是整体性,要么一次性更新,要么一次性获取,以读为主

Hash可以把属性隔离开,讲究的是更新操作会比较灵活便利

posted @   李若盛开  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2022-04-27 Git -git入门介绍、常用技巧(合并分支)
2022-04-27 数据结构 - 游戏开发中的帧同步与状态同步
2022-04-27 Golang - 如何读取YAML、JSON、INI等配置文件
点击右上角即可分享
微信分享提示