程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)

溫馨提示:內容有點多,有需要“快進”的朋友,可以根據目錄重點觀看~

Redis是一款開源的、高性能的鍵-值存儲(key-value store)。它常被稱作是一款數據結構服務器(data structure server)。

Redis的鍵值可以包括字符串(strings)類型,同時它還包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等數據類型。 對於這些數據類型,你可以執行原子操作。例如:對字符串進行附加操作(append);遞增哈希中的值;向列表中增加元素;計算集合的交集、並集與差集等。

爲了獲得優異的性能,Redis採用了內存中(in-memory)數據集(dataset)的方式。同時,Redis支持數據的持久化,你可以每隔一段時間將數據集轉存到磁盤上(snapshot),或者在日誌尾部追加每一條操作命令(append only file,aof)。

Redis同樣支持主從複製(master-slave replication),並且具有非常快速的非阻塞首次同步( non-blocking first synchronization)、網絡斷開自動重連等功能。同時Redis還具有其它一些特性,其中包括簡單的事物支持、發佈訂閱 ( pub/sub)、管道(pipeline)和虛擬內存(vm)等 。Redis具有豐富的客戶端,支持現階段流行的大多數編程語言。

本文目錄:

Redis安裝
Redis配置
Redis數據類型
Redis功能
持久化
主從複製
事務支持
發佈訂閱
管道
虛擬內存
Redis性能
Redis部署
Redis應用場景
Redis總結
Redis安裝:
下載最新穩定版 redis( http://redis.io/download

tar zxvf redis-2.2.11 解壓縮

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
cd src 進入src目錄make 編譯Redismake test 可以測試一下(本步可省略)make install 安裝,默認安裝目錄是 /usr/local/bin,生成如圖5個二進制文件,可以將其拷到新建目錄下,例如: /usr/local/redis/bin

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
cp 源碼/src/redis.conf /usr/local/redis/etc 配置文件複製cd /usr/local/redis./bin/redis-server ./etc/redis.conf 啓動Redis服務此時redis已經運行,但要獲得好的性能,還需要對配置文件進行合理的配置

Redis配置:

  1. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啓用守護進程 daemonize no
  2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定 pidfile /var/run/redis.pid
  3. 指定Redis監聽端口,默認端口爲6379
  4. 綁定的主機地址 bind 127.0.0.1
    5.當 客戶端閒置多長時間後關閉連接,如果指定爲0,表示關閉該功能 timeout 300
  5. 指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose loglevel verbose
  6. 日誌記錄方式,默認爲標準輸出,如果配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null logfile stdout
  7. 設置數據庫的數量,默認數據庫爲0,可以使用SELECT <dbid>命令在連接上指定數據庫id databases 16
  8. 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合 save <seconds> <changes> Redis默認配置文件中提供了三個條件: save 900 1 save 300 10 save 60 10000 分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
  9. 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,如果爲了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大 rdbcompression yes
  10. 指定本地數據庫文件名,默認值爲dump.rdb dbfilename dump.rdb
  11. 指定本地數據庫存放目錄 dir ./
  12. 設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步 slaveof <masterip> <masterport>
  13. 當master服務設置了密碼保護時,slav服務連接master的密碼 masterauth <master-password>
  14. 設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH <password>命令提供密碼,默認關閉 requirepass foobared
  15. 設置同一時間最大客戶端連接數,默認無限制,Redis可以同時打開的客戶端連接數爲Redis進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis會關閉新的連接並向客戶端返回max number of clients reached錯誤信息 maxclients 128
  16. 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內存,Value會存放在swap區 maxmemory <bytes>
  17. 指定是否在每次更新操作後進行日誌記錄,Redis在默認情況下是異步的把數據寫入磁盤,如果不開啓,可能會在斷電時導致一段時間內的數據丟失。因爲 redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在於內存中。默認爲no appendonly no
  18. 指定更新日誌文件名,默認爲appendonly.aof appendfilename appendonly.aof
  19. 指定更新日誌條件,共有3個可選值: no:表示等操作系統進行數據緩存同步到磁盤(快) always:表示每次更新操作後手動調用fsync()將數據寫到磁盤(慢,安全) everysec:表示每秒同步一次(折衷,默認值) appendfsync everysec
  20. 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制) vm-enabled no
  21. 虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享 vm-swap-file /tmp/redis.swap
  22. 將所有大於vm-max-memory的數據存入虛擬內存,無論vm-max-memory設置多小,所有索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置爲0的時候,其實是所有value都存在於磁盤。默認值爲0 vm-max-memory 0
  23. Redis swap文件分成了很多的page,一個對象可以保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,作者建議如果存儲很多小對象,page大小最好設置爲32或者64bytes;如果存儲很大大對象,則可以使用更大的page,如果不 確定,就使用默認值 vm-page-size 32
  24. 設置swap文件中的page數量,由於頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。 vm-pages 134217728
  25. 設置訪問swap文件的線程數,最好不要超過機器的核數,如果設置爲0,那麼所有對swap文件的操作都是串行的,可能會造成比較長時間的延遲。默認值爲4 vm-max-threads 4
  26. 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓 glueoutputbuf yes
  27. 指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法 hash-max-zipmap-entries 64 hash-max-zipmap-value 512
  28. 指定是否激活重置哈希,默認爲開啓 activerehashing yes
  29. 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件 include /path/to/local.conf
    Redis的數據類型:
    Keys 非二進制安全的字符類型( not binary-safe strings )

