redis使用指南
<a href="https://s2.51cto.com/wyfs02/M02/9B/FD/wKioL1lqAoHxyo01AAA3XHbm_lI768.png" target="_blank"></a>
一、Redis簡介
redis展開來看就是remote directory server。redis是開源的,基于記憶體的資料結構存儲,可以作為資料庫,緩存系統或者消息隊列。它支援資料結構有字元串、清單(數組)、hashes(關聯數組)、集合、有序集合、bitmaps(位圖)、hyperloglogs、空間索引,十分的強大。redis有内建的複制功能,支援lua腳本,LRU算法,事務,持久存儲并且支援高可用(sentinel,redis cluster)。以下是redis的特點總結:
<a href="https://s1.51cto.com/wyfs02/M01/9B/FE/wKiom1lqAx3AG8aVAABNiEDKB7I613.png" target="_blank"></a>
二、Redis安裝
由于redis功能十分的強大,應用十分的廣泛,目前已經被收錄到了epel倉庫,是以我們隻需要将yum倉庫指向epel倉庫即可。是以這裡安裝十分的簡單,直接yum install -y redis。注意我這裡安裝的是redis3.2版本,目前官方最新版本為redis4。下載下傳安裝方式十分簡單。如有想法,請戳網址
https://redis.io/download
三、配置檔案詳解
通常rpm安裝的軟體包,我們可以通過如下指令檢視程式相關的配置檔案
<code>[root@mysql ~]</code><code># rpm -ql redis</code>
<code>/etc/logrotate</code><code>.d</code><code>/redis</code>
<code>/etc/redis-sentinel</code><code>.conf </code><code>#監控(哨兵)配置檔案</code>
<code>/etc/redis</code><code>.conf </code><code>#主配置檔案</code>
<code>/etc/systemd/system/redis-sentinel</code><code>.service.d</code>
<code>/etc/systemd/system/redis-sentinel</code><code>.service.d</code><code>/limit</code><code>.conf</code>
<code>/etc/systemd/system/redis</code><code>.service.d</code>
<code>/etc/systemd/system/redis</code><code>.service.d</code><code>/limit</code><code>.conf</code>
<code>/usr/bin/redis-benchmark</code>
<code>/usr/bin/redis-check-aof</code>
<code>/usr/bin/redis-check-rdb</code>
<code>/usr/bin/redis-cli</code> <code>#redis用戶端程式</code>
<code>/usr/bin/redis-sentinel</code>
<code>/usr/bin/redis-server</code> <code>#redis服務端程式</code>
<code>/usr/bin/redis-shutdown</code>
<code>/usr/lib/systemd/system/redis-sentinel</code><code>.service</code>
<code>/usr/lib/systemd/system/redis</code><code>.service</code>
<code>/usr/lib/tmpfiles</code><code>.d</code><code>/redis</code><code>.conf</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/00-RELEASENOTES</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/BUGS</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/CONTRIBUTING</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/MANIFESTO</code>
<code>/usr/share/doc/redis-3</code><code>.2.3</code><code>/README</code><code>.md</code>
<code>/usr/share/licenses/redis-3</code><code>.2.3</code>
<code>/usr/share/licenses/redis-3</code><code>.2.3</code><code>/COPYING</code>
<code>/var/lib/redis</code>
<code>/var/log/redis</code> <code>#redis日志檔案目錄</code>
<code>/var/run/redis</code>
<code>[root@mysql ~]</code><code># grep '^##' /etc/redis.conf </code>
<code>################################## INCLUDES ###################################</code>
<code>################################## NETWORK #####################################</code>
<code>################################# GENERAL #####################################</code>
<code>################################ SNAPSHOTTING ################################</code>
<code>################################# REPLICATION #################################</code>
<code>################################## SECURITY ###################################</code>
<code>################################### LIMITS ####################################</code>
<code>############################## APPEND ONLY MODE ###############################</code>
<code>################################ LUA SCRIPTING ###############################</code>
<code>################################ REDIS CLUSTER ###############################</code>
<code>################################## SLOW LOG ###################################</code>
<code>################################ LATENCY MONITOR ##############################</code>
<code>############################# EVENT NOTIFICATION ##############################</code>
<code>############################### ADVANCED CONFIG ###############################</code>
grep以下可以檢視redis主配置檔案有哪些配置段。
使用以下指令還可以檢視主配置檔案中已經開啟了哪些服務。
<code>[root@mysql2 ~]</code><code># cat /etc/redis.conf | grep -v '#' | sed '/^$/d' </code>
<code>bind 0.0.0.0</code>
<code>protected-mode no</code>
<code>port 6379</code>
<code>tcp-backlog 511</code>
<code>timeout 0</code>
<code>tcp-keepalive 300</code>
<code>daemonize no</code>
<code>supervised no</code>
<code>pidfile </code><code>/var/run/redis/redis</code><code>.pid</code>
<code>loglevel notice</code>
<code>logfile </code><code>/var/log/redis/redis</code><code>.log</code>
<code>databases 16</code>
<code>save 900 1</code>
<code>save 300 10</code>
<code>save 60 10000</code>
<code>stop-writes-on-bgsave-error </code><code>yes</code>
<code>rdbcompression </code><code>yes</code>
<code>rdbchecksum </code><code>yes</code>
<code>dbfilename dump.rdb</code>
<code>dir</code> <code>/var/lib/redis</code>
<code>slave-serve-stale-data </code><code>yes</code>
<code>slave-</code><code>read</code><code>-only </code><code>yes</code>
<code>repl-diskless-</code><code>sync</code> <code>no</code>
<code>repl-diskless-</code><code>sync</code><code>-delay 5</code>
<code>repl-disable-tcp-nodelay no</code>
<code>slave-priority 100</code>
<code>appendonly no</code>
<code>appendfilename </code><code>"appendonly.aof"</code>
<code>appendfsync everysec</code>
<code>no-appendfsync-on-rewrite no</code>
<code>auto-aof-rewrite-percentage 100</code>
<code>auto-aof-rewrite-min-size 64mb</code>
<code>aof-load-truncated </code><code>yes</code>
<code>lua-</code><code>time</code><code>-limit 5000</code>
<code> </code><code>cluster-enabled </code><code>yes</code>
<code> </code><code>cluster-config-</code><code>file</code> <code>nodes-6379.conf</code>
<code> </code><code>cluster-node-timeout 15000</code>
<code>slowlog-log-slower-than 10000</code>
<code>slowlog-max-len 128</code>
<code>latency-monitor-threshold 0</code>
<code>notify-keyspace-events </code><code>""</code>
<code>hash</code><code>-max-ziplist-entries 512</code>
<code>hash</code><code>-max-ziplist-value 64</code>
<code>list-max-ziplist-size -2</code>
<code>list-compress-depth 0</code>
<code>set</code><code>-max-intset-entries 512</code>
<code>zset-max-ziplist-entries 128</code>
<code>zset-max-ziplist-value 64</code>
<code>hll-sparse-max-bytes 3000</code>
<code>activerehashing </code><code>yes</code>
<code>client-output-buffer-limit normal 0 0 0</code>
<code>client-output-buffer-limit slave 256mb 64mb 60</code>
<code>client-output-buffer-limit pubsub 32mb 8mb 60</code>
<code>hz 10</code>
<code>aof-rewrite-incremental-fsync </code><code>yes</code>
接下來分析主配置檔案/etc/redis.conf各個配置段的内容
3.1、INCLUDES配置段
如果你有更好的配置模闆,請放在這個配置段
<code># include /path/to/local.conf</code>
<code># include /path/to/other.conf</code>
3.2、網絡配置段
網絡配置項:
<code>bind 127.0.0.1</code>
<code>#允許連接配接redis的用戶端IP</code>
<code>#安全模式</code>
<code>#端口</code>
<code>#後援隊列</code>
<code>#用戶端閑置時,關閉用戶端連接配接的逾時時長,0表示不關閉</code>
<code>#長連接配接逾時時長</code>
3.3、通用配置段
<code>############################### GENERAL #####################################</code>
<code>#預設情況下redis不以守護程序的模式運作</code>
<code>#是否開啟超級監管 </code>
<code>pid檔案路徑</code>
<code>#日志級别</code>
<code> </code>
<code>#指定日志檔案路徑</code>
<code>#設定資料庫的數量</code>
3.4、快照配置段
RDB(将記憶體中的資料刷寫到磁盤),RDB對記憶體做快照,不停地快照導出資料,缺點:容易丢失資料
<code>save 900 1 </code>
<code>#900秒有一個鍵值改變做一次快照</code>
<code>#300秒有10個鍵值改變做一次快照</code>
<code>save 60 10000 </code>
<code>#60秒有10000鍵值改變就做一次快照</code>
<code>#預設情況下,如果在RDB snapshots持久化過程中出現問題,設定該參數後,Redis是不允許使用者進行任何更新操作</code>
<code>#在導出.RDB資料庫檔案的時候采用LZF壓縮字元串和對象。想節省一些CPU資源可以設定為no,但資料量可能會很大。</code>
<code>#RDB快照制作過程中會在檔案的末尾寫入crc64的校驗值。這樣可能很好的保證資料的正确性。</code>
<code>代價是導緻性能下降</code>
<code>#快照檔案名</code>
<code>dir</code> <code>./</code>
<code>#快照路徑</code>
3.5、主從配置相關段
主從配置相關的配置項,一個Master可以有多個slave主機,支援鍊式複制;Master以非阻塞方式同步資料至slave主機。
<code>slaveof <masterip> <masterport></code>
<code>#用于建立從伺服器</code>
<code># masterauth <master-password></code>
<code>#主伺服器認證密碼</code>
<code>#當slave丢失與master端的連接配接,或者複制仍在處理,那麼slave會有下列兩種表現:</code>
<code> </code><code>yes</code><code>表示,slave繼續響應用戶端的請求,盡管資料已經不同了。</code>
<code> </code><code>no表示slave會傳回</code><code>"SYNC with master in progreee"</code><code>的錯誤資訊;</code>
<code>#從伺服器隻讀</code>
<code>repl-diskless-</code><code>sync</code> <code>no </code>
<code>新的從節點或某較長時間未能與主節點進行同步的從節點重新與主節點通信,需要做“full synchronization",此時其同步方式有兩種style:</code>
<code> </code><code>Disk-backend:主節點新建立快照檔案于磁盤中,而後将其發送給從節點;</code>
<code> </code><code>Diskless:主節占新建立快照後直接通過網絡套接字檔案發送給從節點;為了實作并行複制,通常需要在複制啟動前延遲一個時間段;</code>
<code> </code>
<code>#基于網絡套接字同步延遲時長</code>
<code>repl-</code><code>ping</code><code>-slave-period 10</code>
<code>#ping從伺服器的時間間隔</code>
<code># repl-timeout 60</code>
<code>#主從複制逾時時長</code>
<code>#預設為no,當選擇yes的時候, master會向slave發送少量的tcp packets,這樣的一個負面影響 delay slave接受資料時間,40 milliseconds 的延遲,在 高流量或者 master slave之間中間節點數很多的情況下,建議變為 yes</code>
<code># repl-backlog-size 1mb</code>
<code>#後援隊了的最大記憶體</code>
<code># repl-backlog-ttl 3600</code>
<code>#後援隊列的ttl時長</code>
<code>#當master服務挂了後,優先級越低的slave,越有可能成為master候選人</code>
<code># min-slaves-to-write 3 </code>
<code>#最少從節點線上時,主節點允許寫資料</code>
<code># min-slaves-max-lag 10 </code>
<code>#從節點最多落後主節點多長時間</code>
<code># slave-announce-ip 5.5.5.5 </code>
<code>#對外宣稱伺服器的IP</code>
<code># slave-announce-port 1234 </code>
<code>#對外宣稱伺服器的端口</code>
3.6、安全相關配置段
<code>#安全相關的</code>
<code># requirepass foobared</code>
<code>#是否設定密碼,requirepass +密碼</code>
<code>#rename-command CONFIG ""</code>
<code>#重命名或禁用某些指令</code>
3.7、limit配置段
<code># maxclients 10000</code>
<code>#用戶端并發數量</code>
<code># maxmemory <bytes></code>
<code>#記憶體限制,過期會删除key</code>
<code> </code><code>最大并發連接配接數</code>
<code># maxmemory <bytes> </code>
<code>最大可提供記憶體</code>
<code># maxmemory-policy noeviction</code>
<code> </code><code>記憶體淘汰政策</code>
<code># volatile-lru -> remove the key with an expire set using an LRU algorithm </code>
<code> </code><code>基于LRU算法将過期時間的鍵做淘汰</code>
<code># allkeys-lru -> remove any key according to the LRU algorithm</code>
<code> </code><code>基于LRU算法将所有鍵淘汰 </code>
<code># volatile-random -> remove a random key with an expire set </code>
<code> </code><code>随機淘汰</code>
<code># allkeys-random -> remove a random key, any key</code>
<code> </code><code>對所有鍵做随機淘汰</code>
<code># volatile-ttl -> remove the key with the nearest expire time (minor TTL)</code>
<code> </code><code>基于TTL時長淘汰</code>
<code># noeviction -> don't expire at all, just return an error on write operations </code>
<code> </code><code>從不淘汰,一旦記憶體耗盡,報錯</code>
<code>預設是:</code><code># maxmemory-policy noeviction</code>
<code>推薦volatile-lru,volatile-ttl </code>
<code>如何判斷記憶體的淘汰?-->定量采樣</code>
<code> </code><code># maxmemory-samples 5</code>
3.8、AOF模式配置段
AOF,即 APPEND ONLY MODE,意思僅追加檔案。rdis記憶體中的資料預設是異步同步到磁盤的,如果發生當機,會造成一些資料的丢失。AOF也是資料持久化的一種方式,可以提高資料的可靠性。AOF模式會記錄每次寫操作至指定的檔案尾部實作存儲持久化;當redis重新開機時,可通過重新執行檔案中的指令在記憶體中重建出資料庫。預設使用fsync() 刷寫磁盤資料,發生斷電,或者Redis出現内部錯誤的時候最多丢失1秒資料。AOF和RDB這兩種持久化方式可以同時開啟不會發生沖突,開始AOF模式的話,Redis會把每次寫入的資料在接收後都寫入 appendonly.aof 檔案。每次啟動時Redis都會把這個檔案的資料讀入記憶體裡。
<code>#是否記錄持久化日志</code>
<code>#AOF 檔案</code>
<code>#每秒寫一次</code>
<code>#fsync() 請求作業系統馬上把資料寫到磁盤上</code>
<code>redis支援以下三種模式</code>
<code> </code><code>no:redis不執行主動同步操作,而是OS進行;</code>
<code> </code><code>everysec:每秒一次;</code>
<code> </code><code>always:每語句一次,慢,但是安全;</code>
<code> </code>
<code>#是否在背景執行aof重寫期間不調用fsync,預設為no,表示調用;</code>
<code>#上述兩個條件同時滿足時,方會觸發重寫AOF;與上次aof檔案大小相比,其增長量超過100%,且大小不少于64MB就會重寫AOF; </code>
<code># redis在啟動的時候可以加載被截斷的AOF檔案,預設啟用;否則可能啟動失敗</code>
<code>注意:持久機制本身不能取代備份;應該制訂備份政策,對redis庫定期備份;</code>
3.9、LUA腳本配置段
<code>#lua腳本執行時間限制</code>
3.10、redis叢集配置段
<code>cluster-enabled </code><code>yes</code>
<code>#是否開啟叢集</code>
<code>cluster-config-</code><code>file</code> <code>nodes-6379.conf</code>
<code>#叢集配置檔案</code>
<code>cluster-node-timeout 15000</code>
<code>#叢集節點通信逾時時長</code>
3.11、慢啟動日志配置段
慢啟動日志用于記錄超過指定時間的查詢,但需要注意的是:運作時間不包括各種I/O時間。
例如:連接配接用戶端,發送響應資料等。
<code>#慢查詢日志長度,這個長度沒有限制,機關為微妙,隻要有足夠的記憶體就行可以通過 SLOWLOG RESET 來釋放記憶體</code>
3.12、延遲監控配置段
3.13、事件通知配置段
3.14、redis進階配置段
配置redis的進階選項
<code>#每一個對應的hash能存儲的最大entries</code>
<code>#每一個對應的hash能存儲的最大value</code>
<code>#當有大量資料時,适合用哈希編碼但需要更多的記憶體,元素數量上限不能超過給定限制。</code>
<code>list-max-ziplist-entries 512</code>
<code>list-max-ziplist-value 64</code>
<code>#與哈希相類似,list資料元素較少的情況下,可以用另一種方式來編碼進而節省大量空間。</code>
<code>#set 編碼形式為是64位無符号整型數字構成的字元串。該參數來限制這種情況下使用這種編碼的最大上限的。</code>
<code>#和 hashes,lists 相似,為了節約空間 sorted sets 也使用特殊的編碼方式。這種編碼隻适合長度和元素都符合上面限制的有序序列。</code>
<code>#當子程序重寫AOF檔案,以下選項開啟時,AOF檔案會每産生32M資料同步一次,這有利于避免寫入磁盤延遲。</code>
四、redis用法簡介
4.1、redis指令選項
使用redis-cli -h指令可以檢視redis用戶端指令的用法。選項用法其實很簡單,搞定英語應該不在話下。
<code>[root@mysql ~]</code><code># redis-cli -h</code>
<code>redis-cli 3.2.3</code>
<code>Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]</code>
<code> </code><code>-h <</code><code>hostname</code><code>> Server </code><code>hostname</code> <code>(default: 127.0.0.1). </code>
<code> </code><code>-p <port> Server port (default: 6379).</code>
<code> </code><code>-s <socket> Server socket (overrides </code><code>hostname</code> <code>and port).</code>
<code> </code><code>-a <password> Password to use when connecting to the server.</code>
<code> </code><code>-r <repeat> Execute specified </code><code>command</code> <code>N </code><code>times</code><code>.</code>
<code> </code><code>-i <interval> When -r is used, waits <interval> seconds per </code><code>command</code><code>.</code>
<code> </code><code>It is possible to specify sub-second </code><code>times</code> <code>like -i 0.1.</code>
<code> </code><code>-n <db> Database number.</code>
<code> </code><code>-x Read last argument from STDIN.</code>
<code> </code><code>-d <delimiter> Multi-bulk delimiter </code><code>in</code> <code>for</code> <code>raw formatting (default: \n).</code>
<code> </code><code>-c Enable cluster mode (follow -ASK and -MOVED redirections).</code>
<code> </code><code>--raw Use raw formatting </code><code>for</code> <code>replies (default when STDOUT is</code>
<code> </code><code>not a </code><code>tty</code><code>).</code>
<code> </code><code>--no-raw Force formatted output even when STDOUT is not a </code><code>tty</code><code>.</code>
<code> </code><code>--csv Output </code><code>in</code> <code>CSV </code><code>format</code><code>.</code>
<code> </code><code>--stat Print rolling stats about server: mem, clients, ...</code>
<code> </code><code>--latency Enter a special mode continuously sampling latency.</code>
<code> </code><code>--latency-</code><code>history</code> <code>Like --latency but tracking latency changes over </code><code>time</code><code>.</code>
<code> </code><code>Default </code><code>time</code> <code>interval is 15 sec. Change it using -i.</code>
<code> </code><code>--latency-dist Shows latency as a spectrum, requires xterm 256 colors.</code>
<code> </code><code>Default </code><code>time</code> <code>interval is 1 sec. Change it using -i.</code>
<code> </code><code>--lru-</code><code>test</code> <code><keys> Simulate a cache workload with an 80-20 distribution.</code>
<code> </code><code>--slave Simulate a slave showing commands received from the master.</code>
<code> </code><code>--rdb <filename> Transfer an RDB dump from remote server to </code><code>local</code> <code>file</code><code>.</code>
<code> </code><code>--pipe Transfer raw Redis protocol from stdin to server.</code>
<code> </code><code>--pipe-timeout <n> In --pipe mode, abort with error </code><code>if</code> <code>after sending all data.</code>
<code> </code><code>no reply is received within <n> seconds.</code>
<code> </code><code>Default timeout: 30. Use 0 to wait forever.</code>
<code> </code><code>--bigkeys Sample Redis keys looking </code><code>for</code> <code>big keys.</code>
<code> </code><code>--scan List all keys using the SCAN </code><code>command</code><code>.</code>
<code> </code><code>--pattern <pat> Useful with --scan to specify a SCAN pattern.</code>
<code> </code><code>--intrinsic-latency <sec> Run a </code><code>test</code> <code>to measure intrinsic system latency.</code>
<code> </code><code>The </code><code>test</code> <code>will run </code><code>for</code> <code>the specified amount of seconds.</code>
<code> </code><code>--</code><code>eval</code> <code><</code><code>file</code><code>> Send an EVAL </code><code>command</code> <code>using the Lua script at <</code><code>file</code><code>>.</code>
<code> </code><code>--ldb Used with --</code><code>eval</code> <code>enable</code> <code>the Redis Lua debugger.</code>
<code> </code><code>--ldb-</code><code>sync</code><code>-mode Like --ldb but uses the synchronous Lua debugger, </code><code>in</code>
<code> </code><code>this mode the server is blocked and script changes are</code>
<code> </code><code>are not rolled back from the server memory.</code>
<code> </code><code>--help Output this help and </code><code>exit</code><code>.</code>
<code> </code><code>--version Output version and </code><code>exit</code><code>.</code>
<code> </code><code>Examples:</code>
<code> </code><code>cat</code> <code>/etc/passwd</code> <code>| redis-cli -x </code><code>set</code> <code>mypasswd</code>
<code> </code><code>redis-cli get mypasswd</code>
<code> </code><code>redis-cli -r 100 lpush mylist x</code>
<code> </code><code>redis-cli -r 100 -i 1 info | </code><code>grep</code> <code>used_memory_human:</code>
<code> </code><code>redis-cli --</code><code>eval</code> <code>myscript.lua key1 key2 , arg1 arg2 arg3</code>
<code> </code><code>redis-cli --scan --pattern </code><code>'*:12345*'</code>
一些簡單指令的操作
連接配接redis服務端
<code>[root@mysql ~]</code><code># redis-cli </code>
<code>127.0.0.1:6379></code>
選擇第1資料庫
<code>127.0.0.1:6379> </code><code>select</code> <code>1 </code>
<code>OK</code>
選擇第15個資料庫
<code>127.0.0.1:6379[1]> </code><code>select</code> <code>15 </code>
<code>127.0.0.1:6379[15]></code>
選擇第17個庫,報錯,redis預設16個庫
<code>127.0.0.1:6379[15]> </code><code>select</code> <code>17</code>
<code>(error) ERR invalid DB index</code>
選擇預設庫
<code>127.0.0.1:6379[15]> </code><code>select</code> <code>0 </code>
使用幫助,檢視transaction的使用,當然你按下tab鍵就可以檢視其他的指令的使用
<code>127.0.0.1:6379> help @transactions</code>
<code> </code><code>DISCARD -</code>
<code> </code><code>summary: Discard all commands issued after MULTI</code>
<code> </code><code>since: 2.0.0</code>
<code> </code><code>EXEC -</code>
<code> </code><code>summary: Execute all commands issued after MULTI</code>
<code> </code><code>since: 1.2.0</code>
<code> </code><code>MULTI -</code>
<code> </code><code>summary: Mark the start of a transaction block</code>
<code> </code><code>UNWATCH -</code>
<code> </code><code>summary: Forget about all watched keys</code>
<code> </code><code>since: 2.2.0</code>
<code> </code><code>WATCH key [key ...]</code>
<code> </code><code>summary: Watch the given keys to determine execution of the MULTI</code><code>/EXEC</code> <code>block</code>
按下tab可切換檢視不同的選項
<code>127.0.0.1:6379> help @</code>
輸入指令時會自動提示輸入後面的内容,相當的友善
<code>127.0.0.1:6379> </code><code>set</code> <code>key value [EX seconds] [PX milliseconds] [NX|XX]</code>
4.2、redis資料類型
1.string 字元串
redis String是最常用的一種資料類型,普通的key/value存儲都可以歸為此類;
<code>foo->bar 鍵值關系</code>
<code>#檢視string字元串相關操作指令</code>
<code>help @string </code>
<code>#設定鍵值</code>
<code>127.0.0.1:6379> SET testkey </code><code>'tom'</code>
<code>#擷取鍵值</code>
<code>127.0.0.1:6379> get testkey</code>
<code>"tom"</code>
<code>#追加鍵值,往後補值</code>
<code>127.0.0.1:6379> append testkey </code><code>' neo'</code>
<code>(integer) 9</code>
<code>#删除鍵</code>
<code>127.0.0.1:6379> del testkey</code>
<code>(integer) 1</code>
<code>#擷取鍵</code>
<code>(nil)</code>
<code>#設定多個鍵值</code>
<code>127.0.0.1:6379> mset name </code><code>'tom'</code> <code>age 12</code>
<code>#擷取多個鍵值</code>
<code>127.0.0.1:6379> mget name age</code>
<code>1) </code><code>"tom"</code>
<code>2) </code><code>"12"</code>
<code>#設定數值1</code>
<code>27.0.0.1:6379> </code><code>set</code> <code>counts 1 </code>
<code>#擷取數值</code>
<code>127.0.0.1:6379> get counts </code>
<code>"1"</code>
<code>#減一操作</code>
<code>127.0.0.1:6379> decr counts</code>
<code>(integer) 0</code>
<code>127.0.0.1:6379> get counts</code>
<code>"0"</code>
<code>#加一操作</code>
<code>127.0.0.1:6379> incr counts</code>
<code>(integer) 2</code>
<code>"2"</code>
2.list 清單
redis list 類型其實就是每個子元素都是 string 類型的雙向連結清單,這就意味着即使你有成千上萬中元素在list中,添加一個新元素到list開頭或者結尾的操作算法時間複雜度都是O(1)。
<code>#檢視list清單相關操作指令</code>
<code>help @list</code>
<code>l:left</code>
<code>r:right</code>
<code>#在清單中追加一個值</code>
<code>127.0.0.1:6379> lpush mylist </code><code>'monday'</code>
<code>#按索引檢視清單中的元素,檢視[0]号元素,即第一個元素</code>
<code>127.0.0.1:6379> lindex mylist 0</code>
<code>"monday"</code>
<code>127.0.0.1:6379> lpush mylist </code><code>'sunday'</code>
<code>#按索引檢視清單中的元素</code>
<code>"sunday"</code>
<code>#按索引檢視清單中的元素,檢視第二個元素</code>
<code>127.0.0.1:6379> lindex mylist 1</code>
<code>#從清單右邊追加一個值</code>
<code>127.0.0.1:6379> rpush mylist </code><code>'tuesday'</code>
<code>(integer) 3</code>
<code>127.0.0.1:6379> lindex mylist 2</code>
<code>"tuesday"</code>
<code>#從清單右邊删除一個值</code>
<code>127.0.0.1:6379> rpop mylist</code>
<code>"Tuesday"</code>
<code>127.0.0.1:6379> lindex mylist 2 </code>
<code>#擷取清單的長度</code>
<code>127.0.0.1:6379> llen mylist</code>
<code>127.0.0.1:6379> lpop mylist</code>
3. hash
redis hash是一個string類型的field和value的映射表.
<code>#檢視hash類型相關操作指令</code>
<code>help @</code><code>hash</code>
<code>#設定hash鍵值為stu1,字段id,值為1</code>
<code>127.0.0.1:6379> hset stu1 </code><code>id</code> <code>1 </code>
<code>#設定另一個hash資料</code>
<code>127.0.0.1:6379> hset stu1 name </code><code>'tom'</code>
<code>127.0.0.1:6379> hset stu1 age 12</code>
<code>#擷取hash字段中所有的值</code>
<code>127.0.0.1:6379> hmget stu1 </code><code>id</code> <code>name age </code>
<code>1) </code><code>"1"</code>
<code>2) </code><code>"tom"</code>
<code>3) </code><code>"12"</code>
<code>#擷取hash中所有的值</code>
<code>127.0.0.1:6379> hvals stu1</code>
<code>#擷取hash中所有的字段</code>
<code>127.0.0.1:6379> hkeys stu1</code>
<code>1) </code><code>"id"</code>
<code>2) </code><code>"name"</code>
<code>3) </code><code>"age"</code>
<code>#擷取hash中所有字段及對應的值</code>
<code>127.0.0.1:6379> hgetall stu1</code>
<code>2) </code><code>"1"</code>
<code>3) </code><code>"name"</code>
<code>4) </code><code>"tom"</code>
<code>5) </code><code>"age"</code>
<code>6) </code><code>"12"</code>
4 set 集合
redis的set是string類型的無序集合。
<code>#檢視set資料類型相關的操作指令</code>
<code>127.0.0.1:6379> help @</code><code>set</code>
<code>#在students集合中添加多個成員</code>
<code>127.0.0.1:6379> sadd students </code><code>'tom'</code> <code>'jerry'</code> <code>'lili'</code>
<code>#在teachers集合中添加多個成員</code>
<code>127.0.0.1:6379> sadd teachers </code><code>'sam'</code> <code>'jerry'</code>
<code>#将 students集合中的‘lili’移到teachers集合</code>
<code>127.0.0.1:6379> smove students teachers </code><code>'lili'</code>
<code>#擷取集合中所有的成員</code>
<code>127.0.0.1:6379> smembers students</code>
<code>2) </code><code>"jerry"</code>
<code>127.0.0.1:6379> smembers teachers</code>
<code>1) </code><code>"lili"</code>
<code>2) </code><code>"sam"</code>
<code>3) </code><code>"jerry"</code>
<code>#擷取兩個集合的交集</code>
<code>127.0.0.1:6379> sinter students teachers </code>
<code>1) </code><code>"jerry"</code>
<code>#擷取兩個集合的并集</code>
<code>127.0.0.1:6379> sunion students teachers</code>
<code>3) </code><code>"sam"</code>
<code>4) </code><code>"jerry"</code>
<code>#students集合中有那些成員teachers集合不存在</code>
<code>127.0.0.1:6379> </code><code>sdiff</code> <code>students teachers </code>
<code>#和上面相反</code>
<code>127.0.0.1:6379> </code><code>sdiff</code> <code>teachers students</code>
<code>#随機删除集合中的一個成員</code>
<code>127.0.0.1:6379> spop students 1 </code>
<code>#删除一個成員</code>
<code>127.0.0.1:6379> srem students </code><code>'tom'</code>
5 sorted set 有序集合
redis的sorted set是string類型的有序集合。
<code>#擷取有序集合資料類型相關的操作指令用法</code>
<code>127.0.0.1:6379> help @sorted_set</code>
<code>#有序添加stus集合的成員</code>
<code>127.0.0.1:6379> zadd stus 1 </code><code>'tom'</code> <code>2 </code><code>'jerry'</code> <code>3 </code><code>'lucy'</code>
<code>#有序添加teas集合的成員</code>
<code>127.0.0.1:6379> zadd teas 1 </code><code>'sam'</code> <code>2 </code><code>'jerry'</code> <code>3 </code><code>'lili'</code>
<code>#擷取有序集合成員的個數</code>
<code>127.0.0.1:6379> zcard teas</code>
<code>#同上</code>
<code>127.0.0.1:6379> ZCARD stus</code>
<code> </code><code>#擷取索引</code>
<code>127.0.0.1:6379> zrank teas jerry </code>
<code>#通過索引擷取值</code>
<code>127.0.0.1:6379> zrange stus 1 2 </code>
<code>2) </code><code>"lucy"</code>
<code>#通過分數擷取有序集合中的對應的值</code>
<code>127.0.0.1:6379> ZRANGEBYSCORE stus 1 2 </code>
<code>#添加一個有序集合</code>
<code>127.0.0.1:6379> ZADD ecscores 67 </code><code>'tom'</code> <code>33 </code><code>'lili'</code> <code>89 </code><code>'michael'</code> <code>55 </code><code>'sam'</code>
<code>(integer) 4</code>
<code>127.0.0.1:6379> ZRANGEBYSCORE ecscores 44 90</code>
<code>1) </code><code>"sam"</code>
<code>3) </code><code>"michael"</code>
4.3、redis用戶端/服務端指令使用
client端指令
<code>#擷取用戶端名字,預設為空</code>
<code>127.0.0.1:6379> CLIENT GETNAME </code>
<code>#設定用戶端名字</code>
<code>127.0.0.1:6379> CLIENT SETNAME </code><code>'mysql'</code>
<code>127.0.0.1:6379> CLIENT GETNAME</code>
<code>"mysql"</code>
<code>#列出用戶端</code>
<code>127.0.0.1:6379> CLIENT list </code>
<code>id</code><code>=6 addr=127.0.0.1:55374 fd=5 name= age=1619 idle=1619 flags=N db=0 sub=0 psub=0 multi</code>
<code>id</code><code>=7 addr=127.0.0.1:55376 fd=6 name=mysql age=579 idle=0 flags=N db=0 sub=0 psub=0 mul</code>
<code>#暫停用戶端</code>
<code>127.0.0.1:6379> CLIENT PAUSE</code>
<code>#殺死用戶端</code>
<code>127.0.0.1:6379> CLIENT KILL</code>
<code>#用戶端是否響應</code>
<code>127.0.0.1:6379> CLIENT REPLY</code>
server端指令
<code>#擷取服務端詳實資訊,info指令很重要,幾乎可以檢視各種各樣的詳盡的資訊</code>
<code>127.0.0.1:6379> info </code>
<code># Server 服務端資訊</code>
<code>redis_version:3.2.3</code>
<code>redis_git_sha1:00000000</code>
<code>redis_git_dirty:0</code>
<code>redis_build_id:672aed6eb816ad6c</code>
<code>redis_mode:standalone</code>
<code>os:Linux 3.10.0-514.el7.x86_64 x86_64</code>
<code>arch_bits:64</code>
<code>multiplexing_api:epoll</code>
<code>gcc_version:4.8.5</code>
<code>process_id:9087</code>
<code>run_id:4788b467cdf1f8055eca00ef6bbe57b55ef20bde</code>
<code>tcp_port:6379</code>
<code>uptime_in_seconds:12596</code>
<code>uptime_in_days:0</code>
<code>hz:10</code>
<code>lru_clock:6928199</code>
<code>executable:</code><code>/usr/bin/redis-server</code>
<code>config_</code>
<code># Clients 用戶端資訊 </code>
<code>connected_clients:2</code>
<code>client_longest_output_list:0</code>
<code>client_biggest_input_buf:0</code>
<code>blocked_clients:0</code>
<code># Memory 記憶體資訊</code>
<code>used_memory:834424</code>
<code>used_memory_human:814.87K</code>
<code>used_memory_rss:6094848</code>
<code>used_memory_rss_human:5.81M</code>
<code>used_memory_peak:834424</code>
<code>used_memory_peak_human:814.87K</code>
<code>total_system_memory:1023938560 </code><code>#總共記憶體</code>
<code>total_system_memory_human:976.50M</code>
<code>used_memory_lua:37888</code>
<code>used_memory_lua_human:37.00K</code>
<code>maxmemory:0 </code><code>#記憶體無限制</code>
<code>maxmemory_human:0B</code>
<code>maxmemory_policy:noeviction</code>
<code>mem_fragmentation_ratio:7.30</code>
<code>mem_allocator:jemalloc-3.6.0</code>
<code># Persistence 持久化相關資訊 </code>
<code>loading:0</code>
<code>rdb_changes_since_last_save:0</code>
<code>rdb_bgsave_in_progress:0</code>
<code>rdb_last_save_time:1500090506</code>
<code>rdb_last_bgsave_status:ok</code>
<code>rdb_last_bgsave_time_sec:0</code>
<code>rdb_current_bgsave_time_sec:-1</code>
<code>aof_enabled:0</code>
<code>aof_rewrite_in_progress:0</code>
<code>aof_rewrite_scheduled:0</code>
<code>aof_last_rewrite_time_sec:-1</code>
<code>aof_current_rewrite_time_sec:-1</code>
<code>aof_last_bgrewrite_status:ok</code>
<code>aof_last_write_status:ok</code>
<code># Stats 統計資料資訊,很重要 </code>
<code>total_connections_received:6 </code>
<code>total_commands_processed:82</code>
<code>instantaneous_ops_per_sec:0</code>
<code>total_net_input_bytes:3065</code>
<code>total_net_output_bytes:35815120</code>
<code>instantaneous_input_kbps:0.00</code>
<code>instantaneous_output_kbps:0.00</code>
<code>rejected_connections:0</code>
<code>sync_full:0</code>
<code>sync_partial_ok:0</code>
<code>sync_partial_err:0</code>
<code>expired_keys:0</code>
<code>evicted_keys:0</code>
<code>keyspace_hits:42</code>
<code>keyspace_misses:1</code>
<code>pubsub_channels:0</code>
<code>pubsub_patterns:0</code>
<code>latest_fork_usec:852</code>
<code>migrate_cached_sockets:0</code>
<code># Replication #主從複制相關資訊</code>
<code>role:master</code>
<code>connected_slaves:0</code>
<code>master_repl_offset:0</code>
<code>repl_backlog_active:0</code>
<code>repl_backlog_size:1048576</code>
<code>repl_backlog_first_byte_offset:0</code>
<code>repl_backlog_histlen:0</code>
<code># CPU相關 </code>
<code>used_cpu_sys:8.24 核心空間</code>
<code>used_cpu_user:4.10 使用者空間</code>
<code>used_cpu_sys_children:0.01</code>
<code>used_cpu_user_children:0.00</code>
<code># Cluster資訊</code>
<code>cluster_enabled:0</code>
<code># Keyspace </code>
<code>db0:keys=10,expires=0,avg_ttl=0 鍵 過期時長 ttl</code>
<code>127.0.0.1:6379> info memory</code>
<code>#單獨顯示CPU資訊</code>
<code>127.0.0.1:6379> info CPU</code>
<code># CPU</code>
<code>used_cpu_sys:8.56</code>
<code>used_cpu_user:4.16</code>
<code>used_cpu_user_children:0.0</code>
<code>#關機指令</code>
<code>127.0.0.1:6379> SHUTDOWN [NOSAVE|SAVE]</code>
<code>#confi指令 配置伺服器屬性</code>
<code>127.0.0.1:6379> CONFIG SET</code>
<code>127.0.0.1:6379> CONFIG GET </code>
<code>127.0.0.1:6379> CONFIG REWRITE </code>
<code>127.0.0.1:6379> CONFIG RESETSTAT</code>
redis的使用暫且先介紹到這裡,下次我們再介紹redis的應用。
本文轉自 PowerMichael 51CTO部落格,原文連結:http://blog.51cto.com/huwho/1947925,如需轉載請自行聯系原作者