redis:hash
1、前言
字典数据,和python中的dict一个数据样式:
虽然写法是这样,但是在存储上,并不是把{}当做一个整体,而是hash内部的每个K-V都单独存储,这时候称为Field-Value对(简写为f-v)更合适,因为一个V真正对应的是{...}。
内部编码
hash的内部编码有两种:
1)ziplist(压缩列表):
使用条件
- f-v对的个数<hash-max-ziplist-entries(默认512);
- v<hash-max-ziplist-value(默认64B)
这种条件下,Redis会用ziplist作为hash的内部表现,ziplist使用更紧凑的结构实现多个元素的连续存储,因此在节省内存方面比hashtable更好。
2)hashtable(哈希表)
当hash类型没法满足ziplist的条件时,Redis会用hashtable作为hash的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。
下面展示哈希类型内部编码的变化情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #1、field个数比较少,没有大的value,内部编码为ziplist 127.0.0.1:6379> hmset hashkey f1 v1 f2 v2 OK 127.0.0.1:6379> object encoding hashkey "ziplist" #2、当value>64B,内部编码变为hashtable 127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 byte...忽略..." OK 127.0.0.1:6379> object encoding hashkey "hashtable" #3、当f-v对个数>512,内部编码变为hashtable 127.0.0.1:6379> hmset hashkey f1 v1 f2 v2 f3 v3 ...忽略... f513 v513 OK 127.0.0.1:6379> object encoding hashkey "hashtable" |
2、命令(不区分大小写)
在Hash中,K为{...}的Key,V是{...}的整体,{...}中的键值对写为FIELD-VALUE
命令 |
用法 |
说明 |
hlen | hlen K | K对应的V的大小(F个数) |
hstrlen | hlen K F | K中F对应的V字符串长度 |
hset | hset K F V | 往K中添加F-V对,如果F已存在则覆盖原V |
hget | hget K F | 取出某个K对应的V |
hmset | hmset K F1 V1 F2 V2 .... | 批量设置K中的F-V对 |
hmget | hmget K F1 F2 F3 | 批量从K中取多个F对应的V |
hdel | hdel K F | 删除K中某个F-V |
hgetall | hgetall K | 打印K中全部的F-V |
hkeys | hkeys K | 打印K中全部的F |
hvals | hvals K | 打印K中全部的V |
hexists | hexists K F | K中是否存在F |
hincrby | hincrby K F n | K中F对应的V(整型)自增n |
hincrbyfloat | hincrbyfloat K F n | K中F对应的V(浮点型)自增n |
3、具体写法
1)hset:设置一个hash对
用法:hset K f v
说明:往K中存入一个f-v
返回值:
成功,1
失败,0
补充:
-
hsetnx:设置某个f-v过期的时间(不是K)
例子:
1 2 | hset K name tom 1 |
2)hget:获取一个f的v
用法:hget K f
返回值:
成功,f对应的v
失败,nil
例子:
1 2 3 4 5 6 | 127.0.0.1:6379> hget K name "tom" 127.0.0.1:6379> hget K name (nil) 127.0.0.1:6379> hget K age (nil) |
3)hdel:删除f
用法:hdel K f [f2 f3...]
返回值:
成功删除的f个数
例子:
1 2 3 4 | 127.0.0.1:6379> hdel K name (integer) 1 127.0.0.1:6379> hdel K age (integer) 0 |
4)hlen:计算f个数
用法:hlen K
例子:
1 2 3 4 5 6 7 8 | 127.0.0.1:6379> hset K name tom (integer) 1 127.0.0.1:6379> hset K age 23 (integer) 1 127.0.0.1:6379> hset K tianjin (integer) 1 127.0.0.1:6379> hlen K (integer) 3 |
5)hmget、hmset:批量设置f-v
用法:
-
hmget K f1 [f2 f3...]
-
hmset K f v [f2 v2 ...]
说明:
- hmget需要写明一个K和多个f
- hmset需要写明K和多个f-v对
- 如果hmget多个值时某个值不存在,会在该值处显示nil
例子:
1 2 3 4 5 | 127.0.0.1:6379> hmset K name mike age 12 city tianjin OK 127.0.0.1:6379> hmget K name city 1) "mike" 2) "tianjin" |
6)hexists:f是否存在
用法:hexists K f
例子:
1 2 | 127.0.0.1:6379> hexists K name (integer) 1 |
7)hkeys:获取所有f
用法:hkeys K
说明:
虽然写法是hkeys,但是获取的却是K全部的f
例子:
1 2 3 4 | 127.0.0.1:6379> hkeys K 1) "name" 2) "age" 3) "city" |
8)hvals:获取所有v
用法:hvals K
例子:
1 2 3 4 | 127.0.0.1:6379> hvals K 1) "mike" 2) "12" 3) "tianjin" |
9)hgetall:获取所有的f-v
用法:hgetall K
说明:
- 再用hgetall时,如果f太多,可能会阻塞Redis,大多数情况下只需要获取部分f,这时候用hmget就行。
- 如果一定要获取全部f-v,可以用hscan命令,它会以渐进式遍历hash类型。
- 输出一行F,再输出一行它对应的V(因此返回结果是哈希集大小的两倍)
例子:
1 2 3 4 5 6 7 | 127.0.0.1:6379> hgetall K 1) "name" 2) "mike" 3) "age" 4) "12" 5) "city" 6) "tianjin" |
10)自增自减
用法:
-
hincrby K f
-
hincybyfloat K f
说明:
用法和incryby、incrbyfloat一样,只是作用域是f
11)hstrlen:计算v的字符串长度
用法:hstrlen K f
hset、hget:存取F-V
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性