2.6哈希
hash
特点 重要api hash vs string
哈希键值结构
key field value user:1:info
常用命令
命令
说明
时间复杂度
hget key field
获取key下field的value
O(1)
hset key field value
设置key下field的value
O(1)
hdel key field
删除key下field的value
O(1)
示例
127.0.0.1:6379> HSET user:1:info age 23
(integer) 1
127.0.0.1:6379> HGET user:1:info age
"23"
127.0.0.1:6379> HSET user:1:info name ronaldo
(integer) 1
127.0.0.1:6379> HGETALL user:1:info
1) "age"
2) "23"
3) "name"
4) "ronaldo"
127.0.0.1:6379> HDEL user:1:info age
(integer) 1
127.0.0.1:6379> HGETALL user:1:info
1) "name"
2) "ronaldo"
批量操作
命令
说明
时间复杂度
hmget key field1 field2 ...fieldN
批量获取key下多个field的value
O(n)
hmset key field1 value1 field2 value2 ...fieldN valueN
批量设置key下多个field value
O(n)
示例
127.0.0.1:6379> HMSET user:2:info age 30 name kaka page 50
OK
127.0.0.1:6379> HLEN user:2:info
(integer) 3
127.0.0.1:6379> HGETALL user:2:info
1) "age"
2) "30"
3) "name"
4) "kaka"
5) "page"
6) "50"
127.0.0.1:6379> HMGET user:2:info age name
1) "30"
2) "kaka"
获取操作
命令
说明
时间复杂度
hgetall key
返回hash key 对应所有的field和value
O(n)
hvals key
返回hash key 对应的所有的field的value
O(n)
hkeys key
返回hash key对应所有field
O(n)
示例
127.0.0.1:6379> HGETALL user:2:info
1) "age"
2) "30"
3) "name"
4) "kaka"
5) "page"
6) "50"
127.0.0.1:6379> HKEYS user:2:info
1) "age"
2) "name"
3) "page"
127.0.0.1:6379> HVALS user:2:info
1) "30"
2) "kaka"
3) "50"
提示:很多场景下,你并不需要获取key下所有的field,所以不建议使用hgetall。推荐使用hmget
其他操作
命令
说明
时间复杂度
hexists key field
判断hash key 是否存在field
O (1)
hlen key
获取hash key field 的数量
O(1)
示例
127.0.0.1:6379> HGETALL user:1:info
1) "name"
2) "ronaldo"
3) "age"
4) "23"
127.0.0.1:6379> HEXISTS user:1:info name
(integer) 1
127.0.0.1:6379> HEXISTS user:1:info name2
(integer) 0
127.0.0.1:6379> HLEN user:1:info
(integer) 2
命令
说明
时间复杂度
hsetnx key field value
设置key下field的value(如field已经存在,则失败)
O(1)
hincrby key field intCounter
key下field的value自增intCounter
O(1)
hincrbyfloat key field floatCounter
key下field的value自增floatCounter
O(1)
记录网站每个用户个人主页的访问量
hincrby user:1:info pageview count
hash vs string
使用redis存储用户信息的三种方案
使用String实现-V1
key value(serilization:json,xml,protobuf) user:1 { "id":1, "name":"ronaldo", "age":40, "pageView":50000 }
使用String实现-v2
key value user:1:name world user:1:age 40 user:1:pageView 500000
使用hash实现
key field value user:1:info name ronaldo age 40 pageView 500000
方案对比
方案
优点
缺点
string v1
编程简单;可以节约内存
序列化开销;设置属性要操作整个数据
string v2
直观,可以部分更新
占用内存较大,key较为分散
hash
直观,节省空间,可以部分更新
编程稍微复杂,ttl不好控制
Last updated
Was this helpful?