一、redis簡介
redis是業界主流的key-value nosql 數據庫之一。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis從它的許多競爭繼承來的三個主要特點:
-
Redis數據庫完全在內存中,使用磁盤僅用於持久性。
-
相比許多鍵值數據存儲,Redis擁有一套較為豐富的數據類型。
-
Redis可以將數據復制到任意數量的從服務器。
Redis 優勢:
-
異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
-
支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以處理通過它的數據類型更好。
-
操作都是原子性:所有Redis操作是原子的,這保證了如果兩個客戶端同時訪問的Redis服務器將獲得更新后的值。
-
多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發布/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。
-
MultiUtility工具:Redis是一個多功能實用工具,可以在很多如:緩存,消息傳遞隊列中使用(Redis原生支持發布/訂閱),在應用程序中,如:Web應用程序會話,網站頁面點擊數等任何短暫的數據;
安裝Redis環境
$sudo apt-get update $sudo apt-get install redis-server
啟動 Redis
$redis-server
查看 redis 是否還在運行
$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> ping PONG
redis配置
Redis 的配置文件位於 Redis 安裝目錄下,文件名為 redis.conf。 你可以通過 CONFIG 命令查看或設置配置項。 語法 Redis CONFIG 命令格式如下: redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME 實例 redis 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "notice" 使用 * 號獲取所有配置項: 實例 redis 127.0.0.1:6379> CONFIG GET * 1) "dbfilename" 2) "dump.rdb" 3) "requirepass" 4) "" 5) "masterauth" 6) "" 7) "unixsocket" 8) "" 9) "logfile" 10) "" 11) "pidfile" 12) "/var/run/redis.pid" 13) "maxmemory" 14) "0" 15) "maxmemory-samples" 16) "3" 17) "timeout" 18) "0" 19) "tcp-keepalive" 20) "0" 21) "auto-aof-rewrite-percentage" 22) "100" 23) "auto-aof-rewrite-min-size" 24) "67108864" 25) "hash-max-ziplist-entries" 26) "512" 27) "hash-max-ziplist-value" 28) "64" 29) "list-max-ziplist-entries" 30) "512" 31) "list-max-ziplist-value" 32) "64" 33) "set-max-intset-entries" 34) "512" 35) "zset-max-ziplist-entries" 36) "128" 37) "zset-max-ziplist-value" 38) "64" 39) "hll-sparse-max-bytes" 40) "3000" 41) "lua-time-limit" 42) "5000" 43) "slowlog-log-slower-than" 44) "10000" 45) "latency-monitor-threshold" 46) "0" 47) "slowlog-max-len" 48) "128" 49) "port" 50) "6379" 51) "tcp-backlog" 52) "511" 53) "databases" 54) "16" 55) "repl-ping-slave-period" 56) "10" 57) "repl-timeout" 58) "60" 59) "repl-backlog-size" 60) "1048576" 61) "repl-backlog-ttl" 62) "3600" 63) "maxclients" 64) "4064" 65) "watchdog-period" 66) "0" 67) "slave-priority" 68) "100" 69) "min-slaves-to-write" 70) "0" 71) "min-slaves-max-lag" 72) "10" 73) "hz" 74) "10" 75) "no-appendfsync-on-rewrite" 76) "no" 77) "slave-serve-stale-data" 78) "yes" 79) "slave-read-only" 80) "yes" 81) "stop-writes-on-bgsave-error" 82) "yes" 83) "daemonize" 84) "no" 85) "rdbcompression" 86) "yes" 87) "rdbchecksum" 88) "yes" 89) "activerehashing" 90) "yes" 91) "repl-disable-tcp-nodelay" 92) "no" 93) "aof-rewrite-incremental-fsync" 94) "yes" 95) "appendonly" 96) "no" 97) "dir" 98) "/usr/local/redis-3.0/src" #這是redis的安裝路徑 99) "maxmemory-policy" 100) "volatile-lru" 101) "appendfsync" 102) "everysec" 103) "save" 104) "3600 1 300 100 60 10000" 105) "loglevel" 106) "notice" 107) "client-output-buffer-limit" 108) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60" 109) "unixsocketperm" 110) "0" 111) "slaveof" 112) "" 113) "notify-keyspace-events" 114) "" 115) "bind" 116) ""
編輯配置 你可以通過修改 redis.conf 文件或使用 CONFIG set 命令來修改配置。 語法 CONFIG SET 命令基本語法: redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE 實例 redis 127.0.0.1:6379> CONFIG SET loglevel "notice" OK redis 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel" 2) "notice" 參數說明 redis.conf 配置項說明如下: 1. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程 daemonize no 2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定 pidfile /var/run/redis.pid 3. 指定Redis監聽端口,默認端口為6379,為什么選用6379作為默認端口,因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字 port 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 <dbid>命令在連接上指定數據庫id databases 16 9. 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合 save <seconds> <changes> Redis默認配置文件中提供了三個條件: 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 <masterip> <masterport> 14. 當master服務設置了密碼保護時,slav服務連接master的密碼 masterauth <master-password> 15. 設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH <password>命令提供密碼,默認關閉 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 <bytes> 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. 指定是否激活重置哈希,默認為開啟(后面在介紹Redis的哈希算法時具體介紹) activerehashing yes 30. 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件 include /path/to/local.conf
Redis 操作
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string是redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value。
string類型是二進制安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。
string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
實例
-
1 redis 127.0.0.1:6379> SET name "redis.net.cn" 2 OK 3 redis 127.0.0.1:6379> GET name 4 "redis.net.cn"
在以上實例中我們使用了 Redis 的 SET 和 GET 命令。鍵為 name,對應的值為redis.net.cn。
注意:一個鍵最大能存儲512MB。
Hash(哈希)
Redis hash 是一個鍵值對集合。
Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
實例
-
1 redis 127.0.0.1:6379> HMSET user:1 username redis.net.cn password redis.net.cn points 200 2 OK 3 redis 127.0.0.1:6379> HGETALL user:1 4 1)"username" 5 2)"redis.net.cn" 6 3)"password" 7 4)"redis.net.cn" 8 5)"points" 9 6)"200" 10 redis 127.0.0.1:6379>
以上實例中 hash 數據類型存儲了包含用戶腳本信息的用戶對象。 實例中我們使用了 Redis HMSET, HEGTALL 命令,user:1 為鍵值。
每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
List(列表)
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素導列表的頭部(左邊)或者尾部(右邊)。
實例
-
1 redis 127.0.0.1:6379> lpush redis.net.cn redis 2 (integer)1 3 redis 127.0.0.1:6379> lpush redis.net.cn mongodb 4 (integer)2 5 redis 127.0.0.1:6379> lpush redis.net.cn rabitmq 6 (integer)3 7 redis 127.0.0.1:6379> lrange redis.net.cn 010 8 1)"rabitmq" 9 2)"mongodb" 10 3)"redis" 11 redis 127.0.0.1:6379>
列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。
Set(集合)
Redis的Set是string類型的無序集合。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。
sadd 命令
添加一個string元素到,key對應的set集合中,成功返回1,如果元素以及在集合中返回0,key對應的set不存在返回錯誤。
sadd key member
實例
1 redis 127.0.0.1:6379> sadd redis.net.cn redis 2 (integer)1 3 redis 127.0.0.1:6379> sadd redis.net.cn mongodb 4 (integer)1 5 redis 127.0.0.1:6379> sadd redis.net.cn rabitmq 6 (integer)1 7 redis 127.0.0.1:6379> sadd redis.net.cn rabitmq 8 (integer)0 9 redis 127.0.0.1:6379> smembers redis.net.cn 10 11 1)"rabitmq" 12 2)"mongodb" 13 3)"redis"
注意:以上實例中 rabitmq 添加了兩次,但根據集合內元素的唯一性,第二次插入的元素將被忽略。
集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
zset(sorted set:有序集合)
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
zset的成員是唯一的,但分數(score)卻可以重復。
zadd 命令
添加元素到集合,元素在集合中存在則更新對應score
1 zadd key score member
實例
1 redis 127.0.0.1:6379> zadd redis.net.cn 0 redis 2 (integer)1 3 redis 127.0.0.1:6379> zadd redis.net.cn 0 mongodb 4 (integer)1 5 redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq 6 (integer)1 7 redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq 8 (integer)0 9 redis 127.0.0.1:6379> ZRANGEBYSCORE redis.net.cn 01000 10 11 1)"redis" 12 2)"mongodb" 13 3)"rabitmq"
redis配置
Redis 的配置文件位於 Redis 安裝目錄下,文件名為 redis.conf。
你可以通過 CONFIG 命令查看或設置配置項。
語法
Redis CONFIG 命令格式如下:
-
1 redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
實例
-
1 redis 127.0.0.1:6379> CONFIG GET loglevel 2 3 1)"loglevel" 4 2)"notice"
使用 * 號獲取所有配置項:
實例
-
1 redis 127.0.0.1:6379> CONFIG GET * 2 3 1)"dbfilename" 4 2)"dump.rdb" 5 3)"requirepass" 6 4)"" 7 5)"masterauth" 8 6)"" 9 7)"unixsocket" 10 8)"" 11 9)"logfile" 12 10)"" 13 11)"pidfile" 14 12)"/var/run/redis.pid" 15 13)"maxmemory" 16 14)"0" 17 15)"maxmemory-samples" 18 16)"3" 19 17)"timeout" 20 18)"0" 21 19)"tcp-keepalive" 22 20)"0" 23 21)"auto-aof-rewrite-percentage" 24 22)"100" 25 23)"auto-aof-rewrite-min-size" 26 24)"67108864" 27 25)"hash-max-ziplist-entries" 28 26)"512" 29 27)"hash-max-ziplist-value" 30 28)"64" 31 29)"list-max-ziplist-entries" 32 30)"512" 33 31)"list-max-ziplist-value" 34 32)"64" 35 33)"set-max-intset-entries" 36 34)"512" 37 35)"zset-max-ziplist-entries" 38 36)"128" 39 37)"zset-max-ziplist-value" 40 38)"64" 41 39)"hll-sparse-max-bytes" 42 40)"3000" 43 41)"lua-time-limit" 44 42)"5000" 45 43)"slowlog-log-slower-than" 46 44)"10000" 47 45)"latency-monitor-threshold" 48 46)"0" 49 47)"slowlog-max-len" 50 48)"128" 51 49)"port" 52 50)"6379" 53 51)"tcp-backlog" 54 52)"511" 55 53)"databases" 56 54)"16" 57 55)"repl-ping-slave-period" 58 56)"10" 59 57)"repl-timeout" 60 58)"60" 61 59)"repl-backlog-size" 62 60)"1048576" 63 61)"repl-backlog-ttl" 64 62)"3600" 65 63)"maxclients" 66 64)"4064" 67 65)"watchdog-period" 68 66)"0" 69 67)"slave-priority" 70 68)"100" 71 69)"min-slaves-to-write" 72 70)"0" 73 71)"min-slaves-max-lag" 74 72)"10" 75 73)"hz" 76 74)"10" 77 75)"no-appendfsync-on-rewrite" 78 76)"no" 79 77)"slave-serve-stale-data" 80 78)"yes" 81 79)"slave-read-only" 82 80)"yes" 83 81)"stop-writes-on-bgsave-error" 84 82)"yes" 85 83)"daemonize" 86 84)"no" 87 85)"rdbcompression" 88 86)"yes" 89 87)"rdbchecksum" 90 88)"yes" 91 89)"activerehashing" 92 90)"yes" 93 91)"repl-disable-tcp-nodelay" 94 92)"no" 95 93)"aof-rewrite-incremental-fsync" 96 94)"yes" 97 95)"appendonly" 98 96)"no" 99 97)"dir" 100 98)"/home/deepak/Downloads/redis-2.8.13/src" 101 99)"maxmemory-policy" 102 100)"volatile-lru" 103 101)"appendfsync" 104 102)"everysec" 105 103)"save" 106 104)"3600 1 300 100 60 10000" 107 105)"loglevel" 108 106)"notice" 109 107)"client-output-buffer-limit" 110 108)"normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60" 111 109)"unixsocketperm" 112 110)"0" 113 111)"slaveof" 114 112)"" 115 113)"notify-keyspace-events" 116 114)"" 117 115)"bind" 118 116)""
編輯配置
你可以通過修改 redis.conf 文件或使用 CONFIG set 命令來修改配置。
語法
CONFIG SET 命令基本語法:
-
1 redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
實例
-
1 redis 127.0.0.1:6379> CONFIG SET loglevel "notice" 2 OK 3 redis 127.0.0.1:6379> CONFIG GET loglevel 4 5 1)"loglevel" 6 2)"notice"
參數說明
redis.conf 配置項說明如下:
1. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程
daemonize no
2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
pidfile /var/run/redis.pid
3. 指定Redis監聽端口,默認端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認端口,因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字
port 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 <dbid>
命令在連接上指定數據庫id
databases 16
9. 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
save <seconds>
<changes>
Redis默認配置文件中提供了三個條件:
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 <masterip>
<masterport>
14. 當master服務設置了密碼保護時,slav服務連接master的密碼
masterauth <master-password>
15. 設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH <password>
命令提供密碼,默認關閉
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 <bytes>
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. 指定是否激活重置哈希,默認為開啟(后面在介紹Redis的哈希算法時具體介紹)
activerehashing yes
30. 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件
include /path/to/local.conf
redis命令
Redis 命令用於在 redis 服務上執行操作。
要在 redis 服務上執行命令需要一個 redis 客戶端。Redis 客戶端在我們之前下載的的 redis 的安裝包中。
語法
Redis 客戶端的基本語法為:
- $ redis-cli
實例
以下實例講解了如何啟動 redis 客戶端:
啟動 redis 客戶端,打開終端並輸入命令 redis-cli。該命令會連接本地的 redis 服務。
-
1 $redis-cli 2 redis 127.0.0.1:6379> 3 redis 127.0.0.1:6379> PING 4 5 PONG
在以上實例中我們連接到本地的 redis 服務並執行 PING 命令,該命令用於檢測 redis 服務是否啟動。
在遠程服務上執行命令
如果需要在遠程 redis 服務上執行命令,同樣我們使用的也是 redis-cli 命令。
語法
-
1 $ redis-cli -h host -p port -a password
實例
以下實例演示了如何連接到主機為 127.0.0.1,端口為 6379 ,密碼為 mypass 的 redis 服務上。
-
1 $redis-cli -h 127.0.0.1 -p 6379 -a "mypass" 2 redis 127.0.0.1:6379> 3 redis 127.0.0.1:6379> PING 4 5 PONG
Redis 鍵(key)
Redis 鍵命令用於管理 redis 的鍵。
語法
Redis 鍵命令的基本語法如下:
-
1 redis 127.0.0.1:6379> COMMAND KEY_NAME
實例
-
1 redis 127.0.0.1:6379> SET w3ckey redis 2 OK 3 redis 127.0.0.1:6379> DEL w3ckey 4 (integer) 1
在以上實例中 DEL 是一個命令, w3ckey 是一個鍵。 如果鍵被刪除成功,命令執行后輸出 (integer) 1,否則將輸出 (integer) 0
Redis keys 命令
下表給出了與 Redis 鍵相關的基本命令:
序號 | 命令及描述 |
---|---|
1 | DEL key 該命令用於在 key 存在是刪除 key。 |
2 | DUMP key 序列化給定 key ,並返回被序列化的值。 |
3 | EXISTS key 檢查給定 key 是否存在。 |
4 | EXPIRE key seconds 為給定 key 設置過期時間。 |
5 | EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 類似,都用於為 key 設置過期時間。 不同在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。 |
6 | PEXPIRE key milliseconds 設置 key 的過期時間億以毫秒計。 |
7 | PEXPIREAT key milliseconds-timestamp 設置 key 過期時間的時間戳(unix timestamp) 以毫秒計 |
8 | KEYS pattern 查找所有符合給定模式( pattern)的 key 。 |
9 | MOVE key db 將當前數據庫的 key 移動到給定的數據庫 db 當中。 |
10 | PERSIST key 移除 key 的過期時間,key 將持久保持。 |
11 | PTTL key 以毫秒為單位返回 key 的剩余的過期時間。 |
12 | TTL key 以秒為單位,返回給定 key 的剩余生存時間(TTL, time to live)。 |
13 | RANDOMKEY 從當前數據庫中隨機返回一個 key 。 |
14 | RENAME key newkey 修改 key 的名稱 |
15 | RENAMENX key newkey 僅當 newkey 不存在時,將 key 改名為 newkey 。 |
16 | TYPE key 返回 key 所儲存的值的類型。 |
Redis 字符串(String)
Redis 字符串數據類型的相關命令用於管理 redis 字符串值,基本語法如下:
語法
1 redis 127.0.0.1:6379> COMMAND KEY_NAME
實例
1 redis 127.0.0.1:6379> SET w3ckey redis OK redis 127.0.0.1:6379> GET w3ckey "redis"
在以上實例中我們使用了 SET 和 GET 命令,鍵為 w3ckey。
Redis 字符串命令
下表列出了常用的 redis 字符串命令:
序號 | 命令及描述 |
---|---|
1 | SET key value 設置指定 key 的值 |
2 | GET key 獲取指定 key 的值。 |
3 | GETRANGE key start end 返回 key 中字符串值的子字符 |
4 | GETSET key value 將給定 key 的值設為 value ,並返回 key 的舊值(old value)。 |
5 | GETBIT key offset 對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。 |
6 | MGET key1 [key2..] 獲取所有(一個或多個)給定 key 的值。 |
7 | SETBIT key offset value 對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。 |
8 | SETEX key seconds value 將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)。 |
9 | SETNX key value 只有在 key 不存在時設置 key 的值。 |
10 | SETRANGE key offset value 用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。 |
11 | STRLEN key 返回 key 所儲存的字符串值的長度。 |
12 | MSET key value [key value ...] 同時設置一個或多個 key-value 對。 |
13 | MSETNX key value [key value ...] 同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。 |
14 | PSETEX key milliseconds value 這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。 |
15 | INCR key 將 key 中儲存的數字值增一。 |
16 | INCRBY key increment 將 key 所儲存的值加上給定的增量值(increment) 。 |
17 | INCRBYFLOAT key increment 將 key 所儲存的值加上給定的浮點增量值(increment) 。 |
18 | DECR key 將 key 中儲存的數字值減一。 |
19 | DECRBY key decrement key 所儲存的值減去給定的減量值(decrement) 。 |
20 | APPEND key value 如果 key 已經存在並且是一個字符串, APPEND 命令將 value 追加到 key 原來的值的末尾。 |
Redis 哈希(Hash)
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
實例
-
1 redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 2 OK 3 redis 127.0.0.1:6379> HGETALL w3ckey 4 5 1) "name" 6 2) "redis tutorial" 7 3) "description" 8 4) "redis basic commands for caching" 9 5) "likes" 10 6) "20" 11 7) "visitors" 12 8) "23000"
在以上實例中,我們設置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 w3ckey 中。
Redis hash 命令
下表列出了 redis hash 基本的相關命令:
序號 | 命令及描述 |
---|---|
1 | HDEL key field2 [field2] 刪除一個或多個哈希表字段 |
2 | HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。 |
3 | HGET key field 獲取存儲在哈希表中指定字段的值/td> |
4 | HGETALL key 獲取在哈希表中指定 key 的所有字段和值 |
5 | HINCRBY key field increment 為哈希表 key 中的指定字段的整數值加上增量 increment 。 |
6 | HINCRBYFLOAT key field increment 為哈希表 key 中的指定字段的浮點數值加上增量 increment 。 |
7 | HKEYS key 獲取所有哈希表中的字段 |
8 | HLEN key 獲取哈希表中字段的數量 |
9 | HMGET key field1 [field2] 獲取所有給定字段的值 |
10 | HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中。 |
11 | HSET key field value 將哈希表 key 中的字段 field 的值設為 value 。 |
12 | HSETNX key field value 只有在字段 field 不存在時,設置哈希表字段的值。 |
13 | HVALS key 獲取哈希表中所有值 |
14 | HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。 |
Redis 列表(List)
Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素導列表的頭部(左邊)或者尾部(右邊)
一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)。
實例
1 redis 127.0.0.1:6379> LPUSH w3ckey redis 2 (integer) 1 3 redis 127.0.0.1:6379> LPUSH w3ckey mongodb 4 (integer) 2 5 redis 127.0.0.1:6379> LPUSH w3ckey mysql 6 (integer) 3 7 redis 127.0.0.1:6379> LRANGE w3ckey 0 10 8 9 1) "mysql" 10 2) "mongodb" 11 3) "redis"
在以上實例中我們使用了 LPUSH 將三個值插入了名為 w3ckey 的列表當中。
Redis 列表命令
下表列出了列表相關的基本命令:
序號 | 命令及描述 |
---|---|
1 | BLPOP key1 [key2 ] timeout 移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 |
2 | BRPOP key1 [key2 ] timeout 移出並獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 |
3 | BRPOPLPUSH source destination timeout 從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 |
4 | LINDEX key index 通過索引獲取列表中的元素 |
5 | LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素 |
6 | LLEN key 獲取列表長度 |
7 | LPOP key 移出並獲取列表的第一個元素 |
8 | LPUSH key value1 [value2] 將一個或多個值插入到列表頭部 |
9 | LPUSHX key value 將一個或多個值插入到已存在的列表頭部 |
10 | LRANGE key start stop 獲取列表指定范圍內的元素 |
11 | LREM key count value 移除列表元素 |
12 | LSET key index value 通過索引設置列表元素的值 |
13 | LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。 |
14 | RPOP key 移除並獲取列表最后一個元素 |
15 | RPOPLPUSH source destination 移除列表的最后一個元素,並將該元素添加到另一個列表並返回 |
16 | RPUSH key value1 [value2] 在列表中添加一個或多個值 |
17 | RPUSHX key value 為已存在的列表添加值 |
Redis 集合(Set)
Redis的Set是string類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重復的數據。
Redis 中 集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。
集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
實例
1 redis 127.0.0.1:6379> SADD w3ckey redis 2 (integer) 1 3 redis 127.0.0.1:6379> SADD w3ckey mongodb 4 (integer) 1 5 redis 127.0.0.1:6379> SADD w3ckey mysql 6 (integer) 1 7 redis 127.0.0.1:6379> SADD w3ckey mysql 8 (integer) 0 9 redis 127.0.0.1:6379> SMEMBERS w3ckey 10 11 1) "mysql" 12 2) "mongodb" 13 3) "redis"
在以上實例中我們通過 SADD 命令向名為 w3ckey 的集合插入的三個元素。
Redis 集合命令
下表列出了 Redis 集合基本命令:
序號 | 命令及描述 |
---|---|
1 | SADD key member1 [member2] 向集合添加一個或多個成員 |
2 | SCARD key 獲取集合的成員數 |
3 | SDIFF key1 [key2] 返回給定所有集合的差集 |
4 | SDIFFSTORE destination key1 [key2] 返回給定所有集合的差集並存儲在 destination 中 |
5 | SINTER key1 [key2] 返回給定所有集合的交集 |
6 | SINTERSTORE destination key1 [key2] 返回給定所有集合的交集並存儲在 destination 中 |
7 | SISMEMBER key member 判斷 member 元素是否是集合 key 的成員 |
8 | SMEMBERS key 返回集合中的所有成員 |
9 | SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合 |
10 | SPOP key 移除並返回集合中的一個隨機元素 |
11 | SRANDMEMBER key [count] 返回集合中一個或多個隨機數 |
12 | SREM key member1 [member2] 移除集合中一個或多個成員 |
13 | SUNION key1 [key2] 返回所有給定集合的並集 |
14 | SUNIONSTORE destination key1 [key2] 所有給定集合的並集存儲在 destination 集合中 |
15 | SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素 |
Redis 有序集合(sorted set)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
實例
-
1 redis 127.0.0.1:6379> ZADD w3ckey 1 redis 2 (integer) 1 3 redis 127.0.0.1:6379> ZADD w3ckey 2 mongodb 4 (integer) 1 5 redis 127.0.0.1:6379> ZADD w3ckey 3 mysql 6 (integer) 1 7 redis 127.0.0.1:6379> ZADD w3ckey 3 mysql 8 (integer) 0 9 redis 127.0.0.1:6379> ZADD w3ckey 4 mysql 10 (integer) 0 11 redis 127.0.0.1:6379> ZRANGE w3ckey 0 10 WITHSCORES 12 13 1) "redis" 14 2) "1" 15 3) "mongodb" 16 4) "2" 17 5) "mysql" 18 6) "4"
在以上實例中我們通過命令 ZADD 向 redis 的有序集合中添加了三個值並關聯上分數。
Redis 有序集合命令
下表列出了 redis 有序集合的基本命令:
Redis HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 結構。
Redis HyperLogLog 是用來做基數統計的算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、並且是很小的。
在 Redis 里面,每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 2^64 個不同元素的基 數。這和計算基數時,元素越多耗費內存就越多的集合形成鮮明對比。
但是,因為 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個元素。
什么是基數?
比如數據集 {1, 3, 5, 7, 5, 7, 8}, 那么這個數據集的基數集為 {1, 3, 5 ,7, 8}, 基數(不重復元素)為5。 基數估計就是在誤差可接受的范圍內,快速計算基數。
實例
以下實例演示了 HyperLogLog 的工作過程:
-
1 redis 127.0.0.1:6379> PFADD w3ckey "redis" 2 3 1) (integer) 1 4 5 redis 127.0.0.1:6379> PFADD w3ckey "mongodb" 6 7 1) (integer) 1 8 9 redis 127.0.0.1:6379> PFADD w3ckey "mysql" 10 11 1) (integer) 1 12 13 redis 127.0.0.1:6379> PFCOUNT w3ckey 14 15 (integer) 3
Redis HyperLogLog 命令
下表列出了 redis HyperLogLog 的基本命令:
序號 | 命令及描述 |
---|---|
1 | PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。 |
2 | PFCOUNT key [key ...] 返回給定 HyperLogLog 的基數估算值。 |
3 | PFMERGE destkey sourcekey [sourcekey ...] 將多個 HyperLogLog 合並為一個 HyperLogLog |
Redis 發布訂閱
Redis 發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數量的頻道。
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關系:
當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個客戶端:
實例
以下實例演示了發布訂閱是如何工作的。在我們實例中我們創建了訂閱頻道名為 redisChat:
1 redis 127.0.0.1:6379> SUBSCRIBE redisChat 2 3 Reading messages... (press Ctrl-C to quit) 4 1) "subscribe" 5 2) "redisChat" 6 3) (integer) 1
現在,我們先重新開啟個 redis 客戶端,然后在同一個頻道 redisChat 發布兩次消息,訂閱者就能接收到消息。
1 redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique" 2 3 (integer) 1 4 5 redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by w3cschool.cc" 6 7 (integer) 1 8 9 # 訂閱者的客戶端會顯示如下消息 10 1) "message" 11 2) "redisChat" 12 3) "Redis is a great caching technique" 13 1) "message" 14 2) "redisChat" 15 3) "Learn redis by w3cschool.cc"
Redis 發布訂閱命令
下表列出了 redis 發布訂閱常用命令:
序號 | 命令及描述 |
---|---|
1 | PSUBSCRIBE pattern [pattern ...] 訂閱一個或多個符合給定模式的頻道。 |
2 | PUBSUB subcommand [argument [argument ...]] 查看訂閱與發布系統狀態。 |
3 | PUBLISH channel message 將信息發送到指定的頻道。 |
4 | PUNSUBSCRIBE [pattern [pattern ...]] 退訂所有給定模式的頻道。 |
5 | SUBSCRIBE channel [channel ...] 訂閱給定的一個或多個頻道的信息。 |
6 | UNSUBSCRIBE [channel [channel ...]] 指退訂給定的頻道。 |
Redis 事務
Redis 事務可以一次執行多個命令, 並且帶有以下兩個重要的保證:
- 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
- 事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行。
一個事務從開始到執行會經歷以下三個階段:
- 開始事務。
- 命令入隊。
- 執行事務。
實例
以下是一個事務的例子, 它先以 MULTI 開始一個事務, 然后將多個命令入隊到事務中, 最后由 EXEC 命令觸發事務, 一並執行事務中的所有命令:
-
1 redis 127.0.0.1:6379> MULTI 2 OK 3 4 redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" 5 QUEUED 6 7 redis 127.0.0.1:6379> GET book-name 8 QUEUED 9 10 redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" 11 QUEUED 12 13 redis 127.0.0.1:6379> SMEMBERS tag 14 QUEUED 15 16 redis 127.0.0.1:6379> EXEC 17 1) OK 18 2) "Mastering C++ in 21 days" 19 3) (integer) 3 20 4) 1) "Mastering Series" 21 2) "C++" 22 3) "Programming"
Redis 事務命令
下表列出了 redis 事務的相關命令:
序號 | 命令及描述 |
---|---|
1 | DISCARD 取消事務,放棄執行事務塊內的所有命令。 |
2 | EXEC 執行所有事務塊內的命令。 |
3 | MULTI 標記一個事務塊的開始。 |
4 | UNWATCH 取消 WATCH 命令對所有 key 的監視。 |
5 | WATCH key [key ...] 監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。 |
更多請查看:http://www.redis.net.cn/tutorial/3515.html