ValuesStrings Lists Sets Sorted sets Hash

Key: redis本質上一個key-value 數據庫,所以我們首先來看看他的key.首先key也是字符串類型,由於key不是binary safe的字符串,所以像“my key”和“mykey\n”這樣包含空格和換行的key是不允許的。

我們在使用的時候可以自己定義一個Key的格式。例如 object-type:id:field
Key不要太長。佔內存,查詢慢。
Key不要太短。u:1000:pwd 不如 user:1000:password 可讀性好

key的相關命令:

exits key 測試指定key是否存在,返回1表示存在,0不存在

del key1 key2 ....keyN 刪除給定key,返回刪除key的數目,0表示給定key都不存在

type key 返回給定key的value類型。返回 none 表示不存在,key有string字符類型,list 鏈表類型 set 無序集合類型等...

keys pattern 返回匹配指定模式的所有key(支持*,?,[abc ]的方式),下面給個例子

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
randomkey 返回從當前數據庫中隨機選擇的一個key,如果當前數據庫是空的,返回空串 rename oldkey newkey 原子的重命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。失敗可能是oldkey不存在或者和newkey相同renamenx oldkey newkey 同上,但是如果newkey存在返回失敗dbsize 返回當前數據庫的key數量expire key seconds 爲key指定過期時間,單位是秒。返回1成功,0表示key已經設置過過期時間或者不存在ttl key 返回設置了過期時間的key的剩餘過期秒數, -1表示key不存在或者沒有設置過過期時間select db-index 通過索引選擇數據庫,默認連接的數據庫所有是0,默認數據庫數是16個。返回1表示成功,0失敗move key db-index 將key從當前數據庫移動到指定數據庫。返回1成功。0 如果key不存在,或者已經在指定數據庫中flushdb 刪除當前數據庫中所有key,此方法不會失敗。慎用flushall 刪除所有數據庫中的所有key,此方法不會失敗。更加慎用

String類型:

string是redis最基本的類型,而且string類型是二進制安全的。

redis的string可以包含任何數據。包括jpg圖片或者序列化的對象。最大上限是1G字節。 如果只用string類型,redis就可以被看作加上持久化特性的memcached

String相關命令:

set key value 設置key對應的值爲string類型的value,返回1表示成功,0失敗

setnx key value 同上,如果key已經存在,返回0 。nx 是not exist的意思get key 獲取key對應的string值,如果key不存在返回nilgetset key value 設置key的值,並返回key的舊值。如果key不存在返回nilmget key1 key2 ... keyN 一次獲取多個key的值,如果對應key不存在,則對應返回nil。下面是個實驗, nonexisting不存在,對應返回nil

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
mset key1 value1 ... keyN valueN 一次設置多個key的值,成功返回1表示所有的值都設置了,失敗返回0表示沒有任何值被設置msetnx key1 value1 ... keyN valueN 同上,但是不會覆蓋已經存在的keyincr key 對key的值做加加操作,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key爲1decr key 同上,但是做的是減減操作,decr一個不存在key,則設置key爲-1incrby key integer 同incr,加指定值 ,key不存在時候會設置key,並認爲原來的value是 0decrby key integer 同decr,減指定值。decrby完全是爲了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。

append key value 給指定key的字符串值追加value,返回新字符串值的長度。下面給個例子

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
substr key start end 返回截取過的key的字符串值,注意並不修改key的值。下標是從0開始的。

List類型:

redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。我們可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊列。

