陪你一起学redis(七)——redis的补充数据类型

195 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

优势

  1. 以统计活跃用户为例,每个用户id占用空间为1bit,消耗内存非常少,存储1亿用户量只需要12.5M
  2. 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

image.png

image.png

使用场景

  1. 统计年活跃用户数量
  2. 统计三天内活跃用户数量
  3. 统计连续三天访问的用户数量
  4. 三天内没有访问的用户数量
  5. 统计在线人数

HyperLogLog

简介

HyperLogLog类似set的使用方法,可以接受元素添加,并给出key包含的唯一元素的近似数量。HyperLogLog占用的空间固定,12k左右,可以估算出大约2^64个元素的基数。HyperLogLog本身不存储元素,不能获取从中获取元素。

优势

HyperLogLog占用的空间固定,12k左右,可以估算出大约2^64个元素的基数,占用空间比较小

劣势

就是只能统计基数数量,而没办法去知道具体的内容是什么

简单使用

HyperLogLog主要有三个命令:

  • pfadd: 添加指定元素到 HyperLogLog 中
  • pfcount: 返回给定 HyperLogLog 的基数估算值。
  • pfmerge: 将多个 HyperLogLog 合并为一个 HyperLogLog

image.png

使用场景

  1. 记录网站IP注册数
  2. 统计每日访问的IP数
  3. 页面实时UV
  4. 在线用户人数

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

image.png

使用场景

  1. 来实现附近的人
  2. 计算最优地图路径

结束

需要交流学习可以关注公众号【温故知新之java】,互相学习,一起进步