一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
本文讲解下redis五大常用数据类型当中的hash,主要从其数据结构,以及常用的方法进行讲解。
数据结构
Redis的hash是一个键值对集合。
是一个string类型的key和value的映射表,hash适合存储对象,类似Java里面的Map<String,Object>。
通常我们在使用String类型存储对象的时候可以有两种方式:
- 使用String类型的key/value形式,
对象唯一标识做key,对象做value,此方式需要在存储时进行序列化,取出时进行反序列化。 - 使用对象的
id或唯一标识+field属性作为key,field的值作为value。
使用Hash的话,相比于上面两种,更加的合适,省去序列化和反序列化的开销;减少key当中唯一标识的冗余。而且我们可以直接通过key + field去操作对象的某个属性。
Hash类型对应的数据结构是两种:
- ziplist(压缩列表):当field的长度或者个数较小的时候。
- hashtable(哈希表):当field的长度或者个数较大的时候。
常用命令
hget和hset
-
hset 给key下的对象中的field对应的value赋值,格式
hset key field value [field value ...]使用示例如下:
127.0.0.1:6379> hset student name Tom age 20 address usa phone 13333333333 (integer) 4 -
hget 根据key+field取出对象的value,用法
hget key field使用示例如下:
127.0.0.1:6379> hget student name "Tom" -
hmset 批量设置hash的值,格式
hmset key field value [field value ...]这个方法看起来和hset没有区别,确实是的。在最新的官方文档中,推荐使用hset,hmset已弃用。对比有以下的原因:
- hset的时间复杂度是O(1),而hmset是O(n)
- hset会返回设置值的个数,而hmset只返回OK
查看hash
-
hexists 查看指定key的hash中,field属性是否存在,成功返回1,失败返回0,格式
hexists key field使用示例如下:
127.0.0.1:6379> hexists student phone (integer) 1 127.0.0.1:6379> hexists student sex (integer) 0 -
hkeys 列出该hash集合的所有field,格式
hkeys key使用示例如下:
127.0.0.1:6379> hkeys student 1) "name" 2) "age" 3) "address" 4) "phone" -
hvals 列出该hash集合的所有value,格式
hvals key使用示例如下:
127.0.0.1:6379> hvals student 1) "Tom" 2) "20" 3) "usa" 4) "13333333333
修改hash
-
hincrby 指定key中的属性field的值加上增量指定值,格式
hincrby key field increment使用示例如下:
127.0.0.1:6379> hincrby student age 2 (integer) 22 -
hsetnx 指定key的属性field的值设置为value,且只有field不存在才会成功,成功返回1,失败返回0,格式
hsetnx key field value使用示例如下:
127.0.0.1:6379> hsetnx student sex man (integer) 1 127.0.0.1:6379> hsetnx student name Tom (integer) 0
到此为止,关于redis的hash的简单介绍就全部完成了。