Redis(四) 数据类型hash
2020-03-28 本文已影响0人
honest涛
作者:毕涛涛,致力于Java学习的践行者。原创文章,转载请注明出处。
hash(字典)
Redis的字典相当于Java语言的HashMap。它是无序字典。内部实现结构上同Java的HashMap也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。
hash结构.png 不同的是,Redis的字典的值只能是字符串,另外它们的方式不一样,因为Java的HashMap在字典很大时,是个耗时的操作,需要一次性全部rehash。Redis为了高性能,不能堵塞服务,所以采用了渐进式rehash策略。rehash过程.pngHashMap的resize(rehash):
当HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的。所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,这是一个常用的操作,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize。
渐进式rehash会在rehash的同时,保留新旧两个hash结构,查询时会同时查询两个hash结构,然后在后续的定时任务中以及hash的子指令中,循序渐进地将旧hash的内容一点带你迁移到新的hash结构中。
当hash移除了最后一个元素后,该数据结构自动被删除,内存被回收。
hash结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash可以对用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部门获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样会比较浪费网络流量。
- hset myhash field1 value1 (含义是hset是hash集合,myhash是集合名字,field1是字段名,value1为其值)。
- 使用hget myhash field1 获取内容。
- hmset可以进行批量获取多个键值对。
- hincrby和hdecrby集合递增和递减。
- hexists是否存在key 如果存在返回,不存在返回0。
- hlen返回hash集合里的所有的键数值
- hdel删除指定hash的field
- hkeys返回hash里所有的字段
- hvals返回hash的所有value
- hgetall 返回hash里所有的key和value