Bitmaps
Bitmaps不是一种数据类型,实际上是对位操作的字符串(key-value),其通过操作二进制位来进行记录,只有0 和 1 两个状态,可以应用在统计用户每日打卡情况。
基本操作
setbit key offset value
设置offset和value必须 为Integer类型,且value只能取 0 或 1
getbit key offset
bitcount key [start end]
统计指定范围内value取值为1的数量,-1标识最后一个位 -2表示倒数第二个位
bitop AND|OR|NOT|XOR destkey key [key...]
命令可以在不同的字符串之间执行按位运算,提供的位运算有逻辑并、逻辑或、逻辑异或,并将结果保存到destkey中。
bitpos key bit [start] [end]
查找指定范围内为0或1的第一位。
每个用户当月出勤记录存放在Bitmaps中,出勤记作1,没有出勤记作2,用偏移量作为用户的ID
设置键的第offset个位的值(从0开始),一周7天,假设1、2、3出勤
设置出勤情况 第一周123出勤 1出勤 0未出勤 127.0.0.1:6379> setbit flag 1 1 (integer) 0 127.0.0.1:6379> setbit flag 2 1 (integer) 0 127.0.0.1:6379> setbit flag 3 1 (integer) 0 127.0.0.1:6379> setbit flag 4 0 (integer) 0 127.0.0.1:6379> setbit flag 5 0 (integer) 0 查看周二的出勤情况 127.0.0.1:6379> getbit flag 2 (integer) 1 统计一周出勤天数 127.0.0.1:6379> bitcount flag (integer) 3 -1标识最后一个位 -2表示倒数第二个位 127.0.0.1:6379> bitcount flag 0 -1 (integer) 3 设置出勤情况 第二周345出勤 127.0.0.1:6379> setbit flag2 1 0 (integer) 0 127.0.0.1:6379> setbit flag2 2 0 (integer) 0 127.0.0.1:6379> setbit flag2 3 1 (integer) 0 127.0.0.1:6379> setbit flag2 4 1 (integer) 0 127.0.0.1:6379> setbit flag2 5 1 (integer) 0 查看第一周第二周都出勤的天数 127.0.0.1:6379> bitop and flag1 flag (integer) 1 查看同时出勤的日期 127.0.0.1:6379> bitop and result flag flag2 (integer) 1 127.0.0.1:6379> getbit result 3 (integer) 1 127.0.0.1:6379> getbit result 2 (integer) 0 127.0.0.1:6379> getbit result 1
HyperLogLog
求集合中不重复元素个数的技术问题,如独立IP数,搜索记录数等需要去重和计数的问题
基数:例如有两个集合A、B他们的内容分别为A{1、3、5}
、B{2、4、4、6、8}
,那么这集合A的基数就是3、集合B的基数就是4
解决方案:
常用操作
pfadd key element1 element2 [element...]
添加1个或n个element到指定key对应的集合中
pfmerge destkey sourcekey1 sourcekey2 [sourcekey....]
合并n个指定的元素的基数到指定的destkey元素的基数中(取并集)
pfcount key
统计指定key中对应的基数值(自动去重
127.0.0.1:6379> PFADD program "java" (integer) 1 127.0.0.1:6379> PFADD program "python" (integer) 0 127.0.0.1:6379> PFCOUNT program (integer) 2 加了重复的数据,查到的基数个数还是2 127.0.0.1:6379> PFADD program "java" (integer) 0 127.0.0.1:6379> PFCOUNT program (integer) 2 kk 加入a b 127.0.0.1:6379> PFADD kk "a" (integer) 1 127.0.0.1:6379> PFADD kk "b" (integer) 1 127.0.0.1:6379> PFCOUNT kk (integer) 2 合并kk和program 127.0.0.1:6379> PFMERGE merge kk program OK 127.0.0.1:6379> PFCOUNT merge (integer) 4
Geospatial
Geospatal是Redis3.2.0版本推出的一个数据结构,通过他可以将用户给定的地理位置信息存储起来,并对这些信息进行操作,用来实现如计算两个位置之间的距离、查找附近的人这类依赖于地理位置信息的功能,Geospatal底层是zset通过来实现的。
基本操作
geoadd key longitude(经度) latitude(纬度) member(名称) [longitude latitude member ...]
将指定经纬度的地理位置及其名称添加到指定的zset集合中,支持一次添加多个,该命令的返回值为添加到zset有序集合的数目。如添加一个经纬度为116.413384 39.910925
(表示潮州的经纬度,经纬度之间以空格分开)到key为cityzset集合中,如下
geopos key member [member ...]
根据key、member名称获取指定的经纬度
geodist key member1 member2 [m|km|ft|mi]]
返回两个给定位置之间的距离,可以应用在求两个地理位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。其中指定单位的参数 unit 必须是以下单位的其中一个(默认为m):
m
表示单位为米。km
表示单位为千米。mi
表示单位为英里。ft
表示单位为英尺。示例: 计算广州和北京之间的距离。
georadius key longitude(经度) latitude(纬度) radius [m|km|ft|mi]] [withcoord] [withdist]
通过该命令可以实现以给定的经纬度为中心,找出指定半径内的元素member,如可以应用在查找附近的人。georadiusbymember key member radius [m|km|ft|mi]] [withcoord] [withdist]
找出指定元素周围的其他元素,与上一条命令不同的是,georadiusbymember是根据member和指定的查找距离radius来搜索,并将查找结果保存到另外的集合中。zrem key member [member ...]
geo的底层是zset,因此可以用zrem key member
来删除指定的member元素zrange key min max
查看指定key中对应的所有member元素geoadd添加,支持批量添加 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai (integer) 1 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen (integer) 2 取得经纬度 127.0.0.1:6379> GEOPOS china:city shanghai 1) 1) "121.47000163793563843" 2) "31.22999903975783553" 获取两个位置的直线距离 单位km 127.0.0.1:6379> geodist china:city shanghai chongqing km "1447.6737" 找出指定半径内元素的member 127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km 1) "chongqing" 2) "shenzhen" 找到key中所有member 127.0.0.1:6379> zrange china:city 0 -1 1) "chongqing" 2) "shenzhen" 3) "shanghai" 删除指定的member元素 127.0.0.1:6379> ZREM china:city shanghai (integer) 1 127.0.0.1:6379> zrange china:city 0 -1 1) "chongqing" 2) "shenzhen"