Redis十大基本数据类型
总览:
-
数据类型是指value的数据类型,key的数据类型固定为String
-
Redis命令不区分大小写,但是key区分大小写,因为key是唯一的
-
都是一些命令,不懂的直接在官网上搜,里面的参数都有解释 https://redis.io/docs/latest/commands
-
例如String里面的set
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
-
-
哪几种数据类型:
字符串String
-
单值单value
-
案例
-
最常用
-
SET key value
EX 设置过期时间 ms
TTL 查看剩余多少时间过期
DEL 删除指定的key
KEEPTTL String类型重新set后会默认重置过期时间为-1,保持当前的有效时间(-1长期有效,-2已经过期)
-
GET key
-
-
同时获取多个建值
-
MSET key value [key value…]
-
MGET key [key…]
-
MSET/MGET/MSETNX
MSETNX 如果其中一个键存在,那其他不存在的键也会设置失败
-
-
数值增减
-
一定要数字才能加减
-
递增数字
INCR key
-
增加指的整数
INCRBY key increment
-
递减数值
DECR key
-
减少指定的整数
DECRBY key decrement
-
-
获取字符串长度和内容追加
-
STRLEN key
-
APPEND key value
-
分布式锁
-
SET lock pay ex 10 NX
如果lock键不存在则设置过期时间为10s,否则设置失败,只有过期了才能设置,保证在有效期内只有一个线程对其访问。
-
-
先get后set
-
-
-
使用场景
- 无限点赞,每点一次加一次
- 是否喜欢的文章
- 键名 user:{userId}:like:article:{articleId} 其中,{userId} 表示用户的 ID,{articleId} 表示文章的 ID。这样可以保证每个用户和文章组合都有唯一的键。
- 值 1 表示用户喜欢这篇文章; 0 表示用户不喜欢或取消了喜欢。
列表List
-
单key多value
-
底层是一个双向链表,对两端的元素操作效率高点,通过索引下标来操作中间的元素性能会较差
-
案例
-
LPUSH / RPUSH key [element…] / LRANGE key start stop
左插入 / 右插入 / 查看指定范围的列表内容
-
LPOP / RPOP key
左出列 / 右出列
-
LINDEX key index
查看指定索引的value值
-
LLEN key
查看指定list的长度
-
LREM key count element
移除指定队列的已有元素,count 指定移除多少个,从左往右删除
-
LTRIM key start stop
对指定队列进行截取,保存到原有队列
-
RPOPLPUSH sourcelist destination
将源数据列表元素右出列,把元素左入列放到目标列表中,一条语句
-
LSET key index value
-
LINSERT key before / after element value
-
-
使用场景
-
微信公众号订阅消息
将用户的订阅号信息push进用户的队列中 LPUSH likearticle:{userid} 11 22
出栈显示 LRANGE likearticle:{userid} 0 9
-
哈希Hash
-
KV模式不变,但是V是一个键值对
Map<String,Map<String,Object>>
-
案例
- HSET / HMSET key field value [field value …]
- HGET key field
- HMGET key field1 field2…
- HGETALL key
- HDEL key field
- HLEN key
- HEXISTS key field
- HKEYS key
- HVALS key
- HINCRBY / HINCRBYFLOAT key field increment
- HSETNX key filed value
- HGETALL key
-
应用场景
-
早期购物车使用场景
-
添加商品进入购物车
HSET shopcar:uid1024 334488 1
HSET shopcar:uid1024 334477 1
-
修改商品数量
HINCRBY shopcar:uid1024 334477 1
-
获取商品总量
HLEN shopcar:uid1024
-
-
集合Set
-
单值多value, 且无重复
-
案例
-
SADD key member [member … ]
没有就创建,有就添加 ,默认去重,不能添加重复的元素
-
SMEMBERS key
查看指定集合中的所有元素
-
SISMEMBER key member
查看指定元素在指定集合中是否存在
-
SREM key member [member … ]
删除指定集合中的一个或多个元素
-
SCARD key
统计指定集合中的元素个数
-
SRANDMEMBER key [count]
随机读取指定个数的集合中的元素,不会删除读取的元素
-
SPOP key [count]
随机出栈指定个数的集合元素,会删除元素
-
SMOVE source destination member
将源集合指定元素移动到目标集合中
-
SDIFF key [key …]
求差集,(含头不含尾),如SDIFF A B 则在A内不在B内的元素
-
SUNION key [key …]
求集合的并集
-
SINTER key [key …]
求集合的交集
-
SINTERCARD numkeys key [key …] [ LIMIT limit ]
返回指定集合的交集个数,numkeys – 集合的个数,LIMIT – 查询的个数,如果到了指定数量,就不在比下去了;(SINTERCARD 2 A B LIMIT 1 : 查A B的交集,如果满足条件则加1,到了1就不在继续查下去了 )
-
-
应用场景
-
微信抽奖小程序
参与抽奖,SADD key {userid}
统计有多少人参与,SCARD key
抽奖,SRANDMEMBER key {number}
-
微信朋友圈点赞,查看同赞朋友
新增点赞,SADD pub:msgid {userid1} {userid2}
取消点赞,SREM pub:msgid {userid}
展现所有点赞过的用户 SMEMBERS pub:msgid
点赞用户数统计 SCARD pub:msgid
判断某个朋友是否对楼主点赞过 SISMEMBER pub:msgid {userid}
-
QQ上推可能认识的人
A用户的好友 SADD A {userid1} {userid2} { … }
B用户的好友 SADD B {userid1} {userid2} { … }
可能认识的好友 SDIFF A B
-
有序集合Zset
-
在Set的基础上,每个val 值前加一个score的分数值,之前Set是k1 v1 v2 v3。现在zset是k1 score1 v1 score2 v2 score3 v3
-
案例
-
ZADD key score member
-
ZRANGE key start stop [withscores]
根据score从小到大排列
-
ZREVRANGE key start stop [withscores]
根据score从大到小排列
-
ZRANGEBYSCORE key min | max
根据score范围来查找 Zset 中的val
-
ZSCORE key member
根据member来查找对应的score
-
ZREM key member
-
ZINCRBY key increment member
-
ZCOUNT key min max
查找在[min,max]范围的member个数
-
ZMPOP numkeys key min|max count num
出栈多个元素,min从小开始,count 指定出栈元素个数
-
ZRANK key member
获取member下标,顺序
-
ZREVRANK key member
获取member下标,反序
-
-
应用场景
-
商品销售数量排行榜
定义商品销售排行榜key为goods:sellsort,分数为商品销售数量
添加销售数据,ZADD goods:sellsort 9 1001 15 1002
销量增加,ZINCRBY goods:sellsort 2 1001
展示销售前10名,ZRANGE goods:sellsort 0 9 withscores
-
Redis位图 Bitmap
-
由0 和 1 状态表现的二进制位的bit数组
-
应用场景
- 用户是否登入过,比如京东每日签到送京豆
- 电影、广告是否被点击过
- 钉钉打卡上下班,签到统计
-
基本命令
-
SETBIT key offset value
offset是从 0 开始算的,如果没设置值,则默认是0
-
GETBIT key offset
-
STRLEN key
Bitmap 本质上是String 所以对String 的命令,对bitmap 也有效
-
BITCOUNT key
统计1的个数
-
BITOP and|or|xor|not destkey key [ key … ]
对两个bitmap进行运算结果存到destkey中
-
Redis基数统计 HyperLogLog
-
去重脱水后的数据
-
案例
-
PFADD key [element [elment … ]]
添加元素
-
PFCOUNT key
统计有多少个唯一的元素
-
PFMERGE destkey [sourcekey [sourcekey … ]]
合并两个sourcekey,去重后添加到destkey
-
-
主要用途,统计网站的UV(独立访客)
Redis地理空间 GEO
-
表示一个位置的经纬度
-
案例
-
应用场景
-
GEOADD key longitude latitude member
-
GEOPOS key member
获取member的经纬度
-
GEOHASH key member
获取member的hash
-
GEORADIUS key longitude latitude radius [withdist [withcoord [withhash [count num [desc ]]]]]
根据经纬度来查看指定半径之内的地方
-
GEORADIUSBYMEMBER key member radius
根据地点名称来查看指定半径之内的地方
-
Redis 中的 Stream
-
是什么
Message content 消息内容
Consumer group 消费组,一个消费组里面有多个消费者,只要一个消费者读取了队列中的信息,并且客户端返回来ack后,其他消费者就不会在去消费这条消息。
Consumer 消费者
Last_delivered_id 每个消费组里面都有个独立的游标(last_delivered_id),用来记录当前消费组消费的信息id, 每被消费组里面的消费者消费一条消息后,游标都会往前移。
Pending_ids 用来记录消息队列中被消费组读取的信息id,每个消费者都是独立的pending_ids,但是同一个消费组共享一个pending entries list ,这个pel存储量消费组里所有待确认的信息。
-
基本命令
-
队列相关指令
-
消费组相关指令
-
四个特殊符号
-
-
实操
-
XADD 键名 消息id(一般写*,让Redis自动生成,也可以自己写,但是有格式要求,如图 时间戳-该时间戳下的第几条数据 ) 字段名 字段值
-
XRANGE 键名 - + count 2
从小到大排列 count显示数量
-
XREVRANGE 键名 + - count 2
从大到小排列
-
XDEL 键名 消息id
-
XLEN 键名
返回消息个数
-
XTRIM 键名 maxlen|minid len|msgid
Maxlen len 允许的最大长度,截取指定长度len
Minid msgid 截取大于等于msgid的部分
-
XREAD 读消息
-
阻塞
XREAD count 1 block 0 STREAMS msgstream $
$ 阻塞读取比最大id还大的消息,0 一直阻塞,20阻塞20ms
新消息一插入,右边消费者立马读取
-
非阻塞
XREAD count 1 streams msgstream 0-0
0-0 从最小的开始读取
-
-