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

 

posted @   ShineLe  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示