键(key)
常用命令
1. 字符串(String)
1.1 基本命令
- set key value
如下:设置kv键值对,存货时长为30秒
- get key
- mset key value [key value ...]
- mget key [key ...]
同时设置或者获取多个键值对
- getrange
获取指定区间范围内的值,类似between......and的关系
从零到负一表示全部
- setrange
设置指定区间范围内的值,格式是setrange key值 具体值
- setnx key value
- setex 设置带过期时间的键
- setex 键 秒 值
1.3 应用场景
- 视频点赞
- 是否喜欢文章
2. 列表(List)
2.1 简介
单key多value
2.2 常用命令
2.3 应用场景
- 微信公众号消息订阅
3. 哈希(Hash)
3.1 简介
kv模式不变,但是v是一个键值对
3.2 常用命令
4. 集合(Set)
4.1 简介
单键多value且value无重复
4.2 常用命令
4.3 应用场景
- 微信小程序抽奖
- 微信朋友圈点赞查看同赞好友
- QQ推可能认识的朋友
5. 有序集合(Zset)
5.1 简介
在set基础上添加一个score分数
之前是set k1 v1 v2 ...
现在是Zset k1 score1 v1 score2 v2 ...
5.2 常用命令
5.3 应用场景
- 排行榜展示
6. 位图(bitmap)
6.1 简介
说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型
位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)。
Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32 = 4294967296)
概括
位图就是由0和1状态表现的二进制位bit数组
6.2 需求场景
- 用户每日登录
- 用户每日是否点击广告
- 钉钉签到,上班打卡
6.3 基本命令
- setbit
setbit key offset value
含义:将key位图偏移量为offset的数据设为value
key:要操作的位图键名
offset:操作该位图哪一位的数据(数据偏移量)
value:只能是0或者1
- getbit
getbit key offset
含义:获取key位图偏移量为offset上的value值
key:要操作的位图键名
offset:偏移量
- strlen
strlen key
含义:获取key位图所占用的字节大小
返回8的整数位,因为8bit等于1字节,位图按照字节进行扩容
如:此时该位图开辟到第九个bit位空间时,将返回2字节即该位图空间占用为2字节
- bitcount
bitcount key
含义:统计key位图上所有bit位值为1的总和进行返回
- bitop
bitop and key key1 [key2 ...]
含义:将key1、key2等等key中内容一样的值统计到key中,后通过bitcount可查到内容一样的值有多少
如下:将用户2001和2002中同一个bit位中值一样的数据统计到k2中,后通过bitcount命令返回k2存的值
127.0.0.1:6379> setbit 2001 0 1
(integer) 0
127.0.0.1:6379> setbit 2001 1 1
(integer) 0
127.0.0.1:6379> setbit 2001 2 1
(integer) 0
127.0.0.1:6379> setbit 2001 3 1
(integer) 0
127.0.0.1:6379> setbit 2002 2 1
(integer) 0
127.0.0.1:6379> setbit 2002 3 1
(integer) 0
127.0.0.1:6379> setbit 2002 4 1
(integer) 0
127.0.0.1:6379> bitop and k2 2001 2002
(integer) 1
127.0.0.1:6379> bitcount k2
(integer) 2
7. 基数统计(HyperLogLog)
7.1 简介
基数统计:用于统计数据集中去重后剩余的元素个数
7.2 需求场景
- 统计某个网站的uv,某个文章的uv
uv:unique visitor独立访客,可理解为用户IP
为防止某些用户进行刷单或者刷访问量即可用到基数统计,将所有uv相同的去重后统计进行统计
7.3 基本命令
127.0.0.1:6379> pfadd p1 1 1 1 2 3 4 #将数据添加到类型为HyperLogLog的p1中
(integer) 1 #返回1为true
127.0.0.1:6379> pfadd p2 2 2 2 2 3
(integer) 1
127.0.0.1:6379> pfcount p1 #去重
(integer) 4 #去重后的实际个数
127.0.0.1:6379> pfcount p2
(integer) 2
127.0.0.1:6379> pfmerge destkey p1 p2 #将p1和p2结果集合并到名为destkey的结果集中
OK
127.0.0.1:6379> pfcount destkey
(integer) 4
8. 地理空间(GEO)
8.1 简介
移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、高德地图附近的核酸检查点等等,那这种附近各种形形色色的XXX地址位置选择是如何实现的?
地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。
例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,
然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆
使用如下SQL即可:
select taxi from position where x0-r < x < x0 + r and y0-r < y < y0+r但是这样会有什么问题呢?
1.查询性能问题,如果并发高,数据量大这种查询是要搞垮数据库的
2.这个查询的是一个矩形访问,而不是以我为中心r公里为半径的圆形访问。
3.精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差
8.2 基本命令
- GEOADD
多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定key中
- GEOPOS
从键里面返回所有给定位置元素的位置(经度和纬度)
- GEODIST
返回两个给定位置之间的距离
- GEORADIUS
以给定经纬度为中心,返回与中心距离不超过最大指定距离的所有元素
- GEOHASH
weixinwei'xin
9. 流(Stream)
9.1 简介
Redis版的MQ消息中间件+阻塞队列
实现消息队列,支持消息队列持久化、支持自动生成全局唯一id、支持ack消息确认模式、支持消费组模式,让消息队列更加安全可靠
一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容
1 | Message Content | 消息内容 |
2 | Consumer group | 消费组,通过XGROUP CREATE 命令创建,同一个消费组可以有多个消费者 |
3 | Last_delivered_id | 游标,每个消费组会有个游标 last_delivered_id,任意一个消费者读取了消息都会使游标 last_delivered_id 往前移动。 |
4 | Consumer | 消费者,消费组中的消费者 |
5 | Pending_ids | 消费者会有一个状态变量,用于记录被当前消费已读取但未ack的消息Id,如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为 PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有 ack (Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理 |
9.2 基本命令
- 队列相关指令
- 消费组相关指令
四个特殊符号
- - + 表示最小和最大出现的id
- $ 表示只消费新的消息,当前流中最大id,可用于将要到来的消息
- > 表示从第一条尚未被消费的消息进行读取
- * 用于XADD命令中,自动生成id,类似于MySQL中的自增id
10. 位域(bitfield)
了解即可
常用命令