版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
从这篇笔记开始我们一起学习操作 hashs 类型的命令,这种类型被称作散列表,很像C++中的std::map,之前我们学习了很多操作字符串和键的命令,现在再学习操作散列表的命令时会发现很容易懂,很多命令就是在字符串或者键的命令前面加一个 H
就可以了,操作散列表首先要了解散列表的结构。
其实就是在一个变量(hash类型)下存储这个很多键值对,比如将个人信息存入散列表,大概就是将(姓名:Albert)、(年龄:18)、(职业:程序猿)这些键值对存储在表示你个人信息的变量中,接下来一起来看一下。
这篇笔记中的三个命令分别是 HSET 、 HGET 、HDEL ,可以参考:
- 《Redis每日一练(01):GET和SET命令》 中的 GET 和 SET 命令
- 《Redis每日一练(11):DEL和EXISTS命令》 中的 DEL 命令
HSET
- 最早出现版本:2.0.0
- 时间复杂度:O(1)(当有N个键值对的时候是O(N))
- 命令参数:HSET key field value [field value …]
- 操作类型:hashes
- 官方文档
作用
将键值对存储在 hashs 类型的变量中,从4.0.0版本开始支持一次将多个键值对存储进去,返回成功添加的个数,如果指定的键不存在会添加一个新的键,若存在,原来键对应的值会被覆盖掉,设置键值对时,若原来已经存在,则重新设置会将原来数据覆盖,不会增加返回值个数。
这里有一个常见用法,比如在传统的关系型数据库中如果存储用户信息,可能会设计这样的表结构,表名字为users,该表有多个列,第一列为用户id,接着是用户名、年龄、职业等等,每一行对应一条用户信息,整个表中的数据就是所有的用户信息。
而在 Redis 中通常会这样存储,定义多个前缀相同的键,比如users,然后用:
拼上用户id作为键,比如我的用户id为101,那么users:101就是存储我的信息的哈希表,如果tom的id是102,那么users:102就是存储tom信息的哈希表,而前缀为users:所有键中存储的数据就是整体的用户信息。
练习
将多个键值对存储在以users为前缀的哈希表中,因为我的版本是3.2.100,不能一次设置多个键值对,所以我一个一个的设置一下:
127.0.0.1:6379> HSET users:101 name ablert (integer) 1 127.0.0.1:6379> HSET users:101 age 18 (integer) 1 127.0.0.1:6379> HSET users:101 age 19 (integer) 0 127.0.0.1:6379> HSET users:101 job programer (integer) 1 127.0.0.1:6379> GET users:101 (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379>
复制
上面的例子中给哈希表类型的键users:101设置了3个键值对,其中age这个属性第二次设置的时候返回0,说明之前已经存在了,最后用之前学过的 GET 命令获取键的值时产生了错误,这时就要注意了,获取哈希表中的值应该用下面学到的这个命令 HGET 。
HGET
- 最早出现版本:2.0.0
- 时间复杂度:O(1)
- 命令参数:HGET key field
- 操作类型:hashes
- 官方文档
作用
这个 HGET 命令就和之前学到的 GET 命令一样简单,指定键和字段名就可以获得哈希表中的值,指定的键或者字段不存在返回nil。
练习
使用 HSET 设置字段后,再使用 HGET 命令读取设置的值:
127.0.0.1:6379> HSET users:102 name tom (integer) 1 127.0.0.1:6379> HSET users:102 age 20 (integer) 1 127.0.0.1:6379> HSET users:102 job worker (integer) 1 127.0.0.1:6379> HSET users:102 age 21 (integer) 0 127.0.0.1:6379> HGET users:102 name "tom" 127.0.0.1:6379> HGET users:102 age "21" 127.0.0.1:6379> HGET users:102 job "worker" 127.0.0.1:6379>
复制
HDEL
- 最早出现版本:2.0.0
- 时间复杂度:O(1)
- 命令参数:HDEL key field [field …]
- 操作类型:hashes
- 官方文档
作用
看到这个命令的时候要注意一下,删除哈希表类型的键也是用 DEL,但是要删除哈希表中的字段就需要使用 HDEL 了,Redis 中的键本质上都是字符串,所以你删除一个对应字符串的键或者删除一个对应哈希表的键都使用命令 DEL,但是要删除对应类型中的内容就要使用对应的删除命令了。
练习
删除之前添加的哈希表users:101中的job字段和users:102哈希表中的age字段
127.0.0.1:6379> HGET users:101 job "programer" 127.0.0.1:6379> HGET users:102 age "21" 127.0.0.1:6379> HDEL users:101 job (integer) 1 127.0.0.1:6379> HGET users:101 job (nil) 127.0.0.1:6379> HDEL users:102 age (integer) 1 127.0.0.1:6379> HGET users:102 age (nil) 127.0.0.1:6379> HDEL users:102 age (integer) 0 127.0.0.1:6379>
复制
从上面的删除过程可以看出,当使用 HDEL 命令删除一个不存在的字段时返回0,如果成功删除一个存在的字段返回1。
总结
- HSET 命令可以设置哈希表中的字段和对应值,从4.0.0版本以后可以一次设置多对。
- HGET 命令可以获取哈希表中对应的字段值,所键或字段名不存在时返回nil。
- HDEL 命令可以删除哈希表中的字段和对应值,成功删除返回1,指定的字段值不存在返回0。
2019-12-5 15:43:15