1. Redis Hash是什么?

  • 一种底层编码 由 ZIPLIST 和 HASHTABLE 构成的具有哈希表功能的Redis 对象.

  • 与SET 集合相比,哈希不支持 集合的对应运算操作,比如集合减,集合并,集合交.

2. 适用场景

  • 适合典型的KV类数据查询.比如配置信息,用户名与密码MD5

3. 常用操作

看图!

特别说说明:

  • HSETNX key[hash_name] f1 v1 f2 v2 ...: 凡是带NX 后缀的,只要key有对应值这次设置的值不会被更新进去.

4.原理

4.1 编码

HASHTABLE 有两种编码:

  • ZIPLIST

ZIPLSIT 使用条件:

  • 所有strlen(KEY), strlen(VALUE) 都 小于64 字长 且存储对数 小于512 对.

  • 两个条件任何一条不满足,编码结构就用HASHTABLE。


  • HASHTABLE

4.2哈希冲突解决


INTERVIEW

1. 如何查看Hash所有成员?如何查找某个成员?

  • HGETALL table_name

  • HGET table_name key

2. 如何查看Hash中成员个数?

  • HLEN

3. Hash的编码方式是什么?

  • 存入表中hash 对象中的 key-val 长度都小于 64字节且 出入总对数 小于 512 对用 ZIPLIST

  • 上任意不满足HASHTABLE

4. Hash查找某个key的平均时间复杂度是多少?

  • 使用ZIPLIST O(512) = O(1)

  • 使用HASHTABLE O(1) - 映射计算查表访问 一般都在十步之内.

5. Hash为什么要用两种编码方式?

  • 在最大kv对数不超过512时以当前CPU的工作频率其实和查HASHTABLE 访问的速度并没有差太多.

  • ZIPLIST 编码格式内存布局紧凑,节省内存,局部性更好,速度更快.