string

用于kv存储,使用方式如下:
set key1 value1(设置kv)
get key1(获取key)

hash

用于结构化数据存储,使用方式如下:
hset key1 col1 value1 col2 value2 col3 vlaue3(初始化对象)
hget key1 col1(获取对象指定字段信息)
hgetall key1(获取对象全部信息)

list

用于存储列表,使用方式如下:
lpush key1 element1 element2 element3(左侧添加元素)
lpop key1(获取并移除左侧元素)
lrange key1 0 100(获取范围下标元素)
lindex key1 3(获取指定下标元素)

set

用于存储集合,使用方式如下:
sadd key1 element1 elemen2 element3(添加元素)
scard key1(获取集合数量)
smember key1(获取集合所有元素)
sismember key1 element1 (判断是否集合元素)

sorted set

用于存储可自定义权重的排序集合,使用方式如下:
zadd key1 score1 element1 score2 element2 score3 element3(添加元素)
zscore key1 element1(获取元素权重)
zrange key1 1 3(获取下标范围元素)
zrangebyscore key1 100 200(获取权重范围元素)

hyperloglog

计算海量元素的基数大小

用于计算distinct value,使用方式如下:
pfadd key1 element1 element2 element3 element4 element1(添加元素)
pfcount key1 (获取dv数量)
pfmerge key1 key2(将key2合并到key1,key2内容不变,key1内容存储合并内容)

通过k个hash函数将变量散列到m大小的列表上,散列到的位置置为1,所以存在一定误判概率,比如其他元素的置为1之后,某个元素的散列位置正好全部吻合,导致判断为存在,误判概率和元素数量和hash函数的质量和数量都有关系。但是判断不存在的结果是精确的。所以使用的时候要么容许正向误差,要么采用反向判断。


bloom filter

判断海量元素是否已经存在/不存在

bf.add(需要安装插件)

bitmap

存储大量元素(小于Integer.MAX)的boolean状态,并计数

用于存储大量二值数据,比如统计登录天数、统计文章阅读用户,使用方式如下:
setbit key1 offset 0/1(在指定bit位上设置01值)
getbit key1 offset(获取指定bit位上的值)
bitcount key1(获取key1下1值的数量)

hyperloglog和bloomfilter都是通过位处理减少特定场景需求的空间和时间消耗。


如何计算DAU

  1. 如果uid<Integer.MAX且只统计注册用户,那么用bitmap offset用uid
  2. 如果uid为long,或者要统计匿名用户(可以为匿名用户生成UUID并取hash值),那么用一个累加计数作为bitmap的offset,并通过bloomfilter来判断用户当日是否登录。
  3. 如果允许非精确计数,通过hll。