list的pop操作還有阻塞版本的。當我們[lr]pop一個list對象是,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加超時時間,超時後也會返回nil。爲什麼要阻塞版本的pop呢,主要是爲了避免輪詢。舉個簡單的例子如果我們用list來實現一個工作隊列。執行任務的thread可以調用阻塞版本的pop去獲取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候工作線程可以立即返回,也可以避免輪詢帶來的延遲。

List的相關命令:

lpush key string 在key對應list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list類型rpush key string 同上,在尾部添加llen key 返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤lrange key start end 返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素 ,key不存在返回空列表ltrim key start end 截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤lset key index value 設置list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤lrem key count value 從key對應list中刪除count個和value相同的元素。count爲0時候刪除全部lpop key 從list的頭部刪除元素,並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤

rpop 同上,但是從尾部刪除blpop key1...keyN timeout 從左到右掃描返回對第一個非空list進行lpop操作並返回,比如blpop list1 list2 list3 0 ,如果list不存在,list2,list3都是非空則對list2做lpop並返回從list2中刪除的元素。如果所有的list都是空或不存在,則會阻塞timeout秒,timeout爲0表示一直阻塞。當阻塞時,如果有client對key1...keyN中的任意key進行push操作,則第一在這個key上被阻塞的client會立即返回。如果超時發生,則返回nil。brpop 同blpop,一個是從頭部刪除一個是從尾部刪除rpoplpush srckey destkey 從srckey對應list的尾部移除元素並添加到destkey對應list的頭部,最後返回被移除的元素值,整個操作是原子的.如果srckey是空或者不存在返回nil

Set類型:

redis的set是string類型的無序集合。set元素最大可以包含(2的32次方-1)個元素。set的是通過hash table實現的,hash table會隨着添加或者刪除自動的調整大小關於set集合類型除了基本的添加刪除操作,其他有用的操作還包含集合的取並集(union),交集(intersection),差集(difference)。通過這些操作可以很容易的實現sns中的好友推薦和blog的tag功能。

Set的相關命令:

sadd key member 添加一個string元素到,key對應的set集合中,成功返回1,如果元素以及在集合中返回0,key對應的set不存在返回錯誤srem key member 從key對應set中移除給定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應的不是set類型的值返回錯誤spop key 刪除並返回key對應set中隨機的一個元素,如果set是空或者key不存在返回nilsrandmember key 同spop,隨機取set中的一個元素,但是不刪除元素smove srckey dstkey member 從srckey對應set中移除member並添加到dstkey對應set中,整個操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set類型返回錯誤scard key 返回set的元素個數,如果set是空或者key不存在返回0sismember key member 判斷member是否在set中,存在返回1,0表示不存在或者key不存在sinter key1 key2...keyN 返回所有給定key的交集sinterstore dstkey key1...keyN 同sinter,但是會同時將交集存到dstkey下

sunion key1 key2...keyN 返回所有給定key的並集sunionstore dstkey key1...keyN 同sunion,並同時保存並集到dstkey下sdiff key1 key2...keyN 返回所有給定key的差集sdiffstore dstkey key1...keyN 同sdiff,並同時保存差集到dstkey下smembers key 返回key對應set的所有元素,結果是無序的

Sorted Set類型:

和set一樣sorted set也是string類型元素的集合,不同的是每個元素都會關聯一個double類型的score。sorted set的實現是skip list和hash table的混合體。當元素被添加到集合中時,一個元素到score的映射被添加到hash table中,另一個score到元素的映射被添加到skip list並按照score排序,所以就可以有序的獲取集合中的元素。

Sorted Set的相關命令:

zadd key score member 添加元素到集合,元素在集合中存在則更新對應score

zrem key member 刪除指定元素,1表示成功,如果元素不存在返回0zincrby key incr member 增加對應member的score值,然後移動元素並保持skip list有序。返回更新後的score值zrank key member 返回指定元素在集合中的排名(下標,非score),集合中元素是按score從小到大排序的zrevrank key member 同上,但是集合中元素是按score從大到小排序zrange key start end 類似lrange操作從集合中取指定區間的元素。返回的是有序結果zrevrange key start end 同上,返回結果是按score逆序的zrangebyscore key min max 返回集合中score在給定區間的元素zcount key min max 返回集合中score在給定區間的數量zcard key 返回集合中元素個數zscore key element 返回給定元素對應的scorezremrangebyrank key min max 刪除集合中排名在給定區間的元素zremrangebyscore key min max 刪除集合中score在給定區間的元素

