Redis 系列 - 存储篇 hash 主要操作函数小结
hash 是一些列 key value(field value)的映射表. 常常用其存储一些对象实例. 相对于把一个对象的各个字段存储为 string, 存储为 hash 会占用更少的内存. 为什么会更省内存呢? 需要搞清楚两个配置 (hash-max-zipmap-entries 和 hash-max-zipmap-value) 的含义, 配置的详细介绍, 我打算放在最后的配置优化环节讲.
1)新增
a)hset
语法: hset key field value
解释: 设置 hash 表 key 中的 field 的值. 如果 hash 表不存在, 则创建, 并执行设置 field 的值, 如果 hash 表存在, 值 field 的值覆盖或新增
- [root@localhost ~]# Redis-cli
- Redis 127.0.0.1:6379> hset user.1 name lisi #设置 key user.1 name 域 的值
- (integer) 1
- Redis 127.0.0.1:6379> hset user.1 age 45 #设置 age 域
- (integer) 1
- Redis 127.0.0.1:6379> hset user.1 tech lisi
- (integer) 1
- b)hmset
语法: hash key field value[key value]
解释: 批量设置 hash 表 key 的域
- Redis 127.0.0.1:6379> hmset user.2 name niuer age 34 #同时设置 name 和 age 域
- OK
- c)hsetnx
语法: hsetnx key field value
解释: 仅仅当 field 域不存在时, 设置 hash 表 field 的值
- Redis 127.0.0.1:6379> hsetnx user.1 name lisi #由于 name 域已经设置过, 所以返回 0
- (integer) 0
- Redis 127.0.0.1:6379> hsetnx user.1 fri 5
- (integer) 1 #fri 域没有设置过, 所以 hset 并返回 1
2)查询
a)hget
语法: hget key field
解释: 获取哈希表 key 的 field 值
- Redis 127.0.0.1:6379> hget user.1 name #存在的 hash 表及域
- "lisi"
- Redis 127.0.0.1:6379> hget user.3 name #不存在的 hash 表
- (nil)
- Redis 127.0.0.1:6379> hget user.1 bb #不存在的域
- (nil)
- b)hmget
语法: hmget key field[field]
解释: 批量获取 hash 表的 filed
- Redis 127.0.0.1:6379> hmget user.1 name age fri tech
- 1) "lisi"
- 2) "45"
- 3) "5"
- 4) "lisi"
- Redis 127.0.0.1:6379> hmget user.1 name age fri tech nofield #存在 hash 表中包含不存在的域 nofield
- 1) "lisi"
- 2) "45"
- 3) "5"
- 4) "lisi"
- 5) (nil)
- Redis 127.0.0.1:6379> hmget user.3 name age fri #不存在的 hash 表
- 1) (nil)
- 2) (nil)
- 3) (nil)
- c)hgetall
语法: hgetall key
解释: 获取 hash 表的所有域值
- Redis 127.0.0.1:6379> hgetall user.2 #存在的 hash 表
- 1) "name" #域
- 2) "niuer" #域 name 的值
- 3) "age" #域
- 4) "34" #域 age 的值
- Redis 127.0.0.1:6379> hgetall user.3 #不存在的 hansh 表
- (empty list or set)
- d)hexists
语法: hexists key field
解释: 判断 hash 表中是否存在某个域
- Redis 127.0.0.1:6379> hexists user.1 name #存在
- (integer) 1
- Redis 127.0.0.1:6379> hexists user.1 nofield #不存在
- (integer) 0
- Redis 127.0.0.1:6379> hexists use1 nofield #hash 表不存在
- (integer) 0
- e)hkeys
语法: hkeys key
解释: 获取 hash 表的所有域
- Redis 127.0.0.1:6379> hkeys user.1 #存在的 hash 表
- 1) "name"
- 2) "age"
- 3) "tech"
- 4) "fri"
- Redis 127.0.0.1:6379> hkeys user.4 #不存在的 hash
- (empty list or set)
- f)hvals
语法: hvals key
解释: 获取 hash 表的所有域值
- Redis 127.0.0.1:6379> hvals user.1 #存在 hash
- 1) "lisi"
- 2) "45"
- 3) "lisi"
- 4) "5"
- Redis 127.0.0.1:6379> hvals user.4 #不存在
- (empty list or set)
3)修改
语法: hincrby key field increment
解释: hash 表 field 域的数值增加步长 increment, 如果 increment 是负值, 则是递减. 如果域不存在, 初始值视为 0
- Redis 127.0.0.1:6379> hincrby user.1 age 2 #增加 2
- (integer) 47
- Redis 127.0.0.1:6379> hincrby user.1 age -3 #减少 3
- (integer) 44
- Redis 127.0.0.1:6379> hincrby user.1 age2 -3 #域不能存在, 初始值是 0
- (integer) -3
4)删除
语法: hdel key field[field]
解释: 删除 hash 的域, 如果指定多个 field, 则删除多个
- Redis 127.0.0.1:6379> hkeys user.1
- 1) "name"
- 2) "age"
- 3) "tech"
- 4) "fri"
- 5) "age2"
- Redis 127.0.0.1:6379> hdel user.1 age2 #删除一个域
- (integer) 1
- Redis 127.0.0.1:6379> hkeys user.1
- 1) "name"
- 2) "age"
- 3) "tech"
- 4) "fri"
- Redis 127.0.0.1:6379> hdel user.1 fri tech #删除 2 个域
- (integer) 2
- Redis 127.0.0.1:6379> hkeys user.1
- 1) "name"
- 2) "age"
- Redis 127.0.0.1:6379> hdel user.1 bb #删除一个不存在的域
- (integer) 0 #返回 0
5)其他
语法: hlen key
解释: 获取 hash 的域数量
- Redis 127.0.0.1:6379> hkeys user.1
- 1) "name"
- 2) "age"
- Redis 127.0.0.1:6379> hlen user.1 #存在 2 个域
- (integer) 2
- Redis 127.0.0.1:6379> hlen user.4 #不存在的 hash
- (integer) 0
关于 hash 的更多详细用法, 请参阅: http://redis.io/commands#hash
来源: https://www.cnblogs.com/passzhang/p/12236917.html