持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
前言
你可能知道redis的基本数据类型,比如string,hash,list,set,sortedSet,但是你知道redis的补充数据类型吗?今天这篇文章我们一起来了解一下。
BitMap
简介
BitMap就是通过一个bit位来表示某个元素对应的值或者状态, 其中的key就是对应元素本身,实际上底层也是通过对字符串的操作来实现。Redis从2.2版本之后新增了setbit,getbit, bitcount等几个bitmap相关命令。虽然是新命令,但是本身都是对字符串的操作,我们先来看看语法:
## 其中 offset 必须是数字,value 只能是 0 或者 1
SETBIT key offset value
优势
- 以统计活跃用户为例,每个用户id占用空间为1bit,消耗内存非常少,存储1亿用户量只需要12.5M
- bitmap可以做布隆过滤器,确认访问值是否存在,只要在布隆过滤器里值是0后面的服务就别访问了
简单使用
## 用户100,101,102在06月14日登录系统
setbit login_06_14 100 1
setbit login_06_14 101 1
setbit login_06_14 102 1
## 用户100,101在06月13日登录系统
setbit login_06_13 100 1
setbit login_06_13 101 1
## 统计06月13日登录系统的人数
bitcount login_06_13
## 统计06月14日登录系统的人数
bitcount login_06_14
## 统计06月13日和06月14日连续登录系统的人数
bitop and login_in_06_13_14:and login_06_13 login_06_14
bitcount login_in_06_13_14:and
## 统计06月13日和06月14日任意一天登录系统的人数
bitop or login_in_06_13_14:or login_06_13 login_06_14
bitcount login_in_06_13_14:or
使用场景
- 统计年活跃用户数量
- 统计三天内活跃用户数量
- 统计连续三天访问的用户数量
- 三天内没有访问的用户数量
- 统计在线人数
HyperLogLog
简介
HyperLogLog类似set的使用方法,可以接受元素添加,并给出key包含的唯一元素的近似数量。HyperLogLog占用的空间固定,12k左右,可以估算出大约2^64个元素的基数。HyperLogLog本身不存储元素,不能获取从中获取元素。
优势
HyperLogLog占用的空间固定,12k左右,可以估算出大约2^64个元素的基数,占用空间比较小
劣势
就是只能统计基数数量,而没办法去知道具体的内容是什么
简单使用
HyperLogLog主要有三个命令:
- pfadd: 添加指定元素到 HyperLogLog 中
- pfcount: 返回给定 HyperLogLog 的基数估算值。
- pfmerge: 将多个 HyperLogLog 合并为一个 HyperLogLog
使用场景
- 记录网站IP注册数
- 统计每日访问的IP数
- 页面实时UV
- 在线用户人数
Geospatial
简介
Geospatial底层数据结构 Zset GEOADD GEODIST GEOHASH GEOPOP GEOPADUIS GEORADIUSBYMEMBER 可以用来保存地理位置,并作位置距离计算或者根据半径计算位置等。有没有想过用Redis来实现附近的人?或者计算最优地图路径?Geo本身不是一种数据结构,它本质上还是借助于Sorted Set(ZSET)
简单使用
GEOADD key 经度 维度 名称 把某个具体的位置信息(经度,纬度,名称)添加到指定的key中,数据将会用一个sorted set存储,以便稍后能使用GEORADIUS和GEORADIUSBYMEMBER命令来根据半径来查询位置信息。
## 添加上海和北京的经纬度到cities这个key中
GEOADD cities 116.404269 39.91582 "beijing" 121.478799 31.235456 "shanghai"
## 打印cities这个key中的所有元素
ZRANGE cities 0 -1
## cities这个key中的所有元素并带上打分
ZRANGE cities 0 -1 WITHSCORES
## 计算北京和上海的距离,单位事千米
GEODIST cities beijing shanghai km
## 打印出上海和北京的经纬度
GEOPOS cities beijing shanghai
## 打印出cities这个key中距离(120,30)这个经纬度500KM之内的元素
GEORADIUS cities 120 30 500 km
## 添加杭州的经纬度到cities这个key中
GEOADD cities 120.165036 30.278973 hangzhou
## 打印出cities这个key中距离上海度200KM之内的元素
GEORADIUSBYMEMBER cities shanghai 200 km
使用场景
- 来实现附近的人
- 计算最优地图路径
结束
需要交流学习可以关注公众号【温故知新之java】,互相学习,一起进步