位图:是二进制数据(0101101010)2^32
强势点:
01_login :101110(比如:第一天登录,二天没登录)
传统的字符串解决方案中 记录用户登录日期 统计堪忧
01_login_20200206: 1
01_login_20200207: 0
传统的list解决方案中 统计堪忧,查找堪忧
01_login :[20200206, 20200208](统计那天登录了)
SETBIT kk3 8 1(第8位是1,其他为0)
00000001
Hash散列数据类型(field和value必须是字符串类型)
字段和value hk {'age':18,'gemder':'male'}
优点:
1,特定条件下节约内存空间 满足两个条件才能节约 [1,字段小于512个,2:value不能超64个字节]--zipmap
2,可按需获取字段的值
hk 200 field 可精确查找具体的字段,如 age
传统方案:
python 准备一个200字段的字典 用 redis string :json.dumps(字典) r.set('pyd',d)
缺点:
1,不能让hash每一个field设置过期, hk:{'age':18},只能对hk设置
2,存储消耗大于字符串结构
Redus--hash原理
hash是无序的
redis是二维的,当你存一个key的时候,是一个一维数组(0,1,2,3,4)
数组 =( 0,1,2,3,4)
数组 = (guwenyuan,1,2,3,4)
1)hest h1 username guwenyuan 插入姓名
1,hash(username)% 5 = 0(比如等于0) 就到数组中的 0位置、
数组 = (guwenyuan,1,2,3,4)
2, hash(username)%5 =0(比如这个也等于0)
age = 18 姓名和年龄的位置为一致的就是hash碰撞
哈希碰撞:两个字段的哈希值对应的存储空间索引位置冲突,即为哈希碰撞
哈希碰撞解决方案:在当前位置下方开辟存储空间,进行存储 --单链法
3,扩容 - 当一维存储位置不够时,要进行扩容
redis出发扩容条件 当总字段个数等于一维数组的长度是,开始扩容
4,redis-渐进式的扩容 - 一次只迁一丢丢 保留两份数据,新旧两份数据,
哈希的应用场景