您好,登錄后才能下訂單哦!
循例介紹一下了,redis是內存數據庫,是簡單的key-value結構,也是nosql數據庫,因為結構簡單,而且用的是內存,所以速度非常之快.至于問有多快?大家知道以前的機械硬盤,單盤速度其實也還好,而內存的讀寫速度是機械硬盤的6萬倍.所以,redis比硬盤有多快,可見一斑了.當然現在都用固態硬盤,情況還是比以前好不少的.這里不再詳細類比,知道是這回事就好.
安裝
================================
好了,當然先說安裝了,安裝redis很簡單,先說明,我們服務器都是linux.
首先要說明一下,內存數據庫并不代表完全不用硬盤空間,因為一般為了數據安全,配置上會備份一定數據到硬盤的,所以還是得準備一定的硬盤空間.
下載地址:
wget?"http://download.redis.io/releases/redis-3.2.0.tar.gz"
是編譯版本,現在都出到3.2了,不過版本差異不大,低版本只是不支持集群或主從而已,實際上功能沒差.
安裝時有依賴包提示就記得yum下,一般就C語言庫相關的,這些大部分在初始化系統就必須裝上的了.
下面來看安裝方法,很簡單:
#解壓編譯包 tar?xzf?redis-3.2.0.tar.gz #進入解壓后的文件夾 cd?redis-3.2.0 #編譯安裝 make make?install #順便說說,如果你想安裝在自定義目錄也是可以的 make?prefix=(你的目錄)?install
當make install命令執行完成后,會在/usr/local/bin目錄下生成幾個可執行文件,它們的作用如下:
redis-server: ? ?Redis服務器的daemon啟動程序
redis-cli: ? ? ? Redis命令行操作工具。也可以用telnet根據其純文本協議來操作
redis-benchmark: Redis性能測試工具,測試Redis在當前系統下的讀寫性能
redis-check-aof: 數據修復
redis-check-dump:檢查導出工具?
安裝完了,就要看配置了,配置文件名可以隨便改,位置也不固定要放什么位置,因為啟動的時候可以指定配置文件啟動.
還記得編譯目錄嗎?里面就有配置文件模板,復制過來就可以用了,當然了,按照你自己的需求改一下還是有必要的,
cd?redis-3.2.0 ll?*.conf -rw-rw-r--?1?root?root?45390?May??6?15:11?redis.conf -rw-rw-r--?1?root?root??7109?May??6?15:11?sentinel.conf
一個是redis的配置文件,一個是哨兵,屬于redis集群應用的配置文件
配置太多,我們先看一些重點:
cat?redis.conf #允許后臺運行 daemonize??yes #設置端口,最好是非默認端口 port?6666 #綁定登錄IP,安全考慮,最好是內網 bind?10.10.2.21 #命名并指定當前redis的PID路徑,用以區分多個redis pidfile?/data/redis/data/config/redis_6666.pid #命名并指定當前redis日志文件路徑 logfile?"/data/redis/data/logs/redis_6666.log" #指定RDB文件名,用以備份數據到硬盤并區分不同redis,當使用內存超過可用內存的45%時觸發快照功能 dbfilename?dump_6666.rdb #指定當前redis的根目錄,用來存放RDB/AOF文件 dir?/data/redis/data #當前redis的認證密鑰,redis運行速度非常快,這個密碼要足夠強大 requirepass?gggggggGGGGGGGGG999999999 #當前redis的最大容量限制,建議設置為可用內存的45%內,最高能設置為系統可用內存的95% #可用config?set?maxmemory?去在線修改,但重啟失效,需要使用config?rewrite命令去刷新配置文件 maxmemory?1024000000 #LRU的策略,有四種,看情況選擇 maxmemory-policy?allkeys-lru #關閉自動持久化操作,默認情況下RDB自動持久化是開啟的,會定時自動壓縮保存redis的全量數據. #由于redis是單線程操作的,這個操作無疑比較耗費資源并阻塞操作,有些只做緩存的環境也不見得數據有多重要. #save?"" #默認情況下AOF持久化方式是關閉的,需要手動開啟,和RDB各有特點,相對RDB沒那么阻塞操作. #appendonly?yes #在開啟AOF之后,需要設置下面兩個參數,避免AOF文件不斷增大,影響后續操作. #auto-aof-rewrite-percentage?100 #auto-aof-rewrite-min-size?64mb
詳細解析如下:
-----------------------------------------------------------------------------------
1 daemonize ?no
默認情況下,redis 不是在后臺運行的,如果需要在后臺運行,把該項的值更改為yes。
2 pidfile ?/var/run/redis.pid
當Redis 在后臺運行的時候,Redis 默認會把pid 文件放在/var/run/redis.pid,你可以配置到其他地址。當運行多個redis 服務時,需要指定不同的pid 文件和端口
3 port
監聽端口,默認為6379
4 #bind 127.0.0.1
指定Redis 只接收來自于該IP 地址的請求,如果不進行設置,那么將處理所有請求,在生產環境中為了安全最好設置該項。默認注釋掉,不開啟
5 timeout 0
設置客戶端連接時的超時時間,單位為秒。當客戶端在這段時間內沒有發出任何指令,那么關閉該連接
6 tcp-keepalive 0
指定TCP連接是否為長連接,"偵探"信號有server端維護。默認為0.表示禁用
7 loglevel notice
log 等級分為4 級,debug,verbose, notice, 和warning。生產環境下一般開啟notice
8 logfile stdout
配置log 文件地址,默認使用標準輸出,即打印在命令行終端的窗口上,修改為日志文件目錄
9 databases 16
設置數據庫的個數,可以使用SELECT 命令來切換數據庫。默認使用的數據庫是0號庫。默認16個庫
10?
save 900 1
save 300 10
save 60 10000
rdb自動持久化參數,保存數據快照的頻率,即將數據持久化到dump.rdb文件中的頻度。用來描述"在多少秒期間至少多少個變更操作"觸發snapshot數據保存動作,
????默認設置,意思是:
????if(在60 秒之內有10000 個keys 發生變化時){
????進行鏡像備份
????}else if(在300 秒之內有10 個keys 發生了變化){
????進行鏡像備份
????}else if(在900 秒之內有1 個keys 發生了變化){
????進行鏡像備份
????}
????如果設置為空,例如:
????save ""
????即關閉rdb自動持久化.
????默認情況下RDB自動持久化是開啟的,會定時自動壓縮保存redis的全量數據,但是由于redis是單線程操作的,這個操作無疑比較耗費資源而阻塞操作,有些只做緩存的環境也不見得數據有多重要,關閉也是可以的.
????注意:手動bgsave命令還是可以使用的,還需要留意dir參數的文件是否存在,如果存在,重啟后會把文件的數據加載進來
11 stop-writes-on-bgsave-error yes
當持久化出現錯誤時,是否依然繼續進行工作,是否終止所有的客戶端write請求。默認設置"yes"表示終止,一旦snapshot數據保存故障,那么此server為只讀服務。如果為"no",那么此次snapshot將失敗,但下一次snapshot不會受到影響,不過如果出現故障,數據只能恢復到"最近一個成功點"
12 rdbcompression yes
在進行數據鏡像備份時,是否啟用rdb文件壓縮手段,默認為yes。壓縮可能需要額外的cpu開支,不過這能夠有效的減小rdb文件的大,有利于存儲/備份/傳輸/數據恢復
13 rdbchecksum yes
讀取和寫入時候,會損失10%性能
14 rdbchecksum yes
是否進行校驗和,是否對rdb文件使用CRC64校驗和,默認為"yes",那么每個rdb文件內容的末尾都會追加CRC校驗和,利于第三方校驗工具檢測文件完整性
14 dbfilename dump.rdb
鏡像快照備份文件的文件名,默認為 dump.rdb,當使用內存超過可用內存的45%時觸發快照功能
15 dir ./
數據庫鏡像備份的文件rdb/AOF文件放置的路徑。這里的路徑跟文件名要分開配置是因為Redis 在進行備份時,先會將當前數據庫的狀態寫入到一個臨時文件中,等備份完成時,再把該臨時文件替換為上面所指定的文件,而這里的臨時文件和上面所配置的備份文件都會放在這個指定的路徑當中
16 # slaveof <masterip> <masterport>
設置該數據庫為其他數據庫的從數據庫,并為其指定master信息。
17 masterauth
當主數據庫連接需要密碼驗證時,在這里指定
18 slave-serve-stale-data yes
當主master服務器掛機或主從復制在進行時,是否依然可以允許客戶訪問可能過期的數據。在"yes"情況下,slave繼續向客戶端提供只讀服務,有可能此時的數據已經過期;在"no"情況下,任何向此server發送的數據請求服務(包括客戶端和此server的slave)都將被告知"error"
19 slave-read-only yes
slave是否為"只讀",強烈建議為"yes"
20 # repl-ping-slave-period 10
slave向指定的master發送ping消息的時間間隔(秒),默認為10
21 # repl-timeout 60
lave與master通訊中,最大空閑時間,默認60秒.超時將導致連接關閉
22 repl-disable-tcp-nodelay no
slave與master的連接,是否禁用TCP nodelay選項。"yes"表示禁用,那么socket通訊中數據將會以packet方式發送(packet大小受到socket buffer限制)。
可以提高socket通訊的效率(tcp交互次數),但是小數據將會被buffer,不會被立即發送,對于接受者可能存在延遲。"no"表示開啟tcp nodelay選項,任何數據都會被立即發送,及時性較好,但是效率較低,建議設為no
23 slave-priority 100
適用Sentinel模塊(unstable,M-S集群管理和監控),需要額外的配置文件支持。slave的權重值,默認100.當master失效后,Sentinel將會從slave列表中找到權重值最低(>0)的slave,并提升為master。如果權重值為0,表示此slave為"觀察者",不參與master選舉
24 # requirepass foobared
設置客戶端連接后進行任何其他指定前需要使用的密碼。警告:因為redis 速度相當快,所以在一臺比較好的服務器下,一個外部的用戶可以在一秒鐘進行150K 次的密碼嘗試,這意味著你需要指定非常非常強大的密碼來防止被破解。
25 # rename-command CONFIG 3ed984507a5dcd722aeade310065ce5d ? ?(方式:MD5('CONFIG^!'))
重命名指令,對于一些與"server"控制有關的指令,可能不希望遠程客戶端(非管理員用戶)鏈接隨意使用,那么就可以把這些指令重命名為"難以閱讀"的其他字符串
26 # maxclients 10000
限制同時連接的客戶數量。當連接數超過這個值時,redis 將不再接收其他連接請求,客戶端嘗試連接時將收到error 信息。默認為10000,要考慮系統文件描述符限制,不宜過大,浪費文件描述符,具體多少根據具體情況而定
27 # maxmemory <bytes>
redis-cache所能使用的最大內存(bytes),默認為0,表示"無限制",最終由OS物理內存大小決定(如果物理內存不足,有可能會使用swap)。此值盡量不要超過機器的物理內存尺寸,從性能和實施的角度考慮,可以為物理內存3/4。此配置需要和"maxmemory-policy"配合使用,當redis中內存數據達到maxmemory時,觸發"清除策略"。在"內存不足"時,任何write操作(比如set,lpush等)都會觸發"清除策略"的執行。在實際環境中,建議redis的所有物理機器的硬件配置保持一致(內存一致),同時確保master/slave中"maxmemory""policy"配置一致。可以使用客戶端命令config set maxmemory 去在線修改值,這個命令是立即生效的,但會在重啟后會失效,需要使用config rewrite命令去刷新配置文件
當內存滿了的時候,如果還接收到set 命令,redis 將先嘗試剔除設置過expire 信息的key,而不管該key 的過期時間還沒有到達。在刪除時,
將按照過期時間進行刪除,最早將要被過期的key 將最先被刪除。如果帶有expire 信息的key 都刪光了,內存還不夠用,那么將返回錯誤。這樣,redis 將不再接收寫請求,只接收get 請求。maxmemory 的設置比較適合于把redis 當作于類似memcached的緩存來使用。
28 # maxmemory-policy volatile-lru
內存不足"時,數據清除策略,默認為"volatile-lru"。
volatile-lru ?->對"過期集合"中的數據采取LRU(近期最少使用)算法.如果對key使用"expire"指令指定了過期時間,那么此key將會被添加到"過期集合"中。將已經過期/LRU的數據優先移除.如果"過期集合"中全部移除仍不能滿足內存需求,將OOM.
allkeys-lru ->對所有的數據,采用LRU算法
volatile-random ->對"過期集合"中的數據采取"隨即選取"算法,并移除選中的K-V,直到"內存足夠"為止. 如果如果"過期集合"中全部移除全部移除仍不能滿足,將OOM
allkeys-random ->對所有的數據,采取"隨機選取"算法,并移除選中的K-V,直到"內存足夠"為止
volatile-ttl ->對"過期集合"中的數據采取TTL算法(最小存活時間),移除即將過期的數據.
noeviction ->不做任何干擾操作,直接返回OOM異常
另外,如果數據的過期不會對"應用系統"帶來異常,且系統中write操作比較密集,建議采取"allkeys-lru"
29 # maxmemory-samples 3
默認值3,上面LRU和最小TTL策略并非嚴謹的策略,而是大約估算的方式,因此可以選擇取樣值以便檢查
29 appendonly no
aof持久化開關,默認情況下,redis 會在后臺異步的把數據庫鏡像備份到磁盤,但是該備份是非常耗時的,而且備份也不能很頻繁。所以redis 提供了另外一種更加高效的數據庫備份及災難恢復方式。開啟append only 模式之后,redis 會把所接收到的每一次寫操作請求都追加到appendonly.aof 文件中,當redis 重新啟動時,會從該文件恢復出之前的狀態。但是這樣會造成appendonly.aof 文件過大,所以redis 還支持了BGREWRITEAOF 指令,對appendonly.aof 進行重新整理。如果不經常進行數據遷移操作,推薦生產環境下的做法為關閉鏡像,開啟appendonly.aof,同時可以選擇在訪問較少的時間每天對appendonly.aof 進行重寫一次。
另外,對master機器,主要負責寫,建議使用AOF,對于slave,主要負責讀,挑選出1-2臺開啟AOF,其余的建議關閉
30 # appendfilename appendonly.aof
aof文件名字,默認為appendonly.aof
31 appendfsync everysec
設置對appendonly.aof 文件進行同步的頻率。always 表示每次有寫操作都進行同步,everysec(默認) 表示對寫操作進行累積,每秒同步一次。no不主動fsync,由OS自己來完成。這個需要根據實際業務場景進行配置
32 no-appendfsync-on-rewrite no
在aof rewrite期間,是否對aof新記錄的append暫緩使用文件同步策略,主要考慮磁盤IO開支和請求阻塞時間。默認為no,表示"不暫緩",新的aof記錄仍然會被立即同步
33 auto-aof-rewrite-percentage 100
當Aof
log增長超過指定比例時,重寫log file, 設置為0表示不自動重寫Aof
日志,重寫是為了使aof體積保持最小,而確保保存最完整的數據。相對于“上一次”rewrite,本次rewrite觸發時aof文件應該增長的百分比。每一次rewrite之后,redis都會記錄下此時“新aof”文件的大小(例如A),那么當aof文件增長到A*(1
+ p)之后 , 觸發下一次rewrite,每一次aof記錄的添加,都會檢測當前aof文件的尺寸。?
34 auto-aof-rewrite-min-size 64mb
觸發aof rewrite的最小文件尺寸,aof文件rewrite觸發的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才會觸發rewrite,默認“64mb”
35 lua-time-limit 5000
lua腳本運行的最大時間
36 slowlog-log-slower-than 10000
"慢操作日志"記錄,單位:微秒(百萬分之一秒,1000 * 1000),如果操作時間超過此值,將會把command信息"記錄"起來.(內存,非文件)。其中"操作時間"不包括網絡IO開支,只包括請求達到server后進行"內存實施"的時間."0"表示記錄全部操作
37 slowlog-max-len 128
"慢操作日志"保留的最大條數,"記錄"將會被隊列化,如果超過了此長度,舊記錄將會被移除。可以通過"SLOWLOG <subcommand> args"查看慢記錄的信息(SLOWLOG get 10,SLOWLOG reset)
38
?hash-max-ziplist-entries 512
hash類型的數據結構在編碼上可以使用ziplist和hashtable。ziplist的特點就是文件存儲(以及內存存儲)所需的空間較小,在內容較小時,性能和hashtable幾乎一樣.因此redis對hash類型默認采取ziplist。如果hash中條目的條目個數或者value長度達到閥值,將會被重構為hashtable。
這個參數指的是ziplist中允許存儲的最大條目個數,,默認為512,建議為128
hash-max-ziplist-value 64
ziplist中允許條目value值最大字節數,默認為64,建議為1024
39?
list-max-ziplist-entries 512
list-max-ziplist-value 64
對于list類型,將會采取ziplist,linkedlist兩種編碼類型。解釋同上。
40 set-max-intset-entries 512
intset中允許保存的最大條目個數,如果達到閥值,intset將會被重構為hashtable
41?
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
zset為有序集合,有2中編碼類型:ziplist,skiplist。因為"排序"將會消耗額外的性能,當zset中數據較多時,將會被重構為skiplist。
42 activerehashing yes
是否開啟頂層數據結構的rehash功能,如果內存允許,請開啟。rehash能夠很大程度上提高K-V存取的效率
43?
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
客戶端buffer控制。在客戶端與server進行的交互中,每個連接都會與一個buffer關聯,此buffer用來隊列化等待被client接受的響應信息。如果client不能及時的消費響應信息,那么buffer將會被不斷積壓而給server帶來內存壓力.如果buffer中積壓的數據達到閥值,將會導致連接被關閉,buffer被移除。
buffer控制類型包括:normal -> 普通連接;slave ->與slave之間的連接;pubsub ->pub/sub類型連接,此類型的連接,往往會產生此種問題;因為pub端會密集的發布消息,但是sub端可能消費不足.
指令格式:client-output-buffer-limit <class> <hard> <soft> <seconds>",其中hard表示buffer最大值,一旦達到閥值將立即關閉連接;
soft表示"容忍值",它和seconds配合,如果buffer值超過soft且持續時間達到了seconds,也將立即關閉連接,如果超過了soft但是在seconds之后,buffer數據小于了soft,連接將會被保留.
其中hard和soft都設置為0,則表示禁用buffer控制.通常hard值大于soft.
44 hz 10
Redis server執行后臺任務的頻率,默認為10,此值越大表示redis對"間歇性task"的執行次數越頻繁(次數/秒)。"間歇性task"包括"過期集合"檢測、關閉"空閑超時"的連接等,此值必須大于0且小于500。此值過小就意味著更多的cpu周期消耗,后臺task被輪詢的次數更頻繁。此值過大意味著"內存敏感"性較差。建議采用默認值。
45?
# include /path/to/local.conf
# include /path/to/other.conf
額外載入配置文件。
#可以通過下面命令去在線修改參數,但重啟失效, config?set?maxmemory?6442450944 #使用下面命令寫進配置文件 config?rewrite
------------------------------------------------------------------------------------
然后來看看啟動
#使用配置文件啟動redis redis-server?/(自定義路徑)/redis.conf #然后測試下能不能用 redis-cli?-p?6379(指定的端口號,可不填,即默認)?-a?"密碼"?[-c?"命令"(可選,非交互式操作)] set?mykey??"hi" ok get?mykey "hi" #關閉redis redis-cli?shutdown #或 kill?pid
注意:在重啟服務器之前,需要在Redis-cli工具上輸入shutdown save命令,意思是強制讓Redis數據庫執行保存操作并關閉Redis服務,這樣做能保證在執行Redis關閉時不丟失任何數據。
操作
?首先來看看命令行終端輸出模式操作介紹:
#在Shell命令行下啟動Redis客戶端工具。 redis-cli?-h?127.0.0.1?-p?6379?-a?'********'?? #清空當前選擇的數據庫,以便于對后面示例的理解。 redis?127.0.0.1:6379>?flushdb OK #添加String類型的模擬數據。 redis?127.0.0.1:6379>?set?mykey?2 OK redis?127.0.0.1:6379>?set?mykey2?"hello" OK #添加Set類型的模擬數據。 redis?127.0.0.1:6379>?sadd?mysetkey?1?2?3 (integer)?3 #添加Hash類型的模擬數據。 redis?127.0.0.1:6379>?hset?mmtest?username?"stephen" (integer)?1 #根據參數中的模式,獲取當前數據庫中符合該模式的所有key,從輸出可以看出,該命令在執行時并不區分與Key關聯的Value類型。 redis?127.0.0.1:6379>?keys?my* 1)?"mysetkey" 2)?"mykey" 3)?"mykey2" #刪除了兩個Keys。 redis?127.0.0.1:6379>?del?mykey?mykey2 (integer)?2 #查看一下剛剛刪除的Key是否還存在,從返回結果看,mykey確實已經刪除了。 redis?127.0.0.1:6379>?exists?mykey (integer)?0 #查看一下沒有刪除的Key,以和上面的命令結果進行比較。 redis?127.0.0.1:6379>?exists?mysetkey (integer)?1 #將當前數據庫中的mysetkey鍵移入到ID為1的數據庫中,從結果可以看出已經移動成功。 redis?127.0.0.1:6379>?move?mysetkey?1 (integer)?1 #打開ID為1的數據庫。 redis?127.0.0.1:6379>?select?1 OK #查看一下剛剛移動過來的Key是否存在,從返回結果看已經存在了。 redis?127.0.0.1:6379[1]>?exists?mysetkey (integer)?1 #在重新打開ID為0的缺省數據庫。 redis?127.0.0.1:6379[1]>?select?0 OK #查看一下剛剛移走的Key是否已經不存在,從返回結果看已經移走。 redis?127.0.0.1:6379>?exists?mysetkey (integer)?0 #準備新的測試數據。???? redis?127.0.0.1:6379>?set?mykey?"hello" OK #將mykey改名為mykey1 redis?127.0.0.1:6379>?rename?mykey?mykey1 OK #由于mykey已經被重新命名,再次獲取將返回nil。 redis?127.0.0.1:6379>?get?mykey (nil) #通過新的鍵名獲取。 redis?127.0.0.1:6379>?get?mykey1 "hello" #由于mykey已經不存在了,所以返回錯誤信息。 redis?127.0.0.1:6379>?rename?mykey?mykey1 (error)?ERR?no?such?key #為renamenx準備測試key redis?127.0.0.1:6379>?set?oldkey?"hello" OK redis?127.0.0.1:6379>?set?newkey?"world" OK #由于newkey已經存在,因此該命令未能成功執行。 redis?127.0.0.1:6379>?renamenx?oldkey?newkey (integer)?0 #查看newkey的值,發現它也沒有被renamenx覆蓋。 redis?127.0.0.1:6379>?get?newkey "world" ???????? 2.?PERSIST/EXPIRE/EXPIREAT/TTL:???? #為后面的示例準備的測試數據。 redis?127.0.0.1:6379>?set?mykey?"hello" OK #將該鍵的超時設置為100秒。 redis?127.0.0.1:6379>?expire?mykey?100 (integer)?1 #通過ttl命令查看一下還剩下多少秒。 redis?127.0.0.1:6379>?ttl?mykey (integer)?97 #立刻執行persist命令,該存在超時的鍵變成持久化的鍵,即將該Key的超時去掉。 redis?127.0.0.1:6379>?persist?mykey (integer)?1 #ttl的返回值告訴我們,該鍵已經沒有超時了。 redis?127.0.0.1:6379>?ttl?mykey (integer)?-1 #為后面的expire命令準備數據。 redis?127.0.0.1:6379>?del?mykey (integer)?1 redis?127.0.0.1:6379>?set?mykey?"hello" OK #設置該鍵的超時被100秒。 redis?127.0.0.1:6379>?expire?mykey?100 (integer)?1 #用ttl命令看一下當前還剩下多少秒,從結果中可以看出還剩下96秒。 redis?127.0.0.1:6379>?ttl?mykey (integer)?96 #重新更新該鍵的超時時間為20秒,從返回值可以看出該命令執行成功。 redis?127.0.0.1:6379>?expire?mykey?20 (integer)?1 #再用ttl確認一下,從結果中可以看出果然被更新了。 redis?127.0.0.1:6379>?ttl?mykey (integer)?17 #立刻更新該鍵的值,以使其超時無效。 redis?127.0.0.1:6379>?set?mykey?"world" OK #從ttl的結果可以看出,在上一條修改該鍵的命令執行后,該鍵的超時也無效了。 redis?127.0.0.1:6379>?ttl?mykey (integer)?-1 3.?TYPE/RANDOMKEY/SORT: #由于mm鍵在數據庫中不存在,因此該命令返回none。 redis?127.0.0.1:6379>?type?mm none #mykey的值是字符串類型,因此返回string。 redis?127.0.0.1:6379>?type?mykey string #準備一個值是set類型的鍵。 redis?127.0.0.1:6379>?sadd?mysetkey?1?2 (integer)?2 #mysetkey的鍵是set,因此返回字符串set。 redis?127.0.0.1:6379>?type?mysetkey set #返回數據庫中的任意鍵。 redis?127.0.0.1:6379>?randomkey "oldkey" #清空當前打開的數據庫。 redis?127.0.0.1:6379>?flushdb OK #由于沒有數據了,因此返回nil。 redis?127.0.0.1:6379>?randomkey (nil) #在線搭建redis從庫,此時將會丟棄舊數據集,轉而開始對新主服務器進行同步 redis?127.0.0.1:6379>?SLAVEOF?10.2.1.21?6379 #不過很多redis是有密碼的,所以要配置一下 CONFIG?SET?MASTERAUTH?123123 #在線關閉從庫配置,原來同步所得的數據集不會被丟棄。 redis?127.0.0.1:6379>?SLAVEOF?NO?ONE #可以通過下面命令去在線修改參數,但重啟失效, config?set?maxmemory?6442450944 #使用下面命令寫進配置文件 config?rewrite
上面這些只是一部分的用法,但是對于一般測試就足夠了?,其他還有list用法和hash用法什么的,有興趣可以更加深入研究.
--------------------------------------------------------
類似于tail和tailf的概念,終端輸出模式就是一直連線,而下面的命令結果輸出模式就是命令執行就出一個結果,不會繼續連線.
下面來看命令結果輸出模式:
redis-cli參數
-h ? ?設置檢測主機IP地址,默認為127.0.0.1
-p ? ?設置檢測主機的端口號,默認為6379 ? ?
-s<socket> ? ?服務器套接字(壓倒主機和端口) ? ?
-a ? ?連接到Master服務器時使用的密碼 ? ?
-r ? ?執行指定的N次命令 ? ?
-i ? ?執行命令后等待N秒,如–i 0.1 info(執行后等0.1秒) ? ?
-n ? ?指定連接N號ID數據庫,如 –n 3(連接3號數據庫) ? ?
-x ? ?從控制臺輸入的信息中讀取最后一個參數 ? ?
-d ? ?定義多個定界符為默認輸出格式(默認: \n) ? ?
--raw ? ?使用原數據格式返回輸出內容 ? ?
--latency ? ?進入一個不斷延時采樣的特殊模式 ? ?
--slave ? ?模擬一個從服務器到主服務器的命令顯示反饋 ? ?
--pipe ? ?使用管道協議模式 ? ?
--bigkeys ? ?監聽顯示數據量大的key值,--bigkeys -i 0.1 ? ??
--help ? ?顯示命令行幫助信息 ? ?
--version ? ?顯示版本號 ? ?
例子:
$?redis-cli進入命令行模式 $?redis-cli?-n?3?set?mykey?"hi"?把mykey插入到第三個數據庫 $?redis-cli?-r?3?info?重復執行info命令三次 下面還有一些比較特別的用法 GETSET:?./redis-cli?getset?nid?987654321? #?表示返回指定key的原始值,并指定一個新值給他? MGET:?./redis-cli?mget?nid?uid?…? #?表示獲取多個key的值? SETNX:?./redis-cli?setnx?nnid?888888? #?表示當一個指定的key不存在時,設置這個key指定的value,如果存在,則設置不成功? SETEX:?./redis-cli?setex?nid?5?666666? #?表示設置一個key指定的value保存5秒后失效,設置key/value的有效期? MSET:?./redis-cli?mset?nid0001?"0001"?nid0002?"0002"?nid0003?"0003" #?表示多鍵值對的數據保存? INCR:?./redis-cli?incr?count? #?表示對給定key的value進行遞增(+1)的操作,當然value必須是一個integer? INCRBY:?./redis-cli?incrby?count?5? #?表示對給定key的value進行指定步長的遞增操作? DECR:?./redis-cli?decr?count? #?表示對給定key的value進行遞減(-1)的操作? DECRBY:?./redis-cli?decrby?count?7? #?表示對給定key的value進行指定步長的遞減操作? APPEND:?./redis-cli?append?content?"bad"???或者??./redis-cli?append?content?"good" #?表示追加一個value到指定的key中,如果key不存在,則新建key? SUBSTR:?./redis-cli?substr?content?0?4? #?表示返回指定key的value的部分字符串 #?列表操作,精華? RPUSH?key?string?—?將某個值加入到一個key列表末尾? LPUSH?key?string?—?將某個值加入到一個key列表頭部? LLEN?key?—?列表長度? LRANGE?key?start?end?—?返回列表中某個范圍的值,相當于mysql里面的分頁查詢那樣? LTRIM?key?start?end?—?只保留列表中某個范圍的值? LINDEX?key?index?—?獲取列表中特定索引號的值,要注意是O(n)復雜度? LSET?key?index?value?—?設置列表中某個位置的值? RPOP?key? #?集合操作? SADD?key?member?—?增加元素? SREM?key?member?—?刪除元素? SCARD?key?—?返回集合大小? SISMEMBER?key?member?—?判斷某個值是否在集合中? SINTER?key1?key2?...?keyN?—?獲取多個集合的交集元素? SMEMBERS?key?—?列出集合的所有元素?? 更新日志檢查?,加--fix參數為修復log文件 redis-check-aof?appendonly.aof 檢查本地數據庫文件 redis-check-dump??dump.rdb
========================================================
壓力測試
redis測試分兩種說法,第一種就是并發壓力,另一種就是容量壓力了,
并發壓力可以用redis自帶的軟件redis-benchmark來測試?,具體如下:
redis-benchmark參數
-h ? ?設置檢測主機IP地址,默認為127.0.0.1 ? ?
-p ? ?設置檢測主機的端口號,默認為6379 ? ?
-s<socket> ? ?服務器套接字(壓倒主機和端口) ? ?
-c ? ?并發連接數 ? ?
-n ? ?請求數 ? ?
-d ? ?測試使用的數據集的大小/字節的值(默認3字節) ? ?
-k ? ?1:表示保持連接(默認值)0:重新連接 ? ?
-r ? ?SET/GET/INCR方法使用隨機數插入數值,設置10則插入值為rand:000000000000 - rand:000000000009 ? ?
-P ? ?默認為1(無管道),當網絡延遲過長時,使用管道方式通信(請求和響應打包發送接收) ? ?
-q ? ?簡約信息模式,只顯示查詢和秒值等基本信息。 ? ?
--csv ? ?以CSV格式輸出信息 ? ?
-l ? ?無線循環插入測試數據,ctrl+c停止 ? ?
-t<tests> ? ?只運行<tests>測試逗號分隔的列表命令,如:-t ping,set,get ? ?
-I ? ?空閑模式。立即打開50個空閑連接和等待。 ??
例子:?
#SET/GET?100?bytes?檢測host為127.0.0.1?端口為6379的redis服務器性能 redis-benchmark?-h?127.0.0.1?-p?6379?-q?-d?100?? #5000個并發連接,100000個請求,檢測host為127.0.0.1?端口為6379的redis服務器性能? redis-benchmark?-h?127.0.0.1?-p?6379?-c?5000?-n?100000? #向redis服務器發送100000個請求,每個請求附帶60個并發客戶端 redis-benchmark?-n?100000?-c?60
結果(部分):
====== SET ======
對集合寫入測試
? 100000 requests completed in 2.38 seconds
100000個請求在2.38秒內完成
? 60 parallel clients
每次請求有60個并發客戶端
? 3 bytes payload
每次寫入3個字節的數據
? keep alive: 1
保持一個連接,一臺服務器來處理這些請求
100.00% <= 62 milliseconds
所有請求在62毫秒內完成
42105.26 requests per second
每秒處理42105.26次請求
還是比較直觀的
-----------------------------------
然后說說容量測試,其實很好理解,內存不是無限的,存放數據自然就是有限,雖然說可以去配置文件去用淘汰機制限制,但是知道容量頂點還是能解決不少問題.
順便也說說,要是你設置的maxmemory 容量不夠,或者整個內存都不夠,而又沒有使用有效的LRU配置,那么你的redis寫滿了之后會提示OOM,就是說內存不夠用,寫不進新數據.
說的就是maxmemory-policy這個設置,具體怎么設置才是合理的,則需要從業務層面去考慮了,例如說丟了一些舊key也沒所謂的,allkeys-lru就是最好了,嚴格來或,你用了這個策略其實也不用測試了,因為他會自動刪舊key,沒什么頂不頂點的概念在..
測試容量的方法很簡單,就是不停的往里面寫數據,然后看他頂點是多少.??
參考腳本如下:
#!/bin/sh keyset="keytest5" valueset='模擬數據,隨便你寫' dbname=5 a=0 for?i?in?`seq?1?300000` do redis-cli?-n?$dbname?'set'?${keyset}${a}?"${valueset}${a}"?>/dev/null #echo?$a let?a++ done
測試結果很簡單,看info的最后一個結果就好了,哪里會有顯示現在有多少個key在.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。