這篇文章主要介紹了Redis中5種數據結構的使用場景介紹,本文對Redis中的5種數據類型String、Hash、List、Set、Sorted Set作了講解,須要的朋友能夠參考下redis
1、redis 數據結構使用場景數據庫
原來看過 redisbook 這本書,對 redis 的基本功能都已經熟悉了,從上週開始看 redis 的源碼。目前目標是吃透 redis 的數據結構。咱們都知道,在 redis 中一共有5種數據結構,那每種數據結構的使用場景都是什麼呢?服務器
String——字符串
Hash——字典
List——列表
Set——集合
Sorted Set——有序集合數據結構
下面咱們就來簡單說明一下它們各自的使用場景:併發
String——字符串app
String 數據結構是簡單的 key-value 類型,value 不只能夠是 String,也能夠是數字(當數字類型用 Long 能夠表示的時候encoding 就是整型,其餘都存儲在 sdshdr 當作字符串)。使用 Strings 類型,能夠徹底實現目前 Memcached 的功能,而且效率更高。還能夠享受 Redis 的定時持久化(能夠選擇 RDB 模式或者 AOF 模式),操做日誌及 Replication 等功能。除了提供與 Memcached 同樣的 get、set、incr、decr 等操做外,Redis 還提供了下面一些操做:網站
1.LEN niushuai:O(1)獲取字符串長度 2.APPEND niushuai redis:往字符串 append 內容,並且採用智能分配內存(每次2倍) 3.設置和獲取字符串的某一段內容 4.設置及獲取字符串的某一位(bit) 5.批量設置一系列字符串的內容 6.原子計數器 7.GETSET 命令的妙用,請於清空舊值的同時設置一個新值,配合原子計數器使用
Hash——字典
在 Memcached 中,咱們常常將一些結構化的信息打包成 hashmap,在客戶端序列化後存儲爲一個字符串的值(通常是 JSON 格式),好比用戶的暱稱、年齡、性別、積分等。這時候在須要修改其中某一項時,一般須要將字符串(JSON)取出來,而後進行反序列化,修改某一項的值,再序列化成字符串(JSON)存儲回去。簡單修改一個屬性就幹這麼多事情,消耗一定是很大的,也不適用於一些可能併發操做的場合(好比兩個併發的操做都須要修改積分)。而 Redis 的 Hash 結構可使你像在數據庫中 Update 一個屬性同樣只修改某一項屬性值。線程
存儲、讀取、修改用戶屬性
List——列表
List 說白了就是鏈表(redis 使用雙端鏈表實現的 List),相信學過數據結構知識的人都應該能理解其結構。使用 List 結構,咱們能夠輕鬆地實現最新消息排行等功能(好比新浪微博的 TimeLine )。List 的另外一個應用就是消息隊列,能夠利用 List 的 *PUSH 操做,將任務存在 List 中,而後工做線程再用 POP 操做將任務取出進行執行。Redis 還提供了操做 List 中某一段元素的 API,你能夠直接查詢,刪除 List 中某一段的元素日誌
1.微博 TimeLine 2.消息隊列
Set——集合
Set 就是一個集合,集合的概念就是一堆不重複值的組合。利用 Redis 提供的 Set 數據結構,能夠存儲一些集合性的數據。好比在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。由於 Redis 很是人性化的爲集合提供了求交集、並集、差集等操做,那麼就能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。code
1.共同好友、二度好友 2.利用惟一性,能夠統計訪問網站的全部獨立 IP 3.好友推薦的時候,根據 tag 求交集,大於某個 threshold 就能夠推薦
Sorted Set——有序集合
和Sets相比,Sorted Sets是將 Set 中的元素增長了一個權重參數 score,使得集合中的元素可以按 score 進行有序排列,好比一個存儲全班同窗成績的 Sorted Sets,其集合 value 能夠是同窗的學號,而 score 就能夠是其考試得分,這樣在數據插入集合的時候,就已經進行了自然的排序。另外還能夠用 Sorted Sets 來作帶權重的隊列,好比普通消息的 score 爲1,重要消息的 score 爲2,而後工做線程能夠選擇按 score 的倒序來獲取工做任務。讓重要的任務優先執行。
1.帶有權重的元素,好比一個遊戲的用戶得分排行榜
2.比較複雜的數據結構,通常用到的場景不算太多
2、redis 其餘功能使用場景
訂閱-發佈系統
Pub/Sub 從字面上理解就是發佈(Publish)與訂閱(Subscribe),在 Redis 中,你能夠設定對某一個 key 值進行消息發佈及消息訂閱,當一個 key 值上進行了消息發佈後,全部訂閱它的客戶端都會收到相應的消息。這一功能最明顯的用法就是用做實時消息系統,好比普通的即時聊天,羣聊等功能。
事務——Transactions
誰說 NoSQL 都不支持事務,雖然 Redis 的 Transactions 提供的並非嚴格的 ACID 的事務(好比一串用 EXEC 提交執行的命令,在執行中服務器宕機,那麼會有一部分命令執行了,剩下的沒執行),可是這個 Transactions 仍是提供了基本的命令打包執行的功能(在服務器不出問題的狀況下,能夠保證一連串的命令是順序在一塊兒執行的,中間有會有其它客戶端命令插進來執行)。Redis 還提供了一個 Watch 功能,你能夠對一個 key 進行 Watch,而後再執行 Transactions,在這過程當中,若是這個 Watched 的值進行了修改,那麼這個 Transactions 會發現並拒絕執行。