底层数据结构

哈希对象的底层实现可以是ziplist或者hashtable。

ziplist

ziplist中的哈希对象是按照key1,value1,key2,value2这样的顺序存放来存储的。当对象数目不多且内容不大时,这种方式效率是很高的。压缩列表(ziplist)是一组连续内存块组成的顺序的数据结构,压缩列表能够节省空间,压缩列表中使用多个节点来存储数据。
压缩列表是列表键和哈希键底层实现的原理之一,「压缩列表并不是以某种压缩算法进行压缩存储数据,而是它表示一组连续的内存空间的使用,节省空间」,压缩列表的内存结构图如下:

在这里插入图片描述
zlbytes:4个字节的大小,记录压缩列表占用内存的字节数。
zltail:4个字节大小,记录表尾节点距离起始地址的偏移量,用于快速定位到尾节点的地址。
zllen:2个字节的大小,记录压缩列表中的节点数。
entry:表示列表中的每一个节点。
zlend:表示压缩列表的特殊结束符号’0xFF’。

压缩列表中每一个entry节点又有三部分组成,包括:
previous_entry_ength表示前一个节点entry的长度,可用于计算前一个节点的其实地址,因为他们的地址是连续的。
encoding:这里保存的是content的内容类型和长度。
content:content保存的是每一个节点的内容。
在这里插入图片描述

hashtable

hashtable的是由dict这个结构来实现的, dict是一个字典,其中的指针dicht ht[2] 指向了两个哈希表
dicht[0] 是用于真正存放数据,dicht[1]一般在哈希表元素过多进行rehash的时候用于中转数据。
dictht中的table用语真正存放元素了,每个key/value对用一个dictEntry表示,放在dictEntry数组中。
在这里插入图片描述

命令操作

HSET key field value [field value …]

Redis Hset 命令用于为存储在 key 中的哈希表的 field 字段赋值 value 。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段(field)已经存在于哈希表中,旧值将被覆盖。

在这里插入图片描述

HGET key field

Redis HGET 命令用于返回哈希表中指定字段 field 的值。
在这里插入图片描述

HSETNX key field value

Redis HSETNX 命令用于为哈希表中不存在的字段赋值 。
如果字段已经存在于哈希表中,操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令
在这里插入图片描述
在这里插入图片描述

HDEL key field [field …]

删除一个或者多个hash表中的字段
在这里插入图片描述

HEXISTS key field

判断一个哈希表中指定的字段是否存在, 存在返回1,不存在返回0
在这里插入图片描述

HGETALL key

返回存储在 key 中的哈希表中所有的域和值。
在这里插入图片描述

HKEYS key

返回存储在 key 中的哈希表中所有的域
在这里插入图片描述

HVALS key

返回存储在 key 中的哈希表中所有的值
在这里插入图片描述

HLEN key

获取哈希表中字段(fields)的数量, 当key不存在时,返回0
在这里插入图片描述

HMGET key field [field …]

返回哈希表中一个或多个给定字段(field)的值。
如果指定的字段(field)不存在于哈希表或者 key 不存在,那么返回一个 nil 值。
在这里插入图片描述

HMSET key field value [field value …]

同时将多个 field-value (字段-值)对设置到哈希表中。
此命令会覆盖哈希表中已存在的字段。
如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。
Redis 4.0.0起,HMSET 被废弃,请使用 HSET 代替。

在这里插入图片描述

HSTRLEN key field

Redis HSTRLEN 命令返回存储在 key 中的哈希表里, 与给定域 field 相关联的值的字符串长度(string length)。
如果给定的键或者域不存在, 那么命令返回 0 。
在这里插入图片描述

HRANDFIELD key [count [WITHVALUES]]

随机返回一个或者多个存储在 key 中的哈希表里字段的值
在这里插入图片描述

HSCAN key cursor [MATCH pattern] [COUNT count]

Redis HSCAN 命令用于遍历哈希表中的键值对。
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
在这里插入图片描述

HINCRBY key field increment

为哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以为负数,相当于对给定域进行减法操作。
如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误 ERR ERR hash value is not an integer。
本操作的值被限制在 64 位(bit)有符号数字表示之内。

在这里插入图片描述

HINCRBYFLOAT key field increment

为哈希表 key 中的域 field 加上浮点数增量 increment 。
如果哈希表中没有域 field ,那么 INCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。
如果键 key 不存在,那么 INCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。
当以下任意一个条件发生时,返回一个错误:
域 field 的值不是字符串类型(因为 redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型)
域 field 当前的值或给定的增量 increment 不能解释(parse)为双精度浮点数(double precision floating point number)

在这里插入图片描述
应用场景: 储存详情页的数据,实现收藏,点赞,统计浏览量,被加入购物车的功能

参考: https://www.cnblogs.com/sunny-miss/p/13387408.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