Redis从入门到入坟系列文章(三): 哈希(Hash)

本文介绍了Redis中的哈希数据结构,包括它的内部编码ziplist和hashtable,以及不同编码的使用条件。文章详细阐述了哈希表的操作命令,如HSET、HGET、HMSET、HDEL等,并提到了Redis 4.0.0后HMSET的弃用。此外,还介绍了HSETNX、HINCRBY和HSCAN等高级命令,帮助读者全面理解Redis哈希的使用。

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 最多可以存储 2^32 - 1 键值对(40多亿)。

我们先了解下hash的内部编码实现,其分为两种:压缩列表ziplist和哈希表hashtable。数据量存储较小的情况下使用ziplist,其满足一下设置的两个条件,就会使用ziplist:

1)、hash-max-ziplist-entries,默认值为512,哈希元素少于该配置,
2)、hash-max-ziplist-value,默认值为64,哈希值小于该配置

我们打开安装目录下的文件redis.windows-service.conf或redis.windows.conf,可以看到其配置:

# Hashes are encoded using a memory efficient data structure when they have a
# small number of entries, and the biggest entry does not exceed a given
# threshold. These thresholds can be configured using the following directives.
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

看名字就知道ziplist使用了更加紧凑的结构实现多个元素的连续存储,所以ziplist比hashtable更节省内存;但是由于hashtable的读写时间复杂度为O(1),所以其读写效率要高于ziplist。

接下来,我们就来了解下常用的hash命令:

1、HSET key filed value:将哈希表 key 中的字段 field 的值设为 value 

127.0.0.1:6379> HSET hkey db redis
(integer) 1
127.0.0.1:6379> HSET hkey db1 redis db2 mongodb
(integer) 2

2、HGET key filed:获取存储在哈希表中指定字段的值

我们获取下HSET的hkey的值:

127.0.0.1:6379> HGET hkey db
"redis"

3、HMSET key filed1 value1 [filed2 value2...]:同时将多个 field-value 对设置到哈希表 key 中

我们发现HSET命令其实也可以实现同时设置多个field-value 对。其实Redis官网已经进行了说明:

As per Redis 4.0.0, HMSET is considered deprecated. Please use HSET in new code.

大致意思是,根据Redis 4.0.0,HMSET被视为已弃用。请在新代码中使用HSET。

127.0.0.1:6379> HMSET hkey2 db1 redis db2 mongodb
OK

4、HMGET key field1 [field2...]:获取所有给定字段的值

比如我们获取hkey2:

127.0.0.1:6379> HMGET hkey2 db1 db2
1) "redis"
2) "mongodb"

5、HDEL  key field1 [field2...]:删除一个或多个哈希表字段

比如删除hkey2:

127.0.0.1:6379> HMGET hkey2 db1 db2
1) "redis"
2) "mongodb"
127.0.0.1:6379> HDEL hkey2 db1 db2
(integer) 2
127.0.0.1:6379> HMGET hkey2 db1 db2
1) (nil)
2) (nil)

6、HEXISTS key field:查看哈希表 key 中,指定的字段是否存在

存在,则返回1;不存在,则返回0

127.0.0.1:6379> HEXISTS hkey2 db1
(integer) 0
127.0.0.1:6379> HEXISTS hkey db1
(integer) 1

7、HGETALL key:获取在哈希表中指定 key 的所有字段和值

127.0.0.1:6379> HSET hkey db1 redis db2 mongodb db3 mysql
(integer) 3
127.0.0.1:6379> HGETALL hkey
1) "db1"
2) "redis"
3) "db2"
4) "mongodb"
5) "db3"
6) "mysql"

8、HKEYS key:获取所有哈希表中的字段

127.0.0.1:6379> HKEYS hkey
1) "db1"
2) "db2"
3) "db3"

9、HLEN hkey:获取哈希表中字段的数量

127.0.0.1:6379> HLEN hkey
(integer) 3

10、HINCRBY key field increment:为哈希表 key 中的指定字段的整数值加上增量 increment 

127.0.0.1:6379> HSET myhash mh1 10
(integer) 2
127.0.0.1:6379> HGET myhash mh1
"10"
127.0.0.1:6379> HINCRBY myhash mh1 5
(integer) 15
127.0.0.1:6379> HGET myhash mh1
"15"

11、HINCRBYFLOAT key field increment:为哈希表 key 中的指定字段的浮点数值加上增量 increment

127.0.0.1:6379> HGET myhash mh1
"15"
127.0.0.1:6379> HINCRBYFLOAT myhash mh1 2.5
"17.5"

12、HSETNX key field value:只有在字段 field 不存在时,设置哈希表字段的值

将已存在的db3用命令HSETNX修改为“oracle”,然后再查看db3发现其值还是“mysql”;将不存在的db4用命令HSETNX设置为“oracle”,然后再查看hkey多了个db4,且其值为“oracle”。

127.0.0.1:6379> HGETALL hkey
1) "db1"
2) "redis"
3) "db2"
4) "mongodb"
5) "db3"
6) "mysql"
127.0.0.1:6379> HSETNX hkey db3 oracle
(integer) 0
127.0.0.1:6379> HGET hkey db3
"mysql"
127.0.0.1:6379> HSETNX hkey db4 oracle
(integer) 1
127.0.0.1:6379> HGETALL hkey
1) "db1"
2) "redis"
3) "db2"
4) "mongodb"
5) "db3"
6) "mysql"
7) "db4"
8) "oracle"

13、HVALS key:获取哈希表中所有值

127.0.0.1:6379> HVALS hkey
1) "redis"
2) "mongodb"
3) "mysql"
4) "oracle"

14、HSCAN key cursor [MATCH pattern] [COUNT count]:迭代哈希表中的键值对

127.0.0.1:6379> HSCAN hkey 0 MATCH 'db*'
1) "0"
2) 1) "db1"
   2) "redis"
   3) "db2"
   4) "mongodb"
   5) "db3"
   6) "mysql"
   7) "db4"
   8) "oracle"
127.0.0.1:6379> HSCAN hkey 0 MATCH 'db1'
1) "0"
2) 1) "db1"
   2) "redis"

今日小结:

        今天主要讲解了hash以及常用的命令,都是很基础的东西,你学废了吗?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值