redis的value类型之hash详解
HSET key field value [field value …]Redis Hset 命令用于为存储在 key 中的哈希表的 field 字段赋值 value 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段(field)已经存在于哈希表中,旧值将被覆盖。HGET key fieldRedis HGET 命令用于返回哈希表中指定字段 field 的值。HSETNX
底层数据结构
哈希对象的底层实现可以是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)
应用场景: 储存详情页的数据,实现收藏,点赞,统计浏览量,被加入购物车的功能
更多推荐
所有评论(0)