【Redis】新浪微博与微信Redis架构实战 - 笔记
1、Redis核心數(shù)據(jù)結(jié)構(gòu)精講
使用redis-cli進(jìn)入Redis交互
如果出現(xiàn):(error) NOAUTH Authentication required.,使用auth 密碼登錄即可
在Spring中使用Redis:可以使用Redistemplate
(1)String類型
用String可以實(shí)現(xiàn)對(duì)象緩存:
使用SETNX實(shí)現(xiàn)分布式鎖
對(duì)于分庫(kù)分表,使用雪花算法,或者使用Redis維護(hù)自增id:
以上使用方式的缺點(diǎn):訪問(wèn)次數(shù)太多,浪費(fèi)資源,有性能問(wèn)題。
所以使用INCRBY orderId 1000一次增加1000個(gè)id,比如一臺(tái)機(jī)器A是0-1000,另一臺(tái)機(jī)器B是1001-2000,一次拿1000個(gè)id,然后直接在內(nèi)存中維護(hù)自增。
(2)Hash結(jié)構(gòu)
redis的hash與string區(qū)別
Redis hash 是一個(gè) string 類型的 field 和 value 的 映射表。它的添加、刪除操作都是 0(1)(平均操作)。
hash 特別 適合用于存儲(chǔ)對(duì)象。相較于將對(duì)象的每個(gè)字段存成單個(gè) string 類型(string 類型可以存儲(chǔ)對(duì)象序列化)。
將一個(gè)對(duì)象存儲(chǔ)在 hash 類型中會(huì)占用更少的內(nèi)存,并且可以更方便的存取整個(gè)對(duì)象。
(省內(nèi)存的原因是新建一個(gè) hash 對(duì)象時(shí)開(kāi)始是用 zipmap(又稱為 small hash)來(lái)存儲(chǔ)的。
這個(gè) zipmap 其實(shí)并不是 hash table,但是 zipmap 相比正常的 hash 實(shí)現(xiàn)可以節(jié)省不少 hash 本身需要的一些元數(shù)據(jù)存儲(chǔ)開(kāi)銷。
redis單線程模型性能瓶頸
redis天生是單線程的,請(qǐng)求會(huì)被排隊(duì)執(zhí)行。
存在大Key性能問(wèn)題:如果一個(gè)請(qǐng)求的Key/Value很大,會(huì)將其他的請(qǐng)求阻塞。
一線互聯(lián)網(wǎng)公司如何解決這個(gè)問(wèn)題:分段存儲(chǔ),把10000個(gè)user通過(guò)id取模,分為2000條的user_1,user_2…等等
使用redis設(shè)計(jì)購(gòu)物車
以上命令的使用示例:
本示例只提供思路,關(guān)于如何如何獲取商品內(nèi)容的詳細(xì)信息,可以使用ajax獲取。
Hash數(shù)據(jù)結(jié)構(gòu)的優(yōu)缺點(diǎn)
在集群中使用Redis,可能會(huì)由于Key數(shù)據(jù)分片不均勻,導(dǎo)致很多Key集中在一個(gè)master上,因此Redis不適合在集群架構(gòu)上大規(guī)模使用。如果使用id+前綴的方式,讓key均勻地落在每個(gè)節(jié)點(diǎn)上,也是可以在集群中使用Redis的。
(3)List結(jié)構(gòu)
在Redis中,可以直接使用List實(shí)現(xiàn)棧的數(shù)據(jù)結(jié)構(gòu)。比用Java方便很多。
BRPOP命令:有消息,則取走,沒(méi)有消息,則一直監(jiān)聽(tīng),直到放進(jìn)消息之后再取走。
如何使用Redis實(shí)現(xiàn)微博、公眾號(hào)消息流推送:
LRANGE key strat stop命令:返回列表key中指定區(qū)間內(nèi)的元素
Redis單機(jī)QPS理論上10w,只要是粉絲量不大的場(chǎng)景(幾百個(gè)粉絲),是可以使用上面的方式的,給每一個(gè)粉絲都執(zhí)行一次LPUSH即可。如果使用Redis的pipeline,一次放進(jìn)很多一起執(zhí)行,存儲(chǔ)速度可以更快。
思考:對(duì)于擁有上千萬(wàn)粉絲的大V,如何實(shí)現(xiàn)消息流?
(4)Set結(jié)構(gòu)
如何使用Redis的set結(jié)構(gòu),實(shí)現(xiàn)微信抽獎(jiǎng)小程序:
功能包括:
- 點(diǎn)擊參與抽獎(jiǎng)
- 參與人數(shù)展示
- 隨機(jī)抽取count名中獎(jiǎng)?wù)?#xff1a;SRANDMEMBER抽取后不刪除用戶,SPOP抽取后刪除用戶(可用于一等獎(jiǎng)/二等獎(jiǎng)/三等獎(jiǎng)多次抽取)
以上使用示例:
如何使用Redis的set結(jié)構(gòu),實(shí)現(xiàn)微信微博點(diǎn)贊,收藏,標(biāo)簽?
進(jìn)行點(diǎn)贊操作的思路:使用SADD命令,將點(diǎn)贊用戶的ID放進(jìn)當(dāng)前消息ID的點(diǎn)贊集合當(dāng)中。而如果使用MySQL實(shí)現(xiàn),會(huì)比較麻煩。
思考:只顯示好友的點(diǎn)贊如何實(shí)現(xiàn)?可以使用求交集命令:
SDIFF命令,是計(jì)算set1減去set2并減去set3后還剩的元素
使用集合操作,實(shí)現(xiàn)微博關(guān)注模型
包括:共同關(guān)注、我關(guān)注的人也關(guān)注他等動(dòng)能(這些功能用于基于數(shù)據(jù)搜集的推薦系統(tǒng):相互關(guān)注的人,購(gòu)買過(guò)的商品,朋友會(huì)被推薦。阿里收購(gòu)這些互聯(lián)網(wǎng)公司,為了收集后臺(tái)用戶數(shù)據(jù),做推薦系統(tǒng)。)
使用上述的集合運(yùn)算,即可實(shí)現(xiàn)以下內(nèi)容展示(注意不需要一次全部算出來(lái),所以不用擔(dān)心性能問(wèn)題。即使點(diǎn)擊“查看更多”,也是分頁(yè)展示)。
Redis內(nèi)存使用狀況?
7-8年前,新浪微博Redis存儲(chǔ)達(dá)到幾百個(gè)T,有很多節(jié)點(diǎn),分片存儲(chǔ)。
Redis也是可以持久化的。
其他一些包括分類搜索等,也可以使用Redis實(shí)現(xiàn)
ZSet常用操作?
如何使用Redis實(shí)現(xiàn)微博熱搜?
思考:Redis更多使用場(chǎng)景,如何實(shí)現(xiàn)?
總結(jié)
以上是生活随笔為你收集整理的【Redis】新浪微博与微信Redis架构实战 - 笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Java多线程】实现Runnable接
- 下一篇: Alibaba微服务事务Seata源码深