Redis(四) 数据类型hash

作者:毕涛涛,致力于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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Redis 是一个键值对数据库(key-value DB),数据库的值可以是字符串、集合、列表等多种类型的对象,而...
    吴昂_ff2d阅读 9,019评论 0 5
  • 1 前言 Redis的5种数据类型(String,Hash,List,Set,Sorted Set),每种数据类型...
    LZhan阅读 2,981评论 0 2
  • 首先,来介绍一个概念就是“回报感”。在这里将之定义为,动作发出者要求承受者进行动作偿还的一种心理倾向。通俗来讲,就...
    文雨山阅读 3,434评论 0 0
  • 这两天培训家庭财务规划,清楚明白的算清楚了自己的财务状况,对自己的情况有了一个清晰的认知和未来明显的判断,顿时也心...
    super贝贝阅读 1,112评论 0 0
  • 七月份确实比其他月份要热闹一些。因为毕业生就业工作,在校师生放暑假都在每年这个月定期发生。 今年七月我既不是在校生...
    秦简希阅读 3,957评论 0 0

友情链接更多精彩内容