闲谈Redis在微信、微博、抖音的应用落地

背景

Redis作为非关系型内存数据库,已经成为各大厂的标配.在我们的日常开发中,除了String类型外,redis还提供了其他几种数据结构,比如hash(哈希)
、list(列表)、set(集合)、zset(有序集合),新版本还支持基于地理位置的Geo存储,本文将依次介绍一下这几种数据类型在实际场景中的落地.

1. 五种数据结构存储模型

image.png

2. String类型应用场景

2.1 String类型说明

  字符串类型是Redis存储的基本数据类型也是我们平常应用最为广泛的数据类型,String类型在Redis存储中是二进制的也是安全的,所以它可以接受任何格式的数据,即使是图像数据。但是在Redis中字符串类型的值最大容纳数据大小512M,有时候我们会往redis存储一个json对象,这个当然是可以的,但是一当这个对象很大的时候,要考虑将其换成其他的数据类型,因为大对象和反序例化性能开销很大.

2.2 微信公众号中文章阅读量、抖音中的城市访问量

Redis提供了基于原子的加减操作,
这里面我们可以用计数器功能,
运用INCR对feild进行加加操作统计数据, 
INCR  article:readcount:{articleId}.

3. Hash类型应用场景

3.1 Hash类型说明

  Hash不太适合在redis集群当中使用,这个我前面文章中讲过了,这里就不在详细谈了.

3.2 电商购物车

//思路:
//1)以用户id为key;
//2)商品id为field;
//3)商品数量为value
//hash表里面set数据商品数据
hset cart:1001 10099 1
//原子减商品库存
hincrby cart:1001 10099 1
//查询用户购买的指定的商品库存
hget cart:1001 10099
//hlen获取用户购买的商品总数
hlen cart:1001 
//hlen删除用户购买的商品
hdel cart:1001 10099

//返回哈希表 key 中域的数量。
hlen cart:1001
//返回哈希表 key 中,所有的域和值。
hgetall cart:1001

4. List类型应用场景

4.1 List类型说明

这里的List不是你认识的数组,而是LinkedList这种结构,这里我将说几个我们不是经常使用的骚操作,我们可以运用LPUSH和LPOP实现Stack的功能;运用LPUSH和RPOP可以实现简单的队列;运用LPUSH和BRPOP可以实现Blocking MQ的功能.
Stack(栈) =LPUSH+LPOP FILO(先进后出)
Queue(队列)=LPUSH+RPOP FIFO(先进先出)
Blocking MQ(阻塞队列)=LPUSH+BRPOP.
什么是BRPOP:
从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待.所以可以用它来实现消息队列的监听.

4.2 微博和微信公众号消息流

LPUSH msg:{id} 10086

4.3 查看最新的微博消息

//LRANGE:返回列表key中指定区间内的元素,区间以偏移量start和stop指定
LRANGE  msg:{id} 0 5

4.3 微信、微博在线用户抽奖

  楼主年初的时候给公司做了抽宝马和万元大奖的一个抽奖活动,当时由于时间紧急只有两天时间,从前端到后端都要撸一遍,现在回想起来当时的设计方案其实可以做的更简洁.其中我记得有一个点就是,前面抽中的用户,隔日参加抽奖的时候,我们不希望他继续参与中奖,也是为了防止奖项一直被同一个用户抽中,减少这种所谓的“黑幕”,回归到redis里面我们就可以用SPOP去操作.

//思路
1)点击参与抽奖加入集合
SADD key {userID}
2)查看参与抽奖所有用户
SMEMBERS key
3)抽count名中奖者
如果希望中奖用户依然保留在抽奖池里面
SRANDMENMBER key [count]
SRANDMENMBER 从集合key中选出count个元素,元素不从key中删除
如果不希望中奖用户依然保留在抽奖池里面
SPOP key [count]
SPOP从集合key中选出count个元素,元素从key中删除

4.4 微信、微博、抖音点赞、收藏标签

//思路
1)抖音大V视频点赞量
SADD like:{messageId}  {userId}
2)取消点赞
SREM like:{messageId} {userId}
移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
3)检查用户是否点过赞
SISMEMBER like:{messageId} {userId}
4)获取点赞的用户列表
SISMEMBER like:{messageId}
5)获取点赞用户数
返回集合 key 的基数(集合中元素的数量)
SCARD like:{messageId}

4.5 微博、QQ共同关注的人,我关注的人也关注他,可能认识的人

//思路
共同关注的人:
//两个集合的交集
SINTER simaSet yanguoSet
我关注的人也关注他
//我关注的人在他的集合里面,可以运用SISMENBER
SISMENBER simaSet yanguo
我可能认识的人
//他关注的人,不在我的集合里面,但是在我的朋友集合里面
SDIFF simaSet yanguoSet

5. Zset类型应用场景

5.1 Zset类型说明

Zset是有序集合

5.2 微博热搜、排行榜

//思路
1)热搜
//新闻点击量
ZINCRBY HOTNEWS:20191115 1 李小璐离婚
为有序集合key中元素member的分值加上increment
2)展示当日排行版前十
ZREVRANGE hotNews:20191115 0 10 WITHSCORES
ZREVRANGE倒序获取有序集合key中start下标到stop下标的元素
3)七日搜索榜单计算
ZUNIONSTORE hotNews:20190722 7
并集计算
4)展示七日排行前十
ZREVRANGE hotNews:20190716-20190722 0 10 WITHSCORES
交集计算

6. Geo类型应用场景

5.1 Geo类型说明

基于地理位置的数据,这个主要运用在出行领域比较多

5.2 微信附近的人

//思路
微博、微信、默默<附近的人>
滴滴打车、哈啰单车、美团单车<附近的车>
美团和饿了吗<附近的餐馆>

基于地理位置
比如GEORADIUS
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2

redis> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"

redis> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.361389338970184"
      2) "38.115556395496299"
2) 1) "Catania"
   2) 1) "15.087267458438873"
      2) "37.50266842333162"

redis> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.361389338970184"
      2) "38.115556395496299"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.087267458438873"
      2) "37.50266842333162"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343