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 解决方案:
- mysql的distinct count 计算不重复个数
- Redis提供的hash、st、bitmaps等数据结构来处理
但是以上解决方案随着数据量不断增加,太消耗内存,故而使用hyperLogLog,它的优点在于在输入元素的数量或者体积非常大的时候,计算基数所需的空间总是固定的、并且是很小的。
常用操作
-
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"
|