Redis是一個(gè)高性能的key-value數(shù)據(jù)庫,處理數(shù)據(jù)的效率高窿春。Redis的優(yōu)點(diǎn)有以下幾方面:
- 性能極高:Redis的讀取速度是11萬次/s得问,寫的速度是8.1萬/s砍聊。
- 數(shù)據(jù)類型豐富:Redis相比其他key-value數(shù)據(jù)庫页藻,能夠支持很多豐富的數(shù)據(jù)結(jié)構(gòu)如Strings桨嫁、Hashes、Lists惕橙、Sets和Sorted Sets瞧甩。
- 原子性:Redis支持事務(wù)钉跷,能夠?qū)λ胁僮鬟M(jìn)行原子操作弥鹦。
- 數(shù)據(jù)持久化:Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存到磁盤中爷辙,避免丟失彬坏。
Sorted Sets與Sets類似之處是它不允許有重復(fù)的成員存在,不同的是每個(gè)元素都會關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)膝晾。通過分?jǐn)?shù)栓始,Redis可以對集合中的成員進(jìn)行從小到大的排序。Sorted Set的成員是唯一的血当,但是分?jǐn)?shù)卻是可以重復(fù)的幻赚,集合是通過哈希表實(shí)現(xiàn)的,因此臊旭,對Sorted Set進(jìn)行添加落恼、刪除和查找時(shí)的時(shí)間復(fù)雜度都是O(1)。Sorted Sets中最大的成員數(shù)為2^32-1(4294967295离熏,差不多40多億)佳谦,score是一個(gè)64位浮點(diǎn)類型,范圍在-9007199254740992到9007199254740992之間滋戳。
有序集合的value可作為時(shí)間戳钻蔑,常用于處理延遲任務(wù)(比如多長時(shí)間之后數(shù)據(jù)失效或者觸發(fā)什么事件)
由于key是唯一的,而每個(gè)用戶的userId都是唯一的奸鸯,因此可以用userId作為key來標(biāo)識咪笑,但因?yàn)镽edis不止一個(gè)工程用到,可能其他工程也共用該Redis集群娄涩,因此將使用“expose:userId”作為key窗怒。因?yàn)橹槐A粲脩糇罱鼉芍艿钠毓鈹?shù)據(jù),所以需要定時(shí)去刪除兩周前的數(shù)據(jù),如果當(dāng)前時(shí)間戳作為score兜粘,可以調(diào)用Redis的zremrangebyscore命令對兩周前的數(shù)據(jù)進(jìn)行清理申窘。value結(jié)構(gòu)保存用戶的曝光具體數(shù)據(jù),如內(nèi)容的id孔轴,內(nèi)容的類型剃法,曝光的時(shí)間戳,手機(jī)的型號等信息路鹰,由于value是字符串類型贷洲,因此將這些數(shù)據(jù)轉(zhuǎn)化成json格式封裝。
redis有序集合命令可參考: Redis 命令參考
說一下Redis為什么這么快晋柱?
Redis本質(zhì)上是一個(gè)Server优构,服務(wù)器編程的幾點(diǎn)常識:
所有命令和請求都有網(wǎng)絡(luò)開銷,都有消耗在網(wǎng)絡(luò)協(xié)議上面(RTT雁竞,Round-Trip Time)
當(dāng)讀寫(或傳輸)的數(shù)據(jù)較多時(shí)(比如大對象)钦椭,帶寬就容易成為瓶頸。
再說下Server慢的幾個(gè)常見因素:
服務(wù)端線程數(shù)量過多碑诉,占據(jù)大量資源彪腔,頻繁切換上下文
鎖的濫用,大量CPU用在線程調(diào)度上
非必要的內(nèi)存拷貝
Redis避免了以上方面的問題:
單進(jìn)程單線程进栽,無鎖德挣,串行操作,沒有多線程切換和競爭快毛。
數(shù)據(jù)在內(nèi)存中(也可持久化)格嗅,操作迅速
非阻塞IO:采用了epoll + 事件框架。epoll中的讀唠帝、寫屯掖、關(guān)閉、連接等動(dòng)作都轉(zhuǎn)化成了事件没隘,然后利用epoll的多路復(fù)用特性懂扼,不在IO上浪費(fèi)時(shí)間。
Redis在CPU右蒲,內(nèi)存和IO方面都大大提升了效率阀湿。
最后再說一個(gè)使用的redis命令:
-x 表示從標(biāo)準(zhǔn)輸入(stdin)讀取數(shù)據(jù)
cat file.txt | redis-cli -p 6379 -x set key
redis-cli -p 6379 -x set key 0<file.txt
以上兩種方式結(jié)果相同。更多命令選項(xiàng)請參考redis-cli --help.