目录
- Java里提供了HashMap,Redis中也有类似的数据结构,就是哈希类型。但是要注意,哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值。
- 基本上,哈希的操作命令和字符串的操作命令很类似,很多命令在字符串类型的命令前面加上了h字母,代表是操作哈希类型,同时还要指明要操作的field的值。hset设值
1、Hash 操作命令
1-1、hset 命令
# 如果设置成功会返回1,反之会返回0。
# 此外Redis提供了hsetnx命令,它们的关系就像set和setnx命令一样,只不过作用域由键变为field
hset key field value [field value ...]
1-2、hget 命令
# 如果键或field不存在,会返回nil
hget key field
1-3、hdel 命令
# hdel会删除一个或多个field,返回结果为成功删除field的个数
hdel key field [field ...]
1-4、hlen 命令
# 计算当前key的field个数
hlen key
1-5、hmset 命令
# 批量设值
hmset key field value [field value ...]
1-6、hmget 命令
# 批量取值
hmget key field [field ...]
1-7、hexists 命令
# 判断field是否存在,存在返回1,不存在返回0
hexists key field
1-8、hkeys 命令
#获取所有field,它返回指定哈希键所有的field
hkeys key
1-9、hvals 命令
#获取所有value
hvals key
1-10、hgetall 命令
# 获取所有field与value
hgetall key
在使用hgetall时,如果哈希元素个数比较多,会存在阻塞Redis的可能。如果只需要获取部分field,可以使用hmget,如果一定要获取全部field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型
1-11、hincrby 、hincrbyfloat 命令
# hincrby 和 hincrbyfloat,就像incrby和incrbyfloat命令一样,但是它们的作用域是filed
hincrby key field increment
1-12、hstrlen 命令
# 计算value的字符串长度
hstrlen key field
2、使用场景
从前面的操作可以看出,String和Hash的操作非常类似,那为什么要弄一个hash出来存储。
哈希类型比较适宜存放对象类型的数据,我们可以比较下,如果数据库中表记录user为:
id | name | age |
---|---|---|
1 | lisi | 18 |
2 | zhangsan | 20 |
2-1、使用String类型
需要一条条去插入获取。
set user_1_name lijin;
set user_1_age 18;
set user_2_name msb;
set user_2_age 20;
优点:简单直观,每个键对应一个值
缺点:键数过多,占用内存多,用户信息过于分散,不用于生产环境
2-2、将对象序列化存入redis
set user_1 serialize(userInfo);
优点:编程简单,若使用序列化合理内存使用率高
缺点:序列化与反序列化有一定开销,更新属性时需要把userInfo全取出来进行反序列化,更新后再序列化到redis
2-3、使用hash类型
hmset user_1 name lisi age 18
hmset user_2 name zhangsan age 20
优点:简单直观,使用合理可减少内存空间消耗
缺点:要控制内部编码格式,不恰当的格式会消耗更多内存