持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
🍊作者简介:少年不想说话,努力长大
🍊往期回顾:从零开始Redis(六)
🍊近期目标:写完基础源码,点赞👍🏼、收藏⭐、留言📩
今天我们接着前面的数据结构,我们来说说hash结构,开始;
数据结构Hash
首先要说下它的结构,先看语法命令HSET key field value [field value ...],它有key、field、value啥意思呢?key还是那个key,但是field和value相当于value,然后对于field和value呢,filed就是key,value就是value;举个例子:key是某个人,field是属性,value就可以存储对应的值;是不是好理解一点;如果用常见代码来理解就是Map<String,Map<String,Object>>;为什么要用这个语法呢,因为对于大数据量存储的话,如果大家只用key-value形式来存储会非常庞大,如果以hash形式,虽然查两次key,但是效率提升一个档次;这里我们说到hset我们要补充一点就是对于Hmset的命令,现在hset完全支持,所以我们就忽略hmset吧;
下面我们用命令来熟悉一下这个语法
HSET key field value,如果key不存在的话,我们会创建哈希表并进行HSET操作。 如果 field已经存在于哈希表中,会对原有的值进行覆盖,
HGETALL key,以列表形式返回该key对应的field和value;key不存在返回empty;
HGET key field,返回key中对应field的值;field或key不存在返回nil
127.0.0.1:6379> hset zhangsan id 1001 age 12
(integer) 2
127.0.0.1:6379> HGETALL zhangsan
1) "id"
2) "1001"
3) "age"
4) "12"
127.0.0.1:6379> HGETALL zhangsans
(empty array)
key不存在
127.0.0.1:6379> HGET zhansan age
(nil)
127.0.0.1:6379> HGET zhangsan age
"12"
field不存在
127.0.0.1:6379> HGET zhangsan ages
(nil)
上面我们说了Hmset可以舍弃,但是Hmget好像还不行,如果我们不想要HGETALL,那就用这个,HMGET key field [field ...],它会返回给定的所有field域对应的value值,不存在则返回nil;
127.0.0.1:6379> HMGET zhangsan id age name
1) "1001"
2) "12"
3) (nil)
接着查询给定的域是否存在,HEXISTS key field,存在返1不存在返0;
127.0.0.1:6379> HEXISTS zhangsan id
(integer) 1
127.0.0.1:6379> HEXISTS zhangsan name
(integer) 0
HDEL和HINCRBY这里也不说了,需要自行了解,
HINCRBYFLOAT key field increment,该用法是为哈希表key中的field的value值加上increment 。 如果该key或field不粗在 ,那么HINCRBYFLOAT会先创建key或field并将其值设为0 ,然后再执行加法操作。返回的是操作后field对应的值;我们现在哈希表不存在lisi的key,我们看下用例;
127.0.0.1:6379> HINCRBYFLOAT lisi id 10
"10"
127.0.0.1:6379> HGETALL lisi
1) "id"
2) "10"
127.0.0.1:6379> HINCRBYFLOAT lisi id 11
"21"
我们看下最后两个,HKEYS key,它返回哈希表key中的所有域(field),HVALS key,返回哈希表key中所有域的值。
127.0.0.1:6379> HKEYS zhangsan
1) "id"
2) "age"
127.0.0.1:6379> HVALS zhangsan
1) "1001"
2) "12"
好了,对于hash命令就说这么多,我们应该能感受到到这好像就是套娃,map套map,写个接口可以操作的那样,这和String也没啥差别嘛,但是不可否认对于海量数据读取的确会快很多缺点不是要查两次,对于这个我们可以在代码里写个工具方法来处理就可以玩耍了🥗🥗🥗;
结束结束,那就🛴🛴🛴
如果对你有所帮助
点个赞呗