概念理解
Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。
不同的是,Redis 的字典的值只能是字符串,另外它们 rehash 的方式不一样,因为 Java 的 HashMap 在字典很大时,rehash 是个耗时的操作,需要一次性全部 rehash。Redis 为了高性能,不能堵塞服务,所以采用了渐进式 rehash 策略。
渐进式 rehash 会在 rehash 的同时,保留新旧两个 hash 结构,查询时会同时查询两个 hash 结构,然后在后续的定时任务中以及 hash 的子指令中,循序渐进地将旧 hash 的内容一点点迁移到新的 hash 结构中。
当 hash 移除了最后一个元素之后,该数据结构自动被删除,内存被回收。(单写双查)
既然相当于hashMap,那就可以将存储的对象中的字段分开存储,二级目录,hashMap的key,每个键值对有一个key。
获取数据的时候可以直接获取二级目录下的数据。
有时候存储用户数据的时候,可以根据用户属性值的使用频率,筛选出热点数据,放在新的二级目录上。
常用命令
基于Hash的特点可以与String比较,储存某个对象是整个对象的json还是Hash存储,需要结合业务考虑,因为hash需要额外的开销,String 每次查询查的都是整个对象。