Hash類型:

redis hash是一個string類型的field和value的映射表。hash特別適合用於存儲對象。相較於將對象的每個字段存成單個string類型。將一個對象存儲在hash類型中會佔用更少的內存,並且可以更方便的存取整個對象。

Hash的相關命令:

hset key field value 設置hash field爲指定值,如果key不存在,則先創建

hget key field 獲取指定的hash fieldhmget key filed1....fieldN 獲取全部指定的hash filedhmset key filed1 value1 ... filedN valueN 同時設置hash的多個fieldhincrby key field integer

Redis功能:
持久化:

redis是一個支持持久化的內存數據庫,也就是說redis需要經常將內存中的數據同步到磁盤來保證持久化,這是相對memcache來說的一個大的優勢。redis支持兩種持久化方式,一種是 Snapshotting(快照)也是默認方式,另一種是Append-only file(縮寫aof)的方式。 Snapshotting 快照是默認的持久化方式。這種方式將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。可以配置自動做快照持久 化的方式。我們可以配置redis在n秒內如果超過m個key被修改就自動做快照,下面是默認的快照保存配置save 900 1 #900秒內如果超過1個key被修改,則發起快照保存save 300 10 #300秒內容如超過10個key被修改,則發起快照保存

Append-only file

aof 比快照方式有更好的持久化性,是由於在使用aof持久化方式時,redis會將每一個收到的寫命令都通過write函數追加到文件中(默認是 appendonly.aof)。當redis重啓時會通過重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。當然由於os會在內核中緩存 write做的修改,所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴redis我們想要 通過fsync函數強制os寫入到磁盤的時機。

有三種方式如下(默認是:每秒fsync一次)

appendonly yes //啓用aof持久化方式

appendfsync always //每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用

appendfsync everysec //每秒鐘強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦

appendfsync no //完全依賴os,性能最好,持久化沒保證

主從複製:

主從複製允許多個slave server擁有和master server相同的數據庫副本。下面是關於redis主從複製的一些特點1.master可以有多個slave2.除了多個slave連到相同的master外,slave也可以連接其他slave形成圖狀結構3.主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步數據時,master可以繼續處理client發來的請求。相反slave在初次同步數據時則會阻塞,不能處理client的請求。4.主從複製可以用來提高系統的可伸縮性(我們可以用多個slave 專門用於client的讀請求,比如sort操作可以使用slave來處理),也可以用來做簡單的數據冗餘。5.可以在master禁用數據持久化,只需要註釋掉master 配置文件中的所有save配置,然後只在slave上配置數據持久化。

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
事務:

redis對事務的支持目前還比較簡單。redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其他client的命令。 Multi 事物開始Exec 執行事務Discard 放棄事物Watch 監聽keyUnwatch 放棄所有key的監聽watch 命令會監視給定的key,當exec時候如果監視的key從調用watch後發生過變化,則整個事務會失敗。注意watch的key是對整個連接有效的,和事務一樣,如果連接斷開,監視和事務都會被自動清除。

事務演示:

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)

發佈訂閱:

發佈訂閱(pub/sub)是一種消息通信模式。訂閱者可以通過subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將消息類型稱爲通道(channel)。當發佈者通過publish命令向redis server發送特定類型的消息時。訂閱該消息類型的全部client都會收到此消息。這裏消息的傳遞是多對多的。一個client可以訂閱多個 channel,也可以向多個channel發送消息。SubscribeUnsubscribePsubscribePunsubscribePublish

發佈訂閱演示:

客戶端一:

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
客戶端二:

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
客戶端三:

程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)

管道:

redis是一個cs模式的tcp server,使用和http類似的請求響應協議。一個client可以通過一個socket連接發起多個請求命令。每個請求命令發出後client通常 會阻塞並等待redis服務處理,redis處理完後請求命令後會將結果通過響應報文返回給client。基本的通信過程如下Client: INCR

XServer: 1

Client: INCR

XServer: 2

Client: INCR

XServer: 3

Client: INCR

XServer: 4基本上四個命令需要8個tcp報文才能完成。由於通信會有網絡延遲,假如從client和server之間的包傳輸時間需要0.125秒。那麼上面的四個命令8個報文至少會需要1秒才能完成。

利用pipeline的方式從client打包多條命令一起發出,不需要等待單條命令的響應返回,而redis服務端會處理完多條命令後會將多條命令的處理結果打包到一起返回給客戶端。通信過程如下

Client: INCR

XClient: INCR

