Redis系統管理
實驗簡介
上一節實驗講述了Redis的基本數據類型,本實驗繼續講解Redis相關命令及管理操作。
在Redis中,命令大小寫不敏感。
一、適合全體類型的常用命令
啟動redis服務和redis-cli命令界面繼續后續實驗:
$ sudo service redis-server start
$ redis-cli
(1)EXISTS and DEL
EXISTS key 判斷一個key是否存在;存在返回 1;否則返回0; DEL key 刪除某個key,或是一系列key;DEL key1 key2 key3 key4。成功返回1,失敗返回0(key值不存在)。
> set mykey hello > exists mykey > del mykey > exists mykey
操作截圖:
(2)TYPE and KEYS
TYPE key:返回某個key元素的數據類型 ( none:不存在,string:字符,list,set,zset,hash),key不存在返回空。 KEYS key—pattern :返回匹配的key列表 (KEYS foo*:查找foo開頭的keys)
> set mykey x > type mykey >keys my* > del mykey >keys my* > type mykey
操作截圖:
(3)RANDOMKEY and CLEAR
RANDOMKEY : 隨機獲得一個已經存在的key,如果當前數據庫為空,則返回空字符串
> randomkey
操作截圖:
CLEAR :清除界面。
> clear
(4)RENAME and RENAMENX
RENAME oldname newname:改key的名字,新鍵如果存在將被覆蓋 RENAMENX oldname newname:更改key的名字,如果名字存在則更改失敗
筆者randomkey結果為mylist,將此key值更名為newlist。
> randomkey > rename mylist newlist > exists mylist > exists newlist
操作截圖:
(5) DBSIZE
DBSIZE :返回當前數據庫的key的總數
> dbsize
操作截圖:
二、Redis 時間相關命令
(1)限定key生存時間
這同樣是一個無視數據類型的命令,對於臨時存儲很有用處。避免進行大量的DEL操作。
EXPIRE:設置某個key的過期時間(秒),(EXPIRE bruce 1000:設置bruce這個key1000秒后系統自動刪除)注意:如果在還沒有過期的時候,對值進行了改變,那么那個值會被清除。
> set key some-value > expire key 10 > get key (馬上執行此命令) > get key (10s后執行此命令)
操作截圖:
結果顯示,執行EXPIRE命令后,馬上GET,顯示key存在。10秒后再GET時,key 已經被自動刪除。
(2)查詢key剩余生存時間
限時操作可以再SET命令中實現,並且可用TTL命令查詢key剩余生存時間。 TTL:查找某個key還有多長時間過期,返回時間秒
> set key 100 ex 30 > ttl key > ttl key
操作截圖:
(3)清除key
FLUSHDB:清空當前數據庫中的所有鍵
FLUSHALL:清空所有數據庫中的所有鍵
>flushdb
>flushall
三、Redis設置相關命令
Redis有其配置文件,可以通過client-command窗口查看或者更改相關配置。相關命令介紹如下:
(1)CONFIG GET and CONFIG SET
CONFIG GET:用來讀取運行Redis服務器的配置參數。 CONFIG SET:用於更改運行Redis服務器的配置參數。 AUTH : 認證密碼 下面針對Redis密碼的示例:
> config get requirepass (查看密碼) > config set requirepass test123 (設置密碼為test123 ) > config get requirepass (報錯,沒有認證) > auth test123 > config get requirepass
操作截圖:
由結果可知,剛開始時Reids並未設置密碼,密碼查詢結果為空。然后設置密碼為test123,再次查詢報錯。經過auth命令認證后,可正常查詢。
可以經過修改Redis的配置文件redis.conf修改密碼。
CONFIG GET命令是以list的key-value對顯示的,如查詢數據類型的最大條目:
> config get *max-*-entries*
操作截圖:
(2)重置報告
CONFIG RESETSTAT:重置數據統計報告,通常返回值為'OK"。
> CONFIG RESETSTAT
操作截圖:
四、查詢信息
INFO [section] :查詢Redis相關信息。 INFO命令可以查詢Redis幾乎所有的信息,其命令選項有如下:
- server: Redis server的常規信息
- clients: Client的連接選項
- memory: 存儲占用相關信息
- persistence: RDB and AOF 相關信息
- stats: 常規統計
- replication: Master/slave請求信息
- cpu: CPU 占用信息統計
- cluster: Redis 集群信息
- keyspace: 數據庫信息統計
- all: 返回所有信息
- default: 返回常規設置信息
若命令參數為空,info命令返回所有信息。
> info keyspace > info server
操作截圖:
Redis的高級應用
實驗簡介
前面學習了Redis的基礎知識和基本命令,接下來繼續講解Redis的高級應用,包括:安全性設置,主從復制,事務處理, 持久化機制, 虛擬內存的使用。
一、安全性
設置在客戶端連接是需要指定的密碼(由於redis速度相當的快,一秒鍾可以150K次的密碼嘗試,所以需要設置一個密碼強度很大的密碼)。
設置密碼的方式有兩種:
(1) 使用config set 命令的requirepass 參數,具體格式為config set requirepass “password”。 (2) 配置redis.conf 中設置requirepass屬性,后面為密碼。
輸入認證的方式也有兩種:
(1) 登錄時可以 redis-cli -a password
(2)登錄后使用 auth password
(1)設置密碼
第一種密碼設置方式在上一個實驗中已經提到,(在CONFIG SET命令講解的實例),此處我們來看看第二種方式設置密碼。
首先需要進入Redis的安裝目錄,然后修改配置文件redis.conf。根據grep命令的結果,使用vi編輯器修改“# requirepass foobared” 為“requirepass test123”,然后保存退出。
$ grep -n requirepass /etc/redis/redis.conf
$ sudo vim /etc/redis/redis.conf
編輯redis.conf的結果:
(2)重啟redis-server 與redis-cli
重啟redis server。
$ sudo service redis-server restart
進入到redis-cli交互界面進行驗證
$ redis-cli
> info > auth test123 > info > exit
操作截圖:
結果表明第一次info命令失敗,在auth認證之后info命令正常返回。最后退出redis-cli。
另外一種密碼認證方式:
$ redis-cli -a test123 > info
操作截圖:
二、主從復制
由於環境的原因,在此處筆者大致講解主從復制的工作流程,不做實驗。
Redis的主從復制配置和使用都比較簡單,通過主從復制可以允許多個slave server擁有和master server相同的數據庫副本。
從服務器只能讀,不能寫。
Redis主從復制特點:
1、master可以擁有多個slave。
2、多個slave可以連接同一個master外,還可以連接到其他的slave。(當master宕機后,相連的slave轉變為master)
3、主從復制不會阻塞master,再同步數據時,master可以繼續處理client請求。
4、提高了系統的可伸縮性。
Redis主從復制的過程:
1、Slave與master建立連接,發送sync同步命令。
2、 Master會啟動一個后台進程,將數據庫快照保存到文件中,同時Master主進程會開始收集新的寫命令並緩存。
3、 后台完成保存后,就將此文件發送給Slave。
4、 Slave將此文件保存到磁盤上。
三、事務處理
Redis的事務處理比較簡單。只能保證client發起的事務中的命令可以連續的執行,而且不會插入其他的client命令,當一個client在連接中發出multi命令時,這個連接就進入一個事務的上下文,該連接后續的命令不會執行,而是存放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的所有命令。如果其中執行出現錯誤,執行正確的不會回滾,不同於關系型數據庫的事務。
> multi > set name a > set name b > exec > get name
操作截圖:
四、持久化機制
Redis是一個支持持久化的內存數據庫,Redis需要經常將內存中的數據同步到磁盤來保證持久化。
Redis支持兩種持久化方式:
1、snapshotting(快照),將數據存放到文件里,默認方式。
是將內存中的數據已快照的方式寫入到二進制文件中,默認文件dump.rdb,可以通過配置設置自動做快照持久化的方式。可配置Redis在n秒內如果超過m個key被修改就自動保存快照。
save 900 1 #900秒內如果超過1個key被修改,則發起快照保存
save 300 10 #300秒內如果超過10個key被修改,則快照保存
2、 Append-only file(縮寫為aof),將讀寫操作存放到文件中。
由於快照方式在一定間隔時間做一次,所以如果Redis意外down掉的話,就會丟失最后一次快照后的所有修改。
aof比快照方式有更好的持久化性,是由於使用aof時,redis會將每一個收到的寫命令都通過write函數寫入到文件中當redis啟動時會通過重新執行文件中保存的寫命令來在內存中重新建立整個數據庫的內容。
由於os會在內核中緩存write做的修改,所以可能不是立即寫到磁盤上,這樣aof方式的持久化也還是有可能會丟失一部分數據。可以通過配置文件告訴redis我們想要通過fsync函數強制os寫入到磁盤的時機。
配置文件中的可配置參數:
appendonly yes //啟用aof持久化方式 #appendfsync always //收到寫命令就立即寫入磁盤,最慢,但是保證了數據的完整持久化 appendfsync everysec //每秒中寫入磁盤一次,在性能和持久化方面做了很好的折中 #appendfsync no //完全依賴os,性能最好,持久化沒有保證
在redis-cli的命令中,SAVE命令是將數據寫入磁盤中。
> help save >save
操作截圖:
五、虛擬內存的使用
虛擬內存管理在2.6及之上版本取消了,在安裝實驗中,選擇的是2.8.9版本的redis ,所有實驗中的配置文件中沒有虛擬內存管理功能的配置選項。此處僅為講解
Redis的虛擬內存是暫時把不經常訪問的數據從內存交換到磁盤中,從而騰出內存空間用於其他的訪問數據,尤其對於redis這樣的內存數據庫,內存總是不夠用的。除了分隔到多個redis server外,提高數據庫的容量的方法就是使用虛擬內存,把那些不常訪問的數據交換到磁盤上。
通過配置vm相關的redis.config配置:
vm-enable yes #開啟vm功能 vm-swap-file /tmp/redis.swap #交換出來的value保存的文件路徑 vm-max-memory 10000000 #redis使用的最大內存上線 vm-page-size 32 #每個頁面的大小32字節 vm-pages 123217729 #最多使用多小個頁面 vm-max-threads 4 #用於執行value對象換入的工作線程數量