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以及常用的命令,都是很基础的东西,你学废了吗?
本文介绍了Redis中的哈希数据结构,包括它的内部编码ziplist和hashtable,以及不同编码的使用条件。文章详细阐述了哈希表的操作命令,如HSET、HGET、HMSET、HDEL等,并提到了Redis 4.0.0后HMSET的弃用。此外,还介绍了HSETNX、HINCRBY和HSCAN等高级命令,帮助读者全面理解Redis哈希的使用。
1246

被折叠的 条评论
为什么被折叠?



