【Redis】新浪微博与微信Redis架构实战 - 笔记
1、Redis核心數據結構精講
使用redis-cli進入Redis交互
如果出現:(error) NOAUTH Authentication required.,使用auth 密碼登錄即可
在Spring中使用Redis:可以使用Redistemplate
(1)String類型
用String可以實現對象緩存:
使用SETNX實現分布式鎖
對于分庫分表,使用雪花算法,或者使用Redis維護自增id:
以上使用方式的缺點:訪問次數太多,浪費資源,有性能問題。
所以使用INCRBY orderId 1000一次增加1000個id,比如一臺機器A是0-1000,另一臺機器B是1001-2000,一次拿1000個id,然后直接在內存中維護自增。
(2)Hash結構
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設計購物車
以上命令的使用示例:
本示例只提供思路,關于如何如何獲取商品內容的詳細信息,可以使用ajax獲取。
Hash數據結構的優缺點
在集群中使用Redis,可能會由于Key數據分片不均勻,導致很多Key集中在一個master上,因此Redis不適合在集群架構上大規模使用。如果使用id+前綴的方式,讓key均勻地落在每個節點上,也是可以在集群中使用Redis的。
(3)List結構
在Redis中,可以直接使用List實現棧的數據結構。比用Java方便很多。
BRPOP命令:有消息,則取走,沒有消息,則一直監聽,直到放進消息之后再取走。
如何使用Redis實現微博、公眾號消息流推送:
LRANGE key strat stop命令:返回列表key中指定區間內的元素
Redis單機QPS理論上10w,只要是粉絲量不大的場景(幾百個粉絲),是可以使用上面的方式的,給每一個粉絲都執行一次LPUSH即可。如果使用Redis的pipeline,一次放進很多一起執行,存儲速度可以更快。
思考:對于擁有上千萬粉絲的大V,如何實現消息流?
(4)Set結構
如何使用Redis的set結構,實現微信抽獎小程序:
功能包括:
- 點擊參與抽獎
- 參與人數展示
- 隨機抽取count名中獎者:SRANDMEMBER抽取后不刪除用戶,SPOP抽取后刪除用戶(可用于一等獎/二等獎/三等獎多次抽取)
以上使用示例:
如何使用Redis的set結構,實現微信微博點贊,收藏,標簽?
進行點贊操作的思路:使用SADD命令,將點贊用戶的ID放進當前消息ID的點贊集合當中。而如果使用MySQL實現,會比較麻煩。
思考:只顯示好友的點贊如何實現?可以使用求交集命令:
SDIFF命令,是計算set1減去set2并減去set3后還剩的元素
使用集合操作,實現微博關注模型
包括:共同關注、我關注的人也關注他等動能(這些功能用于基于數據搜集的推薦系統:相互關注的人,購買過的商品,朋友會被推薦。阿里收購這些互聯網公司,為了收集后臺用戶數據,做推薦系統。)
使用上述的集合運算,即可實現以下內容展示(注意不需要一次全部算出來,所以不用擔心性能問題。即使點擊“查看更多”,也是分頁展示)。
Redis內存使用狀況?
7-8年前,新浪微博Redis存儲達到幾百個T,有很多節點,分片存儲。
Redis也是可以持久化的。
其他一些包括分類搜索等,也可以使用Redis實現
ZSet常用操作?
如何使用Redis實現微博熱搜?
思考:Redis更多使用場景,如何實現?
總結
以上是生活随笔為你收集整理的【Redis】新浪微博与微信Redis架构实战 - 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java多线程】实现Runnable接
- 下一篇: linux cmake编译源码,linu