首页 > 数据库 >Redis - 存储对象信息是用 Hash 还是 String

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

时间:2023-04-27 13:11:16浏览次数:32  
标签:存储 const String Redis user Hash

日常工作中存储对象信息时,一般有两种做法,一种是用 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: '[email protected]',
  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可以把属性隔离开,他讲究的是更新操作会比较灵活一些。更新操作会遍历一些。

标签:存储,const,String,Redis,user,Hash
From: https://www.cnblogs.com/beatleC/p/17358633.html

相关文章

  • Redis——cluster集群原理
    摘要在redis3.0之前,redis使用的哨兵架构,它借助sentinel工具来监控master节点的状态;如果master节点异常,则会做主从切换,将一台slave作为master。当master挂掉的时候,sentinel会选举出来一个master,选举的时候是没有办法去访问Redis的,会存在访问瞬断的情况;若是在电商网站大......
  • redis-5.0.5离线安装方式
    官方网址https://redis.io/github:https://github.com/antirez/redis一、安装下载redis-5.0.51、官网下载redis-5.0.5.tar.gz2、解压编译安装tar-xvfredis-5.0.5.tar.gzcdredis-5.0.5makePREFIX=/usr/local/redisinstall3、启动redis①直接启动(不推荐,会进入客户端)c......
  • mac 上安装redis
    苹果电脑可以通过Homebrew来安装Redis。请按照以下步骤进行操作:1.打开Terminal(终端)应用程序2.输入以下命令以安装Homebrew:```/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install.sh)"```3.输入以下命令以更新Homebrew,并检查是......
  • StringBuilder、StringBuffer和String的区别
    在Java开发中,字符串(String)是一种非常基础和重要的数据类型,同时也是使用最广泛的数据类型之一。然而,在字符串处理和操作过程中,我们往往需要经常创建、添加、删除和修改字符串对象,这些操作会产生一些性能上的问题,影响程序的运行效率。针对这些问题,Java提供了两种可变字符串类:String......
  • vscode调试redis源码
    ###########众所周知,redis是C语言写的,代码整洁优雅,可读性强 准备工作centos上    makeCFLAGS="-g-O0"              ##########......
  • Redis内存淘汰策略
    Redis内存淘汰策略是指Redis用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据 全局的键空间选择性移除noeviction:当内存不足以容纳新写入数据时,新写入操作会报错allkeys-lru:当内存不足以容纳新写入数据时,在键空间中移除最近最少使用的keyallkeys-random:当内......
  • [ABC213E] Stronger Takahashi
    2023-01-17题目传送门翻译难度&重要性(1~10):4题目来源AtCoder题目算法bfs解题思路首先,这道题的问题是从家到鱼市摧毁障碍物的最少次数。我们很容易想到用广搜的方法来做。因为\(2\leH,W\le500\),数据很小,理论上我们可以对于每个障碍物都进行一次爆破。虽然爆破的范......
  • Redis部署与配置
    一、下载官网地址:https://redis.io/download/ 二、安装 三、配置——改端口,设置密码打开目录“C:\ProgramFiles\Redis”搜索“port”,更换端口搜索“requirepass”,设置密码重启服务 四、使用使用redis-studio连接redis Done. ......
  • MSSQL2K - SQL Injector - Query String Parameter Attack结合netcat获得反向cmdshell
    fasttrack操作:root@bt:~#cd/pentest/exploits/fasttrack/root@bt:/pentest/exploits/fasttrack#./fast-track.py-i******************************************************Performingdependencychecks...******************************************************......
  • MSSQL2K - SQL Injector - Query String Parameter Attack获得反向cmdshell
    上次没有成功获得cmdshell,因为fasttrack没有这方面的代码,这次编写了server.py。importsocketHOST=''PORT=4444s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind((HOST,PORT))s.listen(1)conn,addr=s.accept()cmd="\n"try:whileTrue:......