首先为了区分Redis的键值对存储的key-value,Hash中的键值对称为field-value。
命令
1.Hset
Hset key field value [field value]
返回值为设置成功的field-value的个数。
2.Hget
Hget key field
返回为value
3.Hexists
Hexists key field
判断是否存在:返回1表示存在,0表示不存在。
4.Hdel
Hdel key field [field....]
删除Hash中指定的字段,返回类型为删除的字段个数。
注意区分Hdel和del:
Hdel是删除的field,而del则是将整个Key都删除。
5.Heys
Hkeys key
获取Hash中所有的字段,是一个比较危险的操作,类似于Keys*,可能会引起服务器阻塞。
6.Hvals
Hvals key
获取Hash中所有的values。(也可能有危险,尤其是values特别多时)
7.Hgetall
Hgetall key
获取Hash中所有的field 和 values(危险操作)
8.HMget
类似于Mget,可以一次查询多个field 。
语法:HMget key f1,f2....
其次Hash中也有HMset,但是由于Hset已经可以一次设置多个了,所以HMset也没什么必要了。
上述操作中的Hkeys,Hgetall,Hvals都是具有一定风险的操作,当元素过多时,可能会阻塞服务器,为了避免这种情况,我们可以使用“渐进式”遍历式操作“scan”,将这些操作“化整为零“。scan操作会在之后文章中介绍。
9.Hlen
Hlen key
获取Hash中所有字段的个数。注意时间复杂度为O(1)级别(不用遍历)
10.Hset NX
HSETNX key field value
当字段不存在时才能设置成功。
11.HIncrby
对value可以加减整数。
12.HIncrbyFloat
对valuue加减小数。
这两个操作在操作时,是先将value转为对应的格式(int,double),处理好后再转为String格式存进去。
Hash内部编码
1.ziplist
采用一定的算法对数据进行压缩操作,让空间更加紧凑,节省内存空间,代价就是进行读写的速度会比较慢,适合于元素个数较少,元素长度较短的情况。
2.HashTable
当元素不适用于ziplist时,就会转化为HashTable。具体什么时候开始转化,可以在Redis中的配置文件中来手动配置。
Hash使用场景
主要是通过hash来存Mysql中的表
比如说,可以将key设置为user1,field为name,value为20,这样就将user的name属性存好了,也可以设置多个hash,分别存Id,age等。
其次String类型也可以通过设置为Json类型来存数据库中的数据,但是如果修改的话就不如Hash方便,因为需要将整个Json都取出来再修改。而Hash可以直接通过修改对应field的value来修改。
但是Hash也有缺点,尤其当内部编码为HashTable时,空间浪费现象比较严重。主要原因为以下几点:
- 指针开销:HashTable 中的每个键值对都需要额外的指针来链接
- 内存对齐:HashTable 中的节点需要按照一定的字节边界对齐,导致内存碎片
- 哈希表结构开销:HashTable 需要维护哈希桶、链表等结构
- 空间预分配:为了避免频繁扩容,Redis 会预分配更多的空间