Redis(四) 数据类型hash

2020-03-28  本文已影响0人  honest涛

作者:毕涛涛,致力于Java学习的践行者。原创文章,转载请注明出处。

hash(字典)

Redis的字典相当于Java语言的HashMap。它是无序字典。内部实现结构上同Java的HashMap也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。

hash结构.png 不同的是,Redis的字典的值只能是字符串,另外它们的方式不一样,因为Java的HashMap在字典很大时,是个耗时的操作,需要一次性全部rehash。Redis为了高性能,不能堵塞服务,所以采用了渐进式rehash策略。

HashMap的resize(rehash):
当HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的。所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,这是一个常用的操作,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize。

rehash过程.png

渐进式rehash会在rehash的同时,保留新旧两个hash结构,查询时会同时查询两个hash结构,然后在后续的定时任务中以及hash的子指令中,循序渐进地将旧hash的内容一点带你迁移到新的hash结构中。
当hash移除了最后一个元素后,该数据结构自动被删除,内存被回收。
hash结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash可以对用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部门获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样会比较浪费网络流量。

hash也有缺点,hash结构的存储消耗要高于单个字符串,到底该使用hash还是字符串,需要根据实际情况再三权衡。 hash命令.png
  1. hset myhash field1 value1 (含义是hset是hash集合,myhash是集合名字,field1是字段名,value1为其值)。
  2. 使用hget myhash field1 获取内容。
  3. hmset可以进行批量获取多个键值对。
  4. hincrby和hdecrby集合递增和递减。
  5. hexists是否存在key 如果存在返回,不存在返回0。
  6. hlen返回hash集合里的所有的键数值
  7. hdel删除指定hash的field
  8. hkeys返回hash里所有的字段
  9. hvals返回hash的所有value
  10. hgetall 返回hash里所有的key和value
上一篇下一篇

猜你喜欢

热点阅读