標籤:

Redis有序集合

Redis是一個高性能的key-value資料庫,處理數據的效率高。Redis的優點有以下幾方面:

  • 性能極高:Redis的讀取速度是11萬次/s寫的速度是8.1萬/s
  • 數據類型豐富:Redis相比其他key-value資料庫,能夠支持很多豐富的數據結構如Strings、Hashes、Lists、Sets和Sorted Sets。
  • 原子性:Redis支持事務,能夠對所有操作進行原子操作
  • 數據持久化:Redis支持數據的持久化,可以將內存中的數據保存到磁碟中,避免丟失。

Sorted Sets與Sets類似之處是它不允許有重複的成員存在,不同的是每個元素都會關聯一個double類型的分數。通過分數,Redis可以對集合中的成員進行從小到大的排序。Sorted Set的成員是唯一的,但是分數卻是可以重複的,集合是通過哈希表實現的,因此,對Sorted Set進行添加、刪除和查找時的時間複雜度都是O(1)。Sorted Sets中最大的成員數為2^32-1(4294967295,差不多40多億),score是一個64位浮點類型,範圍在-9007199254740992到9007199254740992之間。

有序集合的value可作為時間戳,常用於處理延遲任務(比如多長時間之後數據失效或者觸發什麼事件)

由於key是唯一的,而每個用戶的userId都是唯一的,因此可以用userId作為key來標識,但因為Redis不止一個工程用到,可能其他工程也共用該Redis集群,因此將使用「expose:userId」作為key。因為只保留用戶最近兩周的曝光數據,所以需要定時去刪除兩周前的數據,如果當前時間戳作為score,可以調用Redis的zremrangebyscore命令對兩周前的數據進行清理。value結構保存用戶的曝光具體數據,如內容的id,內容的類型,曝光的時間戳,手機的型號等信息,由於value是字元串類型,因此將這些數據轉化成json格式封裝

redis有序集合命令可參考: Redis 命令參考

說一下Redis為什麼這麼快?

Redis本質上是一個Server,伺服器編程的幾點常識:

1)所有命令和請求都有網路開銷,都有消耗在網路協議上面(RTT,Round-Trip Time)

2)當讀寫(或傳輸)的數據較多時(比如大對象),帶寬就容易成為瓶頸。

再說下Server慢的幾個常見因素:

1)服務端線程數量過多,佔據大量資源,頻繁切換上下文

2)鎖的濫用,大量CPU用在線程調度上

3)非必要的內存拷貝

Redis避免了以上方面的問題:

1)單進程單線程,無鎖,串列操作,沒有多線程切換和競爭。

2)數據在內存中(也可持久化),操作迅速

3)非阻塞IO:採用了epoll + 事件框架。epoll中的讀、寫、關閉、連接等動作都轉化成了事件,然後利用epoll的多路復用特性,不在IO上浪費時間。

Redis在CPU,內存和IO方面都大大提升了效率。

最後再說一個使用的redis命令:

-x 表示從標準輸入(stdin)讀取數據

cat file.txt | redis-cli -p 6379 -x set key redis-cli -p 6379 -x set key 0<file.txt

以上兩種方式結果相同。更多命令選項請參考redis-cli --help.

推薦閱讀:

圖解Redis之持久化篇
R語言操作redis資料庫詳解
redis使用消息隊列的場合?
scrapy-redis 和 scrapy 有什麼區別?

TAG:Redis |