写目录
4.6 bitmap的常用命令
由 0 和 1 表示的二进制位的 bit 数组
- 用String类型作为底层数据结构实现的一种统计二值状态的数据类型
- 位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)
- Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2的32次方 = 4294967296)
SETBIT key offset value // 将第offset的值设为value value只能是0或1 offset 从0开始
GETBIT key offset // 获得第offset位的值
STRLEN key // 得出占多少字节 超过8位后自己按照8位一组一byte再扩容
BITCOUNT key // 得出该key里面含有几个1
BITOP and destKey key1 key2 // 对一个或多个 key 求逻辑并,并将结果保存到 destkey
BITOP or destKey key1 key2 // 对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destKey key1 key2 // 对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destKey key // 对key 求逻辑非,并将结果保存到 destkey
应用:
- 做签到很适合位图
- 每天使用1个1亿位的Bitmap约占12MB的内存(10^8/8/1024/1024),10天的Bitmap的内存开销约为120MB,内存压力不算太高。
- 在实际使用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录以节省内存开销。
- 对于电影和广告是否被点击播放过也可以用位图
4.7 HyperLogLog 的常用命令
介绍
- 去重复统计功能的基数估计算法就是 HyperLogLog
- 基数
- 是一种数据集,去重复后的真实个数
- 基数统计
- 用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算
- 只需要花费12KB内存,就能记录 2的64次方=18446744073709551616 个不同元素的基数
会有点误差0.81%
HyperLogLog只是计算基数,但不会存储元素本身
应用:
- 统计某个网页的UV、某个文章的UV
- UV Unique Visitor 独立访客,一般理解为客户端IP,需要去重
- 用户搜索网站关键词数量
- 统计用户每天搜索不同词条个数
4.8 GEO的常用命令
介绍
地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。
- 例如滴滴打车,最直观的操作就是实时记录更新各个车的位置
- 然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆
基本命令
经纬度去地图上复制
GEOADD //添加经纬度坐标
GEOPOS //返回经纬度
GEOHASH //返回坐标的 geohash 表示 (base32编码)
GEODIST //返回两个位置之间的距离
GEORADIUS //以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUSBYMEMBER //找出指定范围内的元素,中心点是由给定的位置元素决定
GEOADD 添加经纬度坐标
GEOPOS 返回经纬度
GEOHASH 返回坐标的 geohash 表示 (base32编码)
GEODIST 返回两个位置之间的距离
GEORADIUS 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUSBYMEMBER 找出指定范围内的元素,中心点是由给定的位置元素决定
应用:
- 美团附近的饭店、酒店
- 高德地图附近的店
4.9 Stream的常用命令
实现Redis消息队列的三个方式
- List实现消息队列
- Pub/Sub 发布订阅
- Stream流 (Redis版的MQ消息中间件+阻塞队列)
List实现消息队列,点对点模式
采用异步队列
Pub/Sub发布订阅
Redis 发布订阅(pub/sub)有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。而且也没有Ack机制来保证数据的可靠性,假设一个消费者都没有,那消息就直接被丢弃了。
Stream结构
Stream流实现消息队列,它支持消息的持久化、支持自动生成全局唯一 ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加的稳定和可靠
Stream结构是一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的ID和对应的内容
基本命令
队列相关指令
用同一个时间戳不能添加值
XDEL 根据主键(时间戳)删
XTRIM 截取Stream长度
XREAD
语法:
非阻塞
阻塞
总结:
消费组相关指令
XGROUP CREATE 创建消费者组
XREADGROUP GROUP 读取消费者组内的消息
同一组消费者不能消费同一条消息
不同消费组的消费者可以消费同一条消息
消费组的目的是 让组内的多个消费者共同分担读取消息,所以,我们通常会让每个消费组读取部分消息,从而实现消息读取负载在多个消息者间是均衡分布的。
重点问题:
XPENDING
已读取,但尚未确认
查看具体读取了哪些数据
XACK
XINFO
四个特殊符号
4.10 bitfield的常用命令
介绍
- 将很多小的整数存储到一个长度较大的位图中,又或者将一个非常庞大的键分割位多个较小的键来进行储存,从而高效利用内存
- 也就是将 Redis 字符串看作是一个 由二进制位组成的数组 并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
- 位域修改 和 溢出控制
基本命令
get
set
incrby
溢出控制
wrap循环溢出
sat
fall