【Redis】新浪微博与微信Redis架构实战 - 笔记

1、Redis核心数据结构精讲

使用redis-cli进入Redis交互
如果出现:(error) NOAUTH Authentication required.,使用auth 密码登录即可
在Spring中使用Redis:可以使用Redistemplate
【Redis】新浪微博与微信Redis架构实战 - 笔记

(1)String类型

【Redis】新浪微博与微信Redis架构实战 - 笔记
用String可以实现对象缓存:
【Redis】新浪微博与微信Redis架构实战 - 笔记
使用SETNX实现分布式锁
【Redis】新浪微博与微信Redis架构实战 - 笔记
【Redis】新浪微博与微信Redis架构实战 - 笔记
【Redis】新浪微博与微信Redis架构实战 - 笔记
对于分库分表,使用雪花算法,或者使用Redis维护自增id:

【Redis】新浪微博与微信Redis架构实战 - 笔记
以上使用方式的缺点:访问次数太多,浪费资源,有性能问题。
所以使用INCRBY orderId 1000一次增加1000个id,比如一台机器A是0-1000,另一台机器B是1001-2000,一次拿1000个id,然后直接在内存中维护自增。

(2)Hash结构

【Redis】新浪微博与微信Redis架构实战 - 笔记
【Redis】新浪微博与微信Redis架构实战 - 笔记
redis的hash与string区别
Redis hash 是一个 string 类型的 field 和 value 的 映射表。它的添加、删除操作都是 0(1)(平均操作)。
hash 特别 适合用于存储对象。相较于将对象的每个字段存成单个 string 类型(string 类型可以存储对象序列化)。
将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。
(省内存的原因是新建一个 hash 对象时开始是用 zipmap(又称为 small hash)来存储的。
这个 zipmap 其实并不是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据存储开销。

redis单线程模型性能瓶颈
redis天生是单线程的,请求会被排队执行。
存在大Key性能问题:如果一个请求的Key/Value很大,会将其他的请求阻塞。
一线互联网公司如何解决这个问题:分段存储,把10000个user通过id取模,分为2000条的user_1,user_2…等等

使用redis设计购物车
【Redis】新浪微博与微信Redis架构实战 - 笔记
以上命令的使用示例:
【Redis】新浪微博与微信Redis架构实战 - 笔记
本示例只提供思路,关于如何如何获取商品内容的详细信息,可以使用ajax获取。

Hash数据结构的优缺点

【Redis】新浪微博与微信Redis架构实战 - 笔记
在集群中使用Redis,可能会由于Key数据分片不均匀,导致很多Key集中在一个master上,因此Redis不适合在集群架构上大规模使用。如果使用id+前缀的方式,让key均匀地落在每个节点上,也是可以在集群中使用Redis的。
【Redis】新浪微博与微信Redis架构实战 - 笔记

(3)List结构

【Redis】新浪微博与微信Redis架构实战 - 笔记
在Redis中,可以直接使用List实现的数据结构。比用Java方便很多。
BRPOP命令:有消息,则取走,没有消息,则一直监听,直到放进消息之后再取走。
【Redis】新浪微博与微信Redis架构实战 - 笔记
如何使用Redis实现微博、公众号消息流推送:
【Redis】新浪微博与微信Redis架构实战 - 笔记
LRANGE key strat stop命令:返回列表key中指定区间内的元素
【Redis】新浪微博与微信Redis架构实战 - 笔记
Redis单机QPS理论上10w,只要是粉丝量不大的场景(几百个粉丝),是可以使用上面的方式的,给每一个粉丝都执行一次LPUSH即可。如果使用Redis的pipeline,一次放进很多一起执行,存储速度可以更快。

思考:对于拥有上千万粉丝的大V,如何实现消息流?

(4)Set结构

【Redis】新浪微博与微信Redis架构实战 - 笔记
如何使用Redis的set结构,实现微信抽奖小程序:

功能包括:

  • 点击参与抽奖
  • 参与人数展示
  • 随机抽取count名中奖者:SRANDMEMBER抽取后不删除用户,SPOP抽取后删除用户(可用于一等奖/二等奖/三等奖多次抽取)

【Redis】新浪微博与微信Redis架构实战 - 笔记
以上使用示例:
【Redis】新浪微博与微信Redis架构实战 - 笔记
如何使用Redis的set结构,实现微信微博点赞,收藏,标签?

进行点赞操作的思路:使用SADD命令,将点赞用户的ID放进当前消息ID点赞集合当中。而如果使用MySQL实现,会比较麻烦。
【Redis】新浪微博与微信Redis架构实战 - 笔记
思考:只显示好友的点赞如何实现?可以使用求交集命令:
SDIFF命令,是计算set1减去set2并减去set3后还剩的元素
【Redis】新浪微博与微信Redis架构实战 - 笔记
使用集合操作,实现微博关注模型

包括:共同关注、我关注的人也关注他等动能(这些功能用于基于数据搜集的推荐系统:相互关注的人,购买过的商品,朋友会被推荐。阿里收购这些互联网公司,为了收集后台用户数据,做推荐系统。)

使用上述的集合运算,即可实现以下内容展示(注意不需要一次全部算出来,所以不用担心性能问题。即使点击“查看更多”,也是分页展示)。
【Redis】新浪微博与微信Redis架构实战 - 笔记
Redis内存使用状况?
7-8年前,新浪微博Redis存储达到几百个T,有很多节点,分片存储。
Redis也是可以持久化的。

其他一些包括分类搜索等,也可以使用Redis实现

ZSet常用操作?
【Redis】新浪微博与微信Redis架构实战 - 笔记
如何使用Redis实现微博热搜?
【Redis】新浪微博与微信Redis架构实战 - 笔记
思考:Redis更多使用场景,如何实现?
【Redis】新浪微博与微信Redis架构实战 - 笔记