1. Redis支持的数据类型
Redis支持5种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
通过一张图了解下Redis内部内存管理中是如何描述这些不同数据类型的:
2. list,set,zset的区别
2.1 zset实现有序
zset的编码有ziplist和skiplist两种。
底层分别使用ziplist(压缩链表)和skiplist(跳表)实现。
使用条件: 当zset满足以下两个条件的时候,使用ziplist:
1.保存的元素少于128个
2.保存的所有元素大小都小于64字节不满足这两个条件则使用skiplist。
这两个数值是可以通过redis.conf的zset-max-ziplist-entries 和 zset-max-ziplist-value选项 进行修改。
ziplist编码
ziplist 编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个节点保存元素的分值。并且压缩列表内的集合元素按分值从小到大的顺序进行排列,小的放置在靠近表头的位置,大的放置在靠近表尾的位置。
skiplist编码
skiplist 编码的有序集合对象使用 zet 结构作为底层实现,一个 zset 结构同时包含一个字典和一个跳表:
字典的键保存元素的值,字典的值则保存元素的分值;跳跃表节点的 object 属性保存元素的成员,跳跃表节点的 score 属性保存元素的分值。
这两种数据结构会通过指针来共享相同元素的成员和分值,所以不会产生重复成员和分值,造成内存的浪费。
说明:其实有序集合单独使用字典或跳跃表其中一种数据结构都可以实现,但是这里使用两种数据结构组合起来,原因是假如我们单独使用字典,虽然能以O(1)的时间复杂度查找成员的分值,但是因为字典是以无序的方式来保存集合元素,所以每次进行范围操作的时候都要进行排序;假如我们单独使用跳跃表来实现,虽然能执行范围操作,但是查找操作有O(1)的复杂度变为了O(logN)。因此Redis使用了两种数据结构来共同实现有序集合。
2.2使用Redis实现实时排行榜
参考
3. bitmap
3.1 bitmap?
bitmap:就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。我们知道8个bit可以组成一个Byte,所以bitmap本身会极大的节省储存空间。
3.2 Redis bitmap
Redis从2.2.0版本开始新增了setbit,getbit,bitcount等几个bitmap相关命令。虽然是新命令,但是并没有新增新的数据类型,因为setbit等命令只不过是在set上的扩展。
3.3 setbit
指令 SETBIT key offset value
复杂度 O(1)
设置或者清空key的value(字符串)在offset处的bit值(只能只0或者1)。
3.4 使用场景
3.4.1 用户周活跃度
setbit Monday 01 1
setbit Monday 02 1
setbit Tuesday 01 0
setbit Tuesday 02 1
... ...
七天内登录用户,将周一到周五的值做位或运算
bitop operation rs key1 [key2…]
对key1 key2做opecation并将结果保存在rs上
opecation可以是AND(与) OR(或) NOT(非) XOR(异或)
answer:
bitop OR result Monday Tuesday Wednesday Thursday Friday Saturday Sunday
01 1|0|1|0|1|1|1 = 1
02 1|1|1|0|1|0|0 = 1
3.4.2 统计活跃用户
使用时间作为cacheKey,然后用户ID为offset,如果当日活跃过就设置为1
那么我该如果计算某几天/月/年的活跃用户呢(暂且约定,统计时间内只有有一天在线就称为活跃),有请下一个redis的命令
命令 BITOP operation destkey key [key …]
说明:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
说明:BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数
3.4.3 用户在线状态
3.4.4 用户签到
参考:
https://www.jianshu.com/p/e5a516831ac2
https://www.cnblogs.com/zhaoyan001/p/10782260.html
https://blog.csdn.net/github_35634180/article/details/98452341
https://segmentfault.com/a/1190000008188655
除了菜,我一无所有!!!