[轉載]Redis使用指南

redis簡介

Redis是一個開源(BSD許可)的內存數據結構存儲系統,它可用作數據庫、緩存和消息中間件。
它支持多種類型的數據結構,如字符串(String)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、與範圍查詢,bitmaps,hyperloglogs和地理空間(geospatial)索引半徑查詢。
Redis內置了複製(replication)、LUA腳本(Lua scripting)、LRU驅動事件(LRU eviction)、事務(transactions)和不同級別的磁盤持久化(persistence),並通過Redis哨兵(Sentinel)和自動分區(Cluster)和提供高可用性(high availability)。

數據類型

常使用的幾種數據類型。
String類型
redis 的string比較浪費內存.
常見應用:計數操作 粉絲數 用戶留存率(Bit類型操作、bloomfilter)
List類型(雙向鏈表)
可用作消息暫存,消息隊列.需要小心隊列爆滿。
常用應用:最新用戶訪問時間
Hash類型
hashmap類字典,比如要緩存用戶的年齡,性別等信息
常見應用:中轉對碰、內部路由案例。
Set類型
集合,存儲不重複值.
常見應用:微博關注,共同粉絲、集合交併差等.
Sorted set(hash+skiplist)
有序集合,用作實時排名,topN操作等.注意:元素千萬+時,非常耗費內存,需要預先評估。
常見應用:排行榜,TOP N問題.

使用

儘量選擇複雜度O(1)或者o(log(N))的命令   
key命名儘量簡短,節省內存開銷,單次操作涉及10個key+的要避免,儘量只單值操作,比如要避免hgetall等之類操作多個值的操作.

value儘量小,儘量不要超過1K大小.
相同類型的數據查詢,可以使用pipeline管道命令進行批量操作.比如查詢20個好友的分數.
命令間有簡單事務關係的,可以使用mutil,exec等進行簡單事務操作,比如CAS等問題.
要做cache前,請判斷是否是活躍數據,命中率非常低不做cache.
需要考慮內存耗完後,數據的淘汰情況,是否能淘汰,有此需求的請注意設置key的過期時間,常見的淘汰方式lru.
需要評估cache掛掉後,是否會對db造成大的衝擊,不要造成雪崩問題.

容量預估

• String內存估算
存單條記錄耗費的管理字節約70字節
使用string前先預估耗費的內存量
• List內存估算
存單條記錄耗費的管理字節約40字節,key可以忽略.
使用list前先預估耗費的內存量
• Hash內存估算
– Zipmap: hashkey個數 * (dictEntry大小 + redisObject大小 + 包含key的sds大小 + subkey的總大小
使用hash前先預估耗費的內存量
• Set內存估算
存單條記錄耗費的管理字節約40字節,key可以忽略
使用set前先預估耗費的內存量
• Sorted set內存估算
存單條記錄耗費的管理字節約90字節, key可以忽略
使用sorted set前先預估耗費的內存量
可以通過單機部署多redis進程,提前做容量規劃,以後可以通過遷移進程到新服務器解決容量問題。

性能

php短鏈接操作redis, get、set等單個value操作,性能在3.5W左右每秒。注意估算操作次數,不要超過瓶頸。
請求次數超過3.5W的,部署前需要分實例或者客戶端管理redis分片。(分片組件、算法(hash,一致性hash,虛擬槽slot,範圍分片等))

持久化

redis有持久化需要的話搭從機,在從機進行落地數據(rdb+aof),不要在主機落地.

部署

Redis是單線程單進程,爲了充分利用CPU多核,可以在每臺機器部署多個redis實例,redis所有組件耗費內存之和<機器總內存

容災

數據比較重要,需要自動容災的,請聯繫運維部署,做到master掛掉後,自動切換到slave.
常見的高可用方案:
vip+keepalived redis cluster redis sentinel

負載均衡、分片

twemproxy

監控

運維部署相關的redis連接數、使用內存數、cpu等監控圖,可以對比當前、往期等數據.出問題後,可以查看相關監控圖,方便定位解決問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章