XClient: INCR

XClient: INCR

XServer: 1

Server: 2

Server: 3

Server: 4

虛擬內存:

redis沒有使用os提供的虛擬內存機制而是自己實現了自己的虛擬內存機制 ,但是思路和目的都是相同的。就是暫時把不經常訪問的數據從內存交換到磁盤中,從而騰出內存空間用於其他需要訪問的數據。尤其是對於redis這樣的內存數據庫,內存總是不夠用的。除了可以將數據分割到多個redis server外。另外的能夠提高數據庫容量的辦法就是使用vm把那些不經常訪問的數據交換的磁盤上。如果我們的存儲的數據總是有少部分數據被經常訪問,大 部分數據很少被訪問,對於網站來說確實總是隻有少量用戶經常活躍。當少量數據被經常訪問時,使用vm不但能提高單臺redis server數據庫的容量,而且也不會對性能造成太多影響。vm-enabled yes #開啓vm功能vm-swap-file /tmp/redis.swap #交換的value保存的文件路徑/tmp/redis.swapvm-max-memory 1000000 #最大內存上限,超過後開始交換value到磁盤文件vm-page-size 32 #每個頁面的大小32個字節vm-pages 134217728 #最多使用在文件中使用多少頁面vm-max-threads 4 #用於執行value對象換入換出的工作線程數量,0表示不使用工作線程

Redis性能:
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
Redis部署:
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純乾貨)
Redis應用場景:
1.取最新N個數據的操作比如典型的取你網站的最新文章,通過下面方式,我們可以將最新的5000條評論的ID放在Redis的List集合中,並將超出集合部分從數據庫獲取使用LPUSH latest.comments<ID>命令,向list集合中插入數據 插入完成後再用LTRIM latest.comments 0 5000命令使其永遠只保存最近5000個ID 然後我們在客戶端獲取某一頁評論時可以用下面的邏輯(僞代碼) FUNCTION get_latest_comments(start,num_items):id_list = redis.lrange("latest.comments",start,start+num_items-1)IF id_list.length < num_items id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...") END RETURN id_list END 如果你還有不同的篩選維度,比如某個分類的最新N條,那麼你可以再建一個按此分類的List,只存ID的話,Redis是非常高效的。

2.排行榜應用,取TOP N操作

這個需求與上面需求的不同之處在於,前面操作以時間爲權重,這個是以某個條件爲權重,比如按頂的次數排序,這時候就需要我們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只需要執行一條ZADD命令即可。3.需要精準設定過期時間的應用比如你可以把上面說到的sorted set的score值設置成過期時間的時間戳,那麼就可以簡單地通過過期時間排序,定時清除過期數據了,不僅是清除Redis中的過期數據,你完全可以把Redis裏這個過期時間當成是對數據庫中數據的索引,用Redis來找出哪些數據需要過期刪除,然後再精準地從數據庫中刪除相應的記錄。4.計數器應用Redis的命令都是原子性的,你可以輕鬆地利用INCR,DECR命令來構建計數器系統。

5.Uniq操作,獲取某段時間所有數據排重值這個使用Redis的set數據結構最合適了,只需要不斷地將數據往set中扔就行了,set意爲集合,所以會自動排重。6.實時系統,反垃圾系統通過上面說到的set功能,你可以知道一個終端用戶是否進行了某個操作,可以找到其操作的集合並進行分析統計對比等。沒有做不到,只有想不到。7.Pub/Sub構建實時消息系統Redis的Pub/Sub系統可以構建實時的消息系統,比如很多用Pub/Sub構建的實時聊天系統的例子。8.構建隊列系統使用list可以構建隊列系統,使用sorted set甚至可以構建有優先級的隊列系統。9.緩存這個不必說了,性能優於Memcached(在某些方面,並不是全面優於),數據結構更多樣化。

Redis總結:
Redis使用最佳方式是全部數據in-memory。 Redis更多場景是作爲Memcached的替代者來使用。 當需要除key/value之外的更多數據類型支持時,使用Redis更合適。 當存儲的數據不能被剔除時,使用Redis更合適。(持久化)

對數據高併發讀寫對海量數據的高效率存儲和訪問 對數據的高可擴展性和高可用性(分佈式)

有任何什麼問題或者不同想法,歡迎留言溝通

特別聲明:本文素材來源於網絡,僅作爲分享學習之用,如有侵權,請聯繫刪除!

推薦閱讀

2020年Redis入門到精通全套視頻教程(純乾貨系列)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章