字符串string 哈希hash 列表list 集合set 有序集合zset
1.String
常用操作
set key value //储存字符串键值对
mset key value[key value...] //批量储存字符串键值对
setnx key value //存入一个不存在的字符串key
get key value // 获取一个字符串键值对
mget key [key...] //批量获取字符串键值
del key [key...] 删除键
incr key //将该key的值原子加1
decr key //将该key的值原子减1
incrby key increment//为key储存的值加上增量increment 如果不存在则初始化为0
decrby key decrement //为key储存的值减去增量increment
应用场景
对象缓存
1)set user:1 value(json数据格式)
2)mset user:1:name abin user:1:age 185 //推荐使用第二种
mget user:1:name user:1:age
分布式锁
setnx product:100 true //插入一个键返回一表示成功返回0表示识别
del product:100 //删除该键
set product:100 true ex 10 nx //为product:100 设置一个超时时间,配合业务代码手动释放,存在10秒业务未完成问题
计数器
incr articlere:readcount:{id} //记录某文章转发量,点赞量
分布式系统全局序列号
incrby id 100 //某服务记录id到100
2.Hash
常用操作
hset key field value //存储一个哈希表为key键值
hsetnx key field value //存储一个不存在的哈希表为key的键值
hmset key field value [field value...] //在一个哈希表key中存储多个键值
hget key field // 获取哈希表key中field的值
hmget key field [field...] // 获取哈希表key中多个field的值
hlen key //返回哈希表key中field的数量
hdel key field [field...] //删除哈希表key中的field键值
hgetall key //返回哈希表key中所有键值
hincrby key field increment //为哈希表key中field键存储的值加上增量increment
应用场景
对象缓存
hmset user {userId}:name abin {userId}:age 18
hmget user {userId}:name {userId}:age
hmset user 1:name abin 1:age 18
hmget user 1:name 1:age
购物车
1)以用户id为key
2)商品id为field
3)商品数量为value
操作
1)hset cart:100 10086 1 //添加商品
2)hincrby cart:100 10086 1 //增加10086商品的数量
3)hincrby cart:100 10086 -1 //减少10086商品的数量
4)hgetall cart:100 //获取购物车所有商品
5)hlen cart:100 //获取商品总数
6)hdel cart:100 10086 //删除商品
hash数据结构
优点
1.同类数据归类整合存储,方便业务,方便数据管理
2.相比string操作内存与cpu的代价更小
3.相比string更节省空间
缺点
1.过期功能不能用在某个field上只能用在key上
2.在RedisCluster集群架构模式下不适合大规模使用,例如某个商品热点商品的信息都在某个槽位
3.List
常用操作
lpush key value [value...] //将一个或多个值插入key列表的表头(左边)
rpush key value [value...] //将一个或多个值插入key列表的表尾(右边)
lpop key //从表头(左边)移除并拿元素
rpop key //从表尾(右边)移除并拿元素
lrange key start stop //返回列表key中指定区间的元素,从左到右,start stop指定偏移量
blpop key [key...] timeout //从key表头左边弹出一个元素,如果没有则阻塞timeout秒 如果timeout=0则一直阻塞
brpop key [key...] timeout//从key表头右边弹出一个元素,如果没有则阻塞timeout秒 如果timeout=0则一直阻塞
常用数据结构
Stack(栈) =LPUSH + LPOP 或RPUSH + RPOP
Queue(队列)= LPUSH + RPOP 或 RPUSH + LPOP
Blocking Queue(阻塞队列) = LPUSH + BRPOP 或 RPUSH + BLPOP
应用场景
微信公众号消息订阅和微博订阅同理
例如:
我关注了笔吧测评室
1.笔吧测评室发消息 消息ID为1010
发布则是 lpush msg:{xx-id} 1010
拿则是 lpop msg:{xx-id}
因为订阅号都是最新消息在上,估可以看做是一个栈结构
查看最新的消息直接从左侧拿
lrange msg:{xx-id} 0 1
4.set集合
常用操作
sadd key member [member...] // 往一个key集合里面存入元素,若元素存在则忽略,key不存在则新建
smembers key // 获取当前key集合的所有元素
scard key // 获取当前集合的个数
sismember key member // 判断当前集合是否存在某元素
srem key member [member...] // 删除key集合的某些元素
spop key [count] // 从当前集合中随机选出count个元素,并从key集合中删除
srandmember key [count] // 从当前集合中随机选出count个元素,不删除
sinter key [key]... // 交集运算
sunion key [key...] // 并集运算
sdiff key [key...] // 差集运算
sinterstore destination key [key...] // 把交集运算的结果组成一个新的集合
sunionstore destination key [key...] // 把并集运算的结果组成一个新的集合
sdiffstore destination key [key...] // 把差集运算的结果组成一个新的集合
应用场景
抽奖程序
1.点击参与抽奖加入集合
sadd key {userId}
2.查看参与抽奖的所有用户
smembers key
3.抽取count名奖品
srandmember key [count] / 可重复获奖
spop key [count] / 不可重复获奖
点赞功能
1.点赞
sadd like:{消息ID} {用户ID}
2.取消点赞
srem like:{消息ID} {用户ID}
3.检查用户是否点过赞
sismember like:{消息ID} {用户ID}
4.获取点赞的用户列表
smembers like:{消息ID}
5.获取该消息点赞的用户数
scard like:{消息ID}
实现常见的账号关注功能
1.我关注的人
binset --> {user1,user2,user3}
2.user关注的人
userset–>{user4,user5,user1}
3.user1关注的人
user1set–>{user,bin,user3,user6,user7}
4.我跟user共同关注的人
sinter binset userset–> {user1}
5.我关注的人也关注他
sismember binset user1
sinter binset user1set -->{user3}
6.我可能认识的人
sunionstore newset binset userset --> newset{user1,user2,user3,user4,user5}
sdiff newset binset --> {user4,user5}
实现一个搜索功能
sadd brand:iPhone iphone14
sadd brand:huawei P50
sadd brand:oppo Reno8
sadd rom:512GB iphone14 P50
sadd ram:768MB P50 Reno8
sinter rom:512GB ram 768MB–>P50 //搜索rom为512GB ram为768MB的产品
5.zset有序集合
常用操作
zadd key score member[ [score member] ...] // 往有序集合key中添加带分值的元素
zrem key member [member...] // 从有序集合key中删除元素
zscore key member // 返回有序集合key中元素member的分值
zcard key // 返回有序集合key中的元素个数
zincrby key increment member // 为有序集合key中元素member的分值加上increment
ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素
ZUNIONSTORE destkey numkeys key [key ...] //并集计算
ZINTERSTORE destkey numkeys key [key …] //交集计算
应用场景
1.微博热搜
1.zet集合实现排行榜
1.点击新闻
ZINCRBY hotNews:20220923 1 端牢中国人的饭碗
2.展示当日排行前十
ZREVRANGE hotNews:20220923 0 9 WITHSCORES
3.七日搜索榜单计算
ZUNIONSTORE hotNews:20220917-20220923 7
hotNews:20220917 hotNews:20220918 ... hotNews:20220923
4.展示七日排行前十
ZREVRANGE hotNews:20220917-20220923 0 9 WITHSCORES