Redis数据结构
# Redis数据结构
命令不区分大小写,Key区分大小写
help @数据结构:查看指令
# 1 String
🔶 介绍:简单动态字符串(SDS),通过key获得value
🔶 普通命令
设置:set <key> <value>
获取:get <key>
批量设置:mset <k1> <v1> <k2> <v2> ...
批量获取:mget <k1> <k2> ...
递增数字:INCR <key>
增加指定的整数:INCRBY <key> <increment>
递减数字:DECR <key>
递减指定的整数:DECRBY <key> <increment>
获取字符串长度:STRLEN key
2
3
4
5
6
7
8
9
🔶 分布式命令
setnx <key> <value>
不存在创建,存在不创建
set <key> <value> [EX seconds] [PX milliseconds] [NX|XX]
EX: key在多少秒之后过期
PX: key在多少毫秒之后过期
NX: 当key不存在的时候,才创建key,等效于setnx
XX: 当key存在的时候,覆盖key
SET k1 v1 NX PX 3000 当key不存在的时候才能创建,过期时间为3000ms
🔶 应用场景:一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等等。或者封锁一个IP地址。
incr likes:001 统计001的点赞数量
get likes:001 获取001的点赞数量
2
# 2 Hash
🔶 介绍:等价于Java的Map<String, Map<...>>
设置一个字段值:HSET <key> <field> <value>
获取一个字段值:HGET <key> <field>
设置多个字段值:HMSET <key> <field> <value> [<field> <value> ...]
获取多个字段值:HMGET <key> <field> <value> [<field> <value> ...]
获取所有字段值:hgetall <key>
获取某个key的属性数量:hlen <key>
删除某个key:hdel <key>
2
3
4
5
6
7
🔶 应用场景:
系统中对象数据存储,比如用户信息(id,name,age)
购物车
- 新增商品 hset shopcar:uid1024 334488 1
- 新增商品 hset shopcar:uid1024 334477 1
- 增加商品数量 hincrby shopcar:uid1024 334477 1
- 商品总数 hlen shopcar:uid1024
- 全部选择 hgetall shopcar:uid1024
# 3 List
🔶 介绍:实现双向链表
压入:lpush/rpush <key> <value> [<value> ...]
弹出:lpop/rpop <key>
显示全部:lrange <key>
2
3
🔶 应用场景:发布与订阅、消息队列、慢查询、实现最新消息的排行。
关注公众号A和B,只要他们发布新文章就会压入到我的list中
lpush followaccount:uid1024 公众号A的文章
lpush followaccount:uid1024 公众号B的文章 ...
我显示最近10条公众号消息:lrange followaccount:uid1024 0 10
# 4 Set
🔶 介绍:类似于Java的HashSet,无序,不重复
添加元素:SADD <key> <member> [<member> ...]
删除元素:SREM <key> <member> [<member> ...]
获取集合中所有的元素:smembers <key>
判断元素是否在集合中:sismember <key> <member>
获取集合中的元素个数:scard <key>
从集合中随机弹出x个元素,元素不删除:srandmember <key> [数字]
从集合中随机弹出x个元素,元素被删除:spop <key> [数字]
集合运算-差集-属于A但不属于B元素构成的集合:SDIFF key [key ...]
集合运算-交集-属于A也属于B元素构成的集合:SINTER key [key ...]
集合运算-并集-属于A或者属于B元素构成的集合:SUNION key [key ...]
2
3
4
5
6
7
8
9
10
🔶 应用场景:需要存放的数据不能删除以及需要获取多个数据源交集和并集等场景。
抽奖:抽一个获奖者 spop members 1,抽三个获奖者 spop members 3
好友:微博中每个人的好友存在Set中,可以防止重复
微博好友共同关注:sinter 用户1 用户2
微信朋友圈点赞
- 新增点赞:sadd pub:msgID 点赞用户ID1 点赞用户ID2 ...
- 取消点赞:srem pub:msgID 点赞用户ID1
- 展现所有点赞用户:smembers pub:msgID
- 点赞数:scard pub:msgID
- 判断某个朋友是否对楼主点赞:sismember pub:msgID 用户ID
QQ推荐可能认识的人:先用
sinter 用户1 用户2
看看共同好友,然后通过sdiff 用户1 用户2
找出用户2可能认识的人
# 5 Sorted Set
🔶 介绍:与set相比,增加了一个权重参数score,使集合中的元素能够按照score进行有序排列,还可通过score的范围来获取元素列表,像Java中HashMap和TreeSet的结合体。
添加元素:zadd <key> <score1> <member1> [<score2> <member2> ...]
按照元素分数从小到大的顺序,返回从start到stop之间的所有元素:zrange <key> start stop [WITHSCORES]
获取元素的分数:zscore <key> <member>
删除元素:zrem key member [member ...]
获取指定分数范围的元素:zrangebyscore <key> <min> <max> [WITHSCORES] [LIMIT offset count]
增加某个元素的分数:zincrby <key> <increment> <member>
获取集合中元素的数量:zcard <key>
获得指定分数范围内的元素数量:zcount <key> <min> <max>
按照排名范围删除元素:zremrangebyranke <key> <start> <stop>
2
3
4
5
6
7
8
9
🔶 应用场景:需要对数据根据某个权重进行排序的场景。比如再直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕信息等信息。
根据销售额对商品排序:
- 商品编号1001销量是9,商品编号1002销量是15:zadd goods:sellsort 9 1001 15 1002
- 客户买了2件1001:zincrby goods:sellsort 2 1001
- 商品销量前10:zrange goods:sellsort 0 10 withscores
# 6 Bitmap
🔶 介绍:存储二进制数字,只需要一个bit位来表示某个元素对应的值和状态,key是元素本身。
setbit <key> <offset> <value>
getbit <key> <offset>
2
🔶 应用场景:适合需要保存状态信息并需要进一步对这些信息进行分析的场景。如用户签到、活跃用户、用户行为统计(一周的签到情况,7位就行,通过bitcount sign 命令统计)
https://blog.csdn.net/DrLai/article/details/123767851