Redis--三种新数据类型

image.png

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
解决方案:

  1. mysql的distinct count 计算不重复个数
  2. 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 表示单位为英尺。

示例: 计算广州和北京之间的距离。

image.png

  • 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"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值