Hash
- 类型介绍
- 命令列表
- 命令实例
- 扩展-应用场景
类型介绍
- Redis中的hash一般用来存储对象
- 如: key是对象的id, value是一个HashMap ,hashmap 中的key/field是对象的属性名, hashmap 中的value是对象属性名对应的属性值
- 补充:
- Java中的HashMap的底层:
数组 + 链表 (链表长度>8之后, 转换红黑树)
命令列表
命令原型 | 时间复杂度 | 命令描述 | 返回值 |
HSET key field value | O(1) | 为指定的Key设定Field/Value对,如果Key不存在,该命令将创建新Key以参数中的Field/Value对,如果参数中的Field在该Key中已经存在,则用新值覆盖其原有值。 | 1表示新的Field被设置了新值,0表示Field已经存在,用新值覆盖原有值。 |
HGET key field | O(1) | 返回指定Key中指定Field的关联值。 | 返回参数中Field的关联值,如果参数中的Key或Field不存,返回nil。 |
HEXISTSkey field | O(1) | 判断指定Key中的指定Field是否存在。 | 1表示存在,0表示参数中的Field或Key不存在。 |
HLEN key | O(1) | 获取该Key所包含的Field的数量。 | 返回Key包含的Field数量,如果Key不存在,返回0。 |
HDEL key field [field …] | O(N) | 时间复杂度中的N表示参数中待删除的字段数量。从指定Key的Hashes Value中删除参数中指定的多个字段,如果不存在的字段将被忽略。 | 如果Key不存在,则将其视为空Hashes,并返回0. 实际删除的Field数量。 |
HSETNXkey field value | O(1) | 只有当参数中的Key或Field不存在的情况下,为指定的Key设定Field/Value对,否则该命令不会进行任何操作。 | 1表示新的Field被设置了新值,0表示Key或Field已经存在,该命令没有进行任何操作。 |
HINCRBYkey field increment | O(1) | 增加指定Key中指定Field关联的Value的值。如果Key或Field不存在,该命令将会创建一个新Key或新Field,并将其关联的Value初始化为0,之后再指定数字增加的操作。该命令支持的数字是64位有符号整型,即increment可以负数。 | 返回运算后的值。 |
HGETALLkey | O(N) | 时间复杂度中的N表示Key包含的Field数量。获取该键包含的所有Field/Value。其返回格式为一个Field、一个Value,并以此类推。 | Field/Value的列表。 |
HKEYSkey | O(N) | 时间复杂度中的N表示Key包含的Field数量。返回指定Key的所有Fields名。 | Field的列表。 |
HVALSkey | O(N) | 时间复杂度中的N表示Key包含的Field数量。返回指定Key的所有Values名。 | Value的列表。 |
HMGETkey field [field …] | O(N) | 时间复杂度中的N表示请求的Field数量。获取和参数中指定Fields关联的一组Values。如果请求的Field不存在,其值返回nil。如果Key不存在,该命令将其视为空Hash,因此返回一组nil。 | 返回和请求Fields关联的一组Values,其返回顺序等同于Fields的请求顺序。 |
HMSET key field value [field value …] | O(N) | 时间复杂度中的N表示被设置的Field数量。逐对依次设置参数中给出的Field/Value对。 | 如果其中某个Field已经存在,则用新值覆盖原有值。如果Key不存在,则创建新Key,同时设定参数中的Field/Value。 |
命令实例
添加并获取元素
node01:6379> hset user001 username jack
(integer) 1
node01:6379> hget user001 username
"jack"
node01:6379> hget user001 age
(nil)
node01:6379> hset user001 age 18
(integer) 1
node01:6379> hget user001 age
"18"
获取键的字段数量
node01:6379> hlen user001
(integer) 2
判断键中是否存在指定字段
node01:6379> hexists user001 username
(integer) 1
删除键中指定字段
node01:6379> hdel user001 username
(integer) 1
node01:6379> hlen user001
(integer) 1
操作数值型字段的值,返回操作后的结果。
node01:6379> hincrby user001 age 1
(integer) 19
node01:6379> hincrby user001 age -1
(integer) 18
一次性设置多个字段
node01:6379> hmset user001 username jack nickname jackma
OK
node01:6379> hlen user001
(integer) 3
获取键的多个字段
node01:6379> hmget user001 username age nickname xx
1) "jack"
2) "18"
3) "jackma"
4) (nil)
返回键的所有字段及其值
hgetall user001
1) "age"
2) "18"
3) "username"
4) "jack"
5) "nickname"
6) "jackma"
仅获取键中所有字段的名
hkeys user001
1) "age"
2) "username"
3) "nickname"
仅获取键中所有字段的值
hvals user001
1) "18"
2) "jack"
3) "jackma"
扩展-应用场景
- 1.redis中的hash类型可以存储javabean对象
- 如实际开发中的购物车就可以用redis去做
- key是用户的id, value是hash, hash的field是商品的id, hash的value是商品的数量
- 那么添加购物车的加减按钮就可以用 hincrby 用户id 商品id 1/-1