程序员,想要彻底弄懂Redis,这15点你一定要明白~(纯干货)
?點擊上方?好好學java?,選擇?星標?公眾號
重磅資訊、干貨,第一時間送達 今日推薦:Java實現QQ登錄和微博登錄個人原創+1博客:點擊前往,查看更多 作者:耿直的小碼農 來源:https://segmentfault.com/a/1190000022105542Redis是一款開源的、高性能的鍵-值存儲(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
6. 指定日志記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認為verbose loglevel verbose
7. 日志記錄方式,默認為標準輸出,如果配置Redis為守護進程方式運行,而這里又配置為日志記錄方式為標準輸出,則日志將會發送給/dev/null logfile stdout
8. 設置數據庫的數量,默認數據庫為0,可以使用SELECT命令在連接上指定數據庫id databases 16
9. 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合 saveRedis默認配置文件中提供了三個條件:save 900 1 save 300 10 save 60 10000 分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
10. 指定存儲至本地數據庫時是否壓縮數據,默認為yes,Redis采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大 rdbcompression yes
11. 指定本地數據庫文件名,默認值為dump.rdb dbfilename dump.rdb
12. 指定本地數據庫存放目錄 dir ./
13. 設置當本機為slav服務時,設置master服務的IP地址及端口,在Redis啟動時,它會自動從master進行數據同步 slaveof
14. 當master服務設置了密碼保護時,slav服務連接master的密碼 masterauth
15. 設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH命令提供密碼,默認關閉 requirepass foobared
16. 設置同一時間最大客戶端連接數,默認無限制,Redis可以同時打開的客戶端連接數為Redis進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis會關閉新的連接并向客戶端返回max number of clients reached錯誤信息 maxclients 128
17. 指定Redis最大內存限制,Redis在啟動時會把數據加載到內存中,達到最大內存后,Redis會先嘗試清除已到期或即將到期的Key,當此方法處理 后,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內存,Value會存放在swap區 maxmemory
18. 指定是否在每次更新操作后進行日志記錄,Redis在默認情況下是異步的把數據寫入磁盤,如果不開啟,可能會在斷電時導致一段時間內的數據丟失。因為 redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在于內存中。默認為no appendonly no
19. 指定更新日志文件名,默認為appendonly.aof appendfilename appendonly.aof
20. 指定更新日志條件,共有3個可選值:no:表示等操作系統進行數據緩存同步到磁盤(快) always:表示每次更新操作后手動調用fsync()將數據寫到磁盤(慢,安全) everysec:表示每秒同步一次(折衷,默認值) appendfsync everysec
21. 指定是否啟用虛擬內存機制,默認值為no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在后面的文章我會仔細分析Redis的VM機制) vm-enabled no
22. 虛擬內存文件路徑,默認值為/tmp/redis.swap,不可多個Redis實例共享 vm-swap-file /tmp/redis.swap
23. 將所有大于vm-max-memory的數據存入虛擬內存,無論vm-max-memory設置多小,所有索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置為0的時候,其實是所有value都存在于磁盤。默認值為0 vm-max-memory 0
24. Redis swap文件分成了很多的page,一個對象可以保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,作者建議如果存儲很多小對象,page大小最好設置為32或者64bytes;如果存儲很大大對象,則可以使用更大的page,如果不 確定,就使用默認值 vm-page-size 32
25. 設置swap文件中的page數量,由于頁表(一種表示頁面空閑或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。vm-pages 134217728
26. 設置訪問swap文件的線程數,最好不要超過機器的核數,如果設置為0,那么所有對swap文件的操作都是串行的,可能會造成比較長時間的延遲。默認值為4 vm-max-threads 4
27. 設置在向客戶端應答時,是否把較小的包合并為一個包發送,默認為開啟 glueoutputbuf yes
28. 指定在超過一定的數量或者最大的元素超過某一臨界值時,采用一種特殊的哈希算法 hash-max-zipmap-entries 64 hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默認為開啟 activerehashing yes
30. 指定包含其它的配置文件,可以在同一主機上多個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-typefield Key不要太長。占內存,查詢慢。Key不要太短。u:1000:pwd 不如 user:1000:password 可讀性好
key的相關命令:
exitskey 測試指定key是否存在,返回1表示存在,0不存在
delkey1 key2 ....keyN 刪除給定key,返回刪除key的數目,0表示給定key都不存在
typekey 返回給定key的value類型。返回 none 表示不存在,key有string字符類型,list 鏈表類型 set 無序集合類型等...
keys pattern返回匹配指定模式的所有key(支持*,?,[abc ]的方式),下面給個例子
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純干貨)程序員,想要徹底弄懂Redis,這15點你一定要明白~(純干貨)randomkey返回從當前數據庫中隨機選擇的一個key,如果當前數據庫是空的,返回空串renameoldkey newkey 原子的重命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。失敗可能是oldkey不存在或者和newkey相同renamenxoldkey newkey 同上,但是如果newkey存在返回失敗dbsize返回當前數據庫的key數量expirekey seconds 為key指定過期時間,單位是秒。返回1成功,0表示key已經設置過過期時間或者不存在ttlkey 返回設置了過期時間的key的剩余過期秒數, -1表示key不存在或者沒有設置過過期時間selectdb-index 通過索引選擇數據庫,默認連接的數據庫所有是0,默認數據庫數是16個。返回1表示成功,0失敗movekey db-index 將key從當前數據庫移動到指定數據庫。返回1成功。0 如果key不存在,或者已經在指定數據庫中flushdb刪除當前數據庫中所有key,此方法不會失敗。慎用flushall刪除所有數據庫中的所有key,此方法不會失敗。更加慎用
String類型:
string是redis最基本的類型,而且string類型是二進制安全的。
redis的string可以包含任何數據。包括jpg圖片或者序列化的對象。最大上限是1G字節。如果只用string類型,redis就可以被看作加上持久化特性的memcached
String相關命令:
setkey value 設置key對應的值為string類型的value,返回1表示成功,0失敗
setnxkey value 同上,如果key已經存在,返回0 。nx 是not exist的意思getkey 獲取key對應的string值,如果key不存在返回nilgetsetkey value 設置key的值,并返回key的舊值。如果key不存在返回nilmgetkey1 key2 ... keyN 一次獲取多個key的值,如果對應key不存在,則對應返回nil。下面是個實驗, nonexisting不存在,對應返回nil
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純干貨)msetkey1 value1 ... keyN valueN 一次設置多個key的值,成功返回1表示所有的值都設置了,失敗返回0表示沒有任何值被設置msetnxkey1 value1 ... keyN valueN 同上,但是不會覆蓋已經存在的keyincrkey 對key的值做加加操作,并返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key為1decrkey 同上,但是做的是減減操作,decr一個不存在key,則設置key為-1incrbykey integer 同incr,加指定值 ,key不存在時候會設置key,并認為原來的value是 0decrbykey integer 同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。
appendkey value 給指定key的字符串值追加value,返回新字符串值的長度。下面給個例子
程序員,想要徹底弄懂Redis,這15點你一定要明白~(純干貨)substrkey 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的相關命令:
lpushkey string 在key對應list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list類型rpushkey string 同上,在尾部添加llenkey 返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤lrangekey start end 返回指定區間內的元素,下標從0開始,負值表示從后面計算,-1表示倒數第一個元素 ,key不存在返回空列表ltrimkey start end 截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤lsetkey index value 設置list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤lremkey count value 從key對應list中刪除count個和value相同的元素。count為0時候刪除全部lpopkey 從list的頭部刪除元素,并返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤
rpop同上,但是從尾部刪除blpopkey1...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,一個是從頭部刪除一個是從尾部刪除rpoplpushsrckey destkey 從srckey對應list的尾部移除元素并添加到destkey對應list的頭部,最后返回被移除的元素值,整個操作是原子的.如果srckey是空或者不存在返回nil
Set類型:
redis的set是string類型的無序集合。set元素最大可以包含(2的32次方-1)個元素。set的是通過hash table實現的,hash table會隨著添加或者刪除自動的調整大小關于set集合類型除了基本的添加刪除操作,其他有用的操作還包含集合的取并集(union),交集(interp),差集(difference)。通過這些操作可以很容易的實現sns中的好友推薦和blog的tag功能。
Set的相關命令:
saddkey member 添加一個string元素到,key對應的set集合中,成功返回1,如果元素以及在集合中返回0,key對應的set不存在返回錯誤sremkey member 從key對應set中移除給定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應的不是set類型的值返回錯誤spopkey 刪除并返回key對應set中隨機的一個元素,如果set是空或者key不存在返回nilsrandmemberkey 同spop,隨機取set中的一個元素,但是不刪除元素smovesrckey dstkey member 從srckey對應set中移除member并添加到dstkey對應set中,整個操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set類型返回錯誤scardkey 返回set的元素個數,如果set是空或者key不存在返回0sismemberkey member 判斷member是否在set中,存在返回1,0表示不存在或者key不存在sinterkey1 key2...keyN 返回所有給定key的交集sinterstoredstkey key1...keyN 同sinter,但是會同時將交集存到dstkey下
sunionkey1 key2...keyN 返回所有給定key的并集sunionstoredstkey key1...keyN 同sunion,并同時保存并集到dstkey下sdiffkey1 key2...keyN 返回所有給定key的差集sdiffstoredstkey key1...keyN 同sdiff,并同時保存差集到dstkey下smemberskey 返回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的相關命令:
zaddkey score member 添加元素到集合,元素在集合中存在則更新對應score
zremkey member 刪除指定元素,1表示成功,如果元素不存在返回0zincrbykey incr member 增加對應member的score值,然后移動元素并保持skip list有序。返回更新后的score值zrankkey member 返回指定元素在集合中的排名(下標,非score),集合中元素是按score從小到大排序的zrevrankkey member 同上,但是集合中元素是按score從大到小排序zrangekey start end 類似lrange操作從集合中取指定區間的元素。返回的是有序結果zrevrangekey start end 同上,返回結果是按score逆序的zrangebyscorekey min max 返回集合中score在給定區間的元素zcountkey min max 返回集合中score在給定區間的數量zcardkey 返回集合中元素個數zscorekey element 返回給定元素對應的scorezremrangebyrankkey min max 刪除集合中排名在給定區間的元素zremrangebyscorekey min max 刪除集合中score在給定區間的元素
Hash類型:
redis hash是一個string類型的field和value的映射表。hash特別適合用于存儲對象。相較于將對象的每個字段存成單個string類型。將一個對象存儲在hash類型中會占用更少的內存,并且可以更方便的存取整個對象。
Hash的相關命令:
hsetkey field value 設置hash field為指定值,如果key不存在,則先創建
hgetkey field 獲取指定的hash fieldhmgetkey filed1....fieldN 獲取全部指定的hash filedhmsetkey filed1 value1 ... filedN valueN 同時設置hash的多個fieldhincrbykey 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命令,向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更合適。(持久化)
對數據高并發讀寫對海量數據的高效率存儲和訪問 對數據的高可擴展性和高可用性(分布式)
有任何什么問題或者不同想法,歡迎留言溝通
★特別聲明:本文素材來源于網絡,僅作為分享學習之用,如有侵權,請聯系刪除!
”總結
以上是生活随笔為你收集整理的程序员,想要彻底弄懂Redis,这15点你一定要明白~(纯干货)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后端程序员必备:书写高质量SQL的30条
- 下一篇: 为什么你投出去的简历,都石沉大海了?