1、通用命令:
1.1】、語法:keys pattern,pattern可以是類似正則的匹配規則,可以是*,也可以是?,返回匹配規則的鍵值key的列表。
192.168.127.128:6379>keys * 1)"name" 2)"set2" 3)"set1" 192.168.127.128:6379>keys n* 1)"name" 192.168.127.128:6379>keys s* 1)"set2" 2)"set1" 192.168.127.128:6379>keys set? 1)"set2" 2)"set1" 192.168.127.128:6379>keys n?me 1)"name"
1.2】、語法:exists key [key ...],判斷一個或者多個key是否存在,並返回存在key的個數,不存在返回0。
192.168.127.128:6379>keys * 1)"name" 2)"age" 192.168.127.128:6379>exists name age address(該值存在) (integer)2 192.168.127.128:6379>exists name1 age1 address(該值存在) (integer)0
1.3】、語法:expire key seconds,給指定的key設置過期時間,單位是秒。用ttl命令可以查看剩餘的時間,如果想更精確的、性能更好的倒計時功能,可以使用該功能。設置過期時間成功返回值爲1,此命令可以多次執行,後面的過期值會覆蓋前面的過期值。過期的數據會從Redis數據庫裏刪除。
192.168.127.128:6379>expire name 60 設置name過期時間爲60秒 (integer)1 192.168.127.128:6379>expire name 50 設置name過期時間爲50秒 (integer)1 192.168.127.128:6379>ttl name (integer)48 192.168.127.128:6379>ttl name (integer)45 ttl返回值: -1、過期時間不存在 -2、過期操作成功,數據已經移除
1.4】、語法:persist key,取消已經設置了過期時間的key的過期策略。取消過期策略成功返回1,key沒有過期策略返回0。
192.168.127.128:6379>keys * 1)"name" 2)"age" 192.168.127.128:6379>expire name 60 設置name過期時間爲60秒 (integer)1 192.168.127.128:6379>persist name (integer)1 //成功取消設置的過期策略 192.168.127.128:6379>persist name (integer)0 //上一步已經取消了,在此執行取消操作返回0。
1.5】、語法:select index,在Redis中,邏輯劃分爲16個數據庫,索引從0-15,我們在使用的過程中,可以針對不同的業務邏輯把數據緩存在不同的數據庫,這是一個很好的架構設計,切記不要把所有的數據放在0號數據庫裏,不便於管理和分類。這16個數據庫數據是分離的,不是共享的,或者說數據都是獨立的。
192.168.127.128:6379>select 1 OK 192.168.127.128:6379[1]> 192.168.127.128:6379[1]>select 5 OK 192.168.127.128:6379[5]>
1.6】、語法:move key db,至指定名稱爲key的鍵值對轉移到指定數據庫db裏面,db是數據下標索引。
//索引爲0的數據庫 192.168.127.128:6379>keys * 1)"name" 2)"age" //索引爲5的數據庫 192.168.127.128:6379[5]>keys * (empty list or set) //在索引爲5的數據庫裏面增加sex鍵值對,然後把其移動到索引爲0的數據庫 192.168.127.128:6379[5]>set sex nan OK 192.168.127.128:6379[5]>keys * 1)"sex" 192.168.127.128:6379[5]>move sex 0 (integer)1 //索引爲0的數據庫 192.168.127.128:6379>keys * 1)"name" 2)"sex" //從索引爲5的數據已經移動到了索引爲0的數據庫 2)"age"
1.7】、語法:randomkey,隨機返回當前數據庫中的key,其實這個功能我們可以使用在抽獎的場景,如果在併發比較高,而且有要保證性能的情況下,我建議大家使用Redis的這個功能來完成抽獎的功能。有時候會返回重複的值,如果做抽獎需要做處理一下。
192.168.127.128:6379>keys * 1)"name" 2)"sex" 2)"age" 192.168.127.128:6379>randomkey "name" 192.168.127.128:6379>randomkey "age" 192.168.127.128:6379>randomkey "age"
1.8】、語法:rename key newkey,重新給指定的key命名。
192.168.127.128:6379>keys * 1)"name" 2)"sex" 2)"age" 192.168.127.128:6379>rename name name1 OK 192.168.127.128:6379>keys * 1)"name1" 2)"sex" 2)"age" 192.168.127.128:6379>rename name1 name OK
1.9】、語法:echo message,在當前介質上打印message信息。
192.168.127.128:6379>echo patrickLiu "patrickLiu"
1.10】、語法:dbsize,返回當前數據中鍵值對的個數,或者更準確的說是key的個數。
192.168.127.128:6379>keys * 1)"name" 2)"sex" 2)"age" 192.168.127.128:6379>dbsize 3
1.11】、語法:info [section],可以獲取當前數據的詳細信息。
192.168.127.128:6379>info //顯示當前數據的所有數據 192.168.127.128:6379>info replication //顯示指定節的信息 # Replication role:master connected_slaves:0 ...
1.12】、語法:config get *,獲取配置文件中的所有的配置數據。
192.168.127.128:6379>config get * ... 192.168.127.128:6379>config get bind 1)"bind" 2)"192.168.127.128" 192.168.127.128:6379>config get port 1)"port" 2)"6379"
1.13】、語法:flushdb,清空當前數據所有的鍵值對。
192.168.127.128:6379>flushdb OK 192.168.127.128:6379>keys * (empty list or set)
1.14】、語法:flushall,清空所有數據庫的所有鍵值對。
192.168.127.128:6379>flushall OK 192.168.127.128:6379[1]>keys * (empty list or set) ... 192.168.127.128:6379[5]>keys * (empty list or set) ...
2、安全設置
2.1】、vi 或者 vim 編輯 redis.conf 文檔,修改
#requirepass 123456 (設置密碼)
requirepass admin
2.2】、重啓服務器 pkill redis-server
[root@linux~]# application/program/redis-tool/redis-cli -h 192.168.127.128 -p 6379 192.168.127.128:6379>keys * (error)NOAUTH Authentication required. 192.168.127.128:6379>auth admin //授權 OK 192.168.127.128:6379>keys * //可以執行 (empty list or set)
2.3】、[root@linux~]/root/application/program/redis-tool/redis-cli -h 192.168.127.128 -p 6379 -a admin
3、事務模型
redis也是支持事務的,但是這個事務是比較簡單的,之所以說簡單,是因爲redis的事務不能保證操作的同時成功或者同時失敗而進行提交或者回滾,這種情形很容易導致數據的不一致性,大家使用的時候要特別注意。
3.1】、首先通過multi命令開啓事務,然後進行事務性的設置,這些設置完的數據會存儲在虛擬隊列中,最後可以通過exec命令執行事務。
//當前數據庫中無值 192.168.127.128:6379>keys * (empty list or set) 192.168.127.128:6379>multi OK 192.168.127.128:6379>set p1 1 QUEUED 192.168.127.128:6379>set p2 2 QUEUED 192.168.127.128:6379>set p3 3 QUEUED 192.168.127.128:6379>exec 1)OK 2)OK 3)OK 192.168.127.128:6379>keys * 1)"p3" 2)"p2" 3)"p1"
3.2】、redis的事務可以通過discard命令取消事務。
//當前數據庫中的值 192.168.127.128:6379>keys * 1)"p3" 2)"p2" 3)"p1" 192.168.127.128:6379>multi OK 192.168.127.128:6379>set p4 4 QUEUED 192.168.127.128:6379>set p5 5 QUEUED 192.168.127.128:6379>discard //取消事務 OK //值沒變 192.168.127.128:6379>keys * 1)"p3" 2)"p2" 3)"p1"
3.3】、特別注意redis事務的不一致性。
//當前數據庫中的值 192.168.127.128:6379>keys * 1)"age" 2)"name" 192.168.127.128:6379>get name "huangfeihong" 192.168.127.128:6379>get age (integer)18 192.168.127.128:6379>multi OK 192.168.127.128:6379>incr name QUEUED 192.168.127.128:6379>incr age QUEUED 192.168.127.128:6379>exec 1)(error)ERR value is not an integer or out of range 2)(integer)19 192.168.127.128:6379>get name "huangfeihong" //姓名沒有改變 192.168.127.128:6379>get age (integer)19 //當前年齡已經修改
再次強調,在真正的產品環境中,要特別注意Redis事務的這個特點,或者說是弊端,不能保證數據的一致性。
4、持久化
Redis是一種高級key-value數據庫。它跟memcached類似,不過數據可以持久化。Redis的所有數據都是保存在內存中,然後不定期的通過異步方式保存到磁盤上(這稱爲“半持久化模式”);也可以把每一次數據變化都寫入到一個append only file(aof)裏面(這稱爲“全持久化模式”)。所以來說,總結起來,Redis的數據持久化就有兩種方式。
4.1】、第一種方法filesnapshotting(rdb):默認redis是會以快照的形式將數據持久化到磁盤的(一個二進制文件,dump.rdb,這個文件名字可以指定),在配置文件中的格式是:save N(秒數) M(改變的個數),表示在N秒之內,redis至少發生M次修改,redis才生成快照並持久化到磁盤。當然我們也可以手動執行save或者bgsave(異步)做快照。該模式無論怎麼設置,都會產生時間間隔,如果在這時間間隔斷電,數據還是會丟失,會對數據持久化產生不利的影響,在實際的生產環境中,不建議使用該模式。
save 900 1 900秒內有超過1個的key值被修改了就發起快照保存
save 300 30 300秒內有超過30個的key值被修改了就發起快照保存
save 60 10000 60秒內有超過10000個的key值被修改了就發起快照保存
4.2】、第二種方法是Append-only-file(aof):Append-only方法可以做到全部數據不丟失,但redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中開啓,默認是不打開AOF功能的(appendonly no),appendonly yes開啓AOF之後,redis每執行一個修改數據的命令,都會把它添加到aof文件中,當redis重啓時,將會讀取AOF文件進行“重放”以恢復到redis關閉前的最後時刻。
appendfsync有三個選項:always、everysec和no:
1、always:服務器會在每執行一個事件就把AOF緩衝區的內容強制性的寫入硬盤上的AOF文件裏,可以看成你每執行一個redis寫入命令就往AOF文件裏記錄這條命令,這保證了數據持久化的完整性,但效率是最慢的,卻也是最安全的;
2、everysec:服務端每執行一次寫操作也會把該條命令追加到一個單獨的AOF緩衝區的末尾,並將AOF緩衝區寫入AOF文件,然後每隔一秒纔會進行一次文件同步把內存緩衝區裏的AOF緩存數據真正寫入AOF文件裏,這個模式兼顧了效率的同時也保證了數據的完整性,即使在服務器宕機也只會丟失一秒內對redis數據庫做的修改;
3、no:你完全可以接受Redis數據的丟失,它雖然也會把每條寫命令追加到AOF緩衝區的末尾,然後寫入文件,但什麼時候進行文件同步真正把數據寫入AOF文件裏則由系統自身決定,即當內存緩衝區的空間被填滿或者是超過了設定的時限後系統自動同步。這種模式下效率是最快的,但對數據來說也是最不安全的,如果redis裏的數據都是從後臺數據庫如mysql中取出來的,屬於隨時可以找回或者不重要的數據,那麼可以考慮設置成這種模式。
[root@linux~]# more application/program/redis-tool/redis.conf
dir "/root/application/program/redis-tool/datas/" #AOF或者RDB文件存放目錄
appendonly yes #啓用AOF持久化,默認關閉,RDB模式就關閉了,兩者是二選一的情況
appendfilename "appendonly.aof" #AOF持久化的文件名稱(默認)
appendfsync no #AOF持久化的策略
auto-aof-rewrite-percentage 100 #觸發AOF文件重寫的條件(默認)
auto-aof-rewrite-min-size 64mb #觸發AOF文件重寫的條件(默認)
5、發佈訂閱
Redis的這個發佈訂閱功能有點類似MQ(消息隊列)功能,但是這功能不能濫用,它的使用場景非常有限,並且數據量也不能太大。比如:成千上萬條的數據場景是可以滿足的,如果訂閱和發佈的數據量超過N萬、十萬、千萬或者億級別,這樣的場景就很難滿足了,到那時候我們就需要使用真正的MQ來滿足該功能了。
5.1】、語法:subscribe channel [channel ...],進行訂閱監聽,可以接受來之發佈端的消息了。可以定義多個頻道,這個頻道的名稱是自己可以定義的。
192.168.127.128:6379>subscribe c1 c2 Reading messages...(press Ctrl-C quit) 1)"subscribe" 2)"c1" 3)(integer)1 1)"subscribe" 2)"c2" 3)(integer)2 //接受的到的消息 1)"message" 2)"c2" 3)"redis" 1)"message" 2)"c1" 3)"hello" //處於等待狀態,可以接收消息了
5.2】、語法:publish channel message,針對指定的消息頻道發佈消息,訂閱端就可以接受到消息了。
192.168.127.128:6379>publish c1 hello (integer)1 //發佈消息成功 192.168.127.128:6379>publish c2 redis (integer)1 //發佈消息成功