Redis主要数据结构以及应用场景

String

最常用的各式,以k v格式进行存储
常用的场景在于对象json存储,以及对象缓存、分布式锁、计数器等。
SET KEY VALUE 存入字符串的键值对
MSET key value [key value ...]批量存储字符串键值对
SETNX key value 存入一个不存在的键值对,如果key已存在则无效。插入成功返回1,失败返回0 可以用于分布式锁。
GET key 根据key获取字符串value
MGET key 批量获取字符串
EXPIRE key seconds设置key的过期时间。
INCR key 值自增 + 1
DECR key 值自增 - 1
INCRBY key increment 值 + increment
DECRBY key decrement 值 - increment

直接单值缓存适合存储哪些不经常修改的对象,如果频繁修改则不适用,每次修改都会要重写写redis一遍,效率有点不好。
如果存储频繁修改的对象可以使用以下这种方式进行存储,这种方式可以可以灵活的对对象中的属性进行修改操作,但是如果key多了也不建议使用这种方式存储对象。
MSET user:1:name lyra user:1:balance 1888
MGET user:1:name user:1:balance

分布式锁,使用SETNX命令,如果拿到锁了返回1,如果没拿到锁返回0,执行完毕后删除该key,即可。之后避免程序中断未是否锁可以给key添加个过期时间。
点赞和session贡献也可以在这种场景下进行使用。

给分布式系统生成全局唯一的id
在分库分表场景下,可以在redis中记录每次生成的id是多少,下次去的时候 + 1即可,但是每次取一个,频繁取可以造成阻塞,可以批量取一批id存储到Java List之类的集合中,然后再进行设置。

Hash

以key filed value的方式进行存储,类似MSET user:1:name lyra user:1:balance 1888这种方式进行存储,但是比String类型效率高 存储空间少,优点是可以分类存储,如下图所示,将User分类的数据根据user key进行关联存储。
image
过期功能只能用在key上,也就是上图的user,无法用在filed上。
redis集群中不宜大规模使用,因为Hash是分片存储在一台机子上的,key只能存储在一台机器中,找数据的时候也只能在一台机器中找,别的机器没有数据,大量请求打在一台redis中,使得该机器压力变大。
HSET key filed value 存储一个hash key 字段 value
HSEXTNX key filed value [key filed value ...] 批量存储hash 键 字段 值
HGET key filed 根据key和字段获取value
HMGET key filed value [key filed value...] 批量根据key 字段 获取值
HDEL key filed 根据key filed删除hash中存储的一个键值对 删除成功返回1 删除失败返回0
HGETALL key 获取key中的所有键值
HLEN key 获取key下所存储的键值对数量
HINCRBY key filed increment 根据key和filed找到值并 + increment
image
例如这个购物网站
添加商品时可以使用 hset cart:1001 12 1,其中1001是用户id,12为商品id,1为商品数量。
增加数量可以使用HINCRBY cart:1001 12 1,其中1001是用户id,12为商品id,1为要增加的商品数量。
删除商品可以使用HDEL cart:1001 12,删除用户id为1001购物车下的商品id为12的商品。
获取购物车
获取购物车下的所有的商品可以使用HGETALL cart:1001

List

可以用于组成分布式队列/栈,Java自带的集合只能满足单机,无法进行分布式多机共享。
LPUSH key value 在list左边插入一个value值
RPUSH key value 在list右边插入一个value值
LPOP key 移除左边的一个元素
RPOP 移除右边的一个元素
可以使用上面四条排列组合形成一个先进先出和先进后出的数据结构。
BLPOP key timeout 从key列表左边弹出一个元素 如果key中存储的数据为空且timeout为0则会一直阻塞,直到有数据返回为止。
BRPOP key timeout 与上面那条语句相同,不同在于这条语句是从右边取元素。
通关上面两条数据可以实现阻塞队列。

应用场景

例如微博的首页,会将关注的人发送的消息显示在首页中。
image
有两种方式可以完成这个功能:

  1. 当被关注者发送消息时,主动利用List的特性,使用LPUSH key value命令将消息发送到队列中,由用户主动从队列中拉取消息,但是这样做有个弊端,由于用户关注了多个用户,多个用户发送消息的时间不是一致的,导致用户拉取完消息还得需要对消息按时间排序。
  2. 被关注者发送完消息后主动将消息推送到用户的消息队列中,但是这样做也有个弊端就是如果关注被关注的人的用户过多,一个一个推送会占用资源,可以进行优化,将消息优先推送给在线用户,未在线用户可以慢慢进行推送。

发送三条消息

> LPUSH msg:1001 吃饭
1
> LPUSH msg:1001 睡觉
2
> LPUSH msg:1001 打豆豆

用户主动拉取前三条数据

LRANGE msg:1001 0 4
打豆豆
睡觉
吃饭

Set

无序集合,可以对Set进行并集、差集和交集操作。
SADD key memeber [member...] 在集合中添加元素
SREM key memeber 在集合移除指定元素
SMEMBERS key 清空集合中的所有元素
SCARD key 获取元素个数
SIMEMBER key memeber 判断元素是否在集合中,如果在集合中返回1,不在集合中返回0。
SRANDMEMBER 可以 count 从集合中选出count个元素,不从集合中删除
SPOP key 从集合中选出count个元素,元素从key中删除。

SINTER key key[key ..] 交集运算
SINTERSTORE destination key [key ..]将交集结果放入到集合destination中
SUNION key [key..] 并集运算
SUNIONSTORE destination key [key ..]将并集结果放入到destination中
SDIFF key [key ..]差集运算
SDIFFSTORE destination key 将差集结果存储到集合destination中
并集 差集 交集运算存储到集合中时,如果集合存在,则会覆盖集合中的数据

应用场景

抽奖

SADD key userID 将用户id添加到抽奖列表中
SMEMBERS key 获取所用抽奖的用户id列表
SRANDMEMBER key [count] / SPOP key[count] 抽取count个用户

用户点赞

SADD like:1001 lyra ts rd 给用户消息1001点赞
SREM like:1001 lyra lyra取消点赞
SISMEMBER like:1001 lyra 判断luyra是否点赞
SMEMBERS likie:1001 获取所有点赞的用户列表
SCARD like:1001 获取点赞数

关注模型

取交集可以获取共同关注用户列表

电商商品筛选

image

可以将商品根据分类存储商品信息,之后使用SINTER取交集就可以根据分类获取商品

ZSET

有序集合,每个 元素会关联一个score,redis通过score进行从小到大进行排序。

ZADD key score member [[score member]…] 添加带分值元素
ZREM key member [member …] 删除元素
ZSCORE key member 获取元素分值
ZINCRBY key increment member 元素分值 + increment数
ZCARD key 获取元素个数
ZRANGE key start stop [WITHSCORES] 正序获取有序集合从start到stop下标元素
ZREVRANGE key start stop [WITHSCORES] 倒叙获取有序集合从start到stop下标元素
ZUNIONSTORE destkey numkeys key [key ...] 并集运算
ZINTERSTORE destkey numkeys key [key …] 交集运算

应用场景

image
热搜可以使用zset来实现,没点击一个新闻,分数 + 1,之后取倒序取后10个元素表示热搜数据即可
ZINCRBY hotNews:20190819 1 守护香港
ZREVRANGE hotNews:20190819 0 9 WITHSCORES

posted @   RainbowMagic  阅读(195)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示