開啓事務數據庫
MULTI:開啓事務,事務塊中的多條語句會按照順序放入對列當中,最後由EXEC命令來執行緩存
MULTI
INCR counter1 #當實物開啓後執行命令時不會直接返回結果而是先加入到執行隊列中#
INCR counter2
INCR counter3
PING
GET counter1服務器
執行事務塊中的命令
EXEC #執行事務塊中的命令#session
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> INCR counter1 QUEUED 127.0.0.1:6379> INCR counter2 QUEUED 127.0.0.1:6379> INCR counter3 QUEUED 127.0.0.1:6379> PING QUEUED 127.0.0.1:6379> GET counter1 QUEUED 127.0.0.1:6379> EXEC 1) (integer) 1 2) (integer) 1 3) (integer) 1 4) PONG 5) "1"
監視一個或者多個 key測試
WATCH:監視一個或者多個 key,若是在執行事務以前這個 key 若是被其它命令改動,事務就被打斷了。ui
UNWATCH:取消 WATCH 命令對全部 key 的監視this
127.0.0.1:6379> WATCH counter1 counter2 OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> INCR counter1 QUEUED 127.0.0.1:6379> INCR counter2 QUEUED 127.0.0.1:6379> EXEC (nil) 127.0.0.1:6379> GET counter1 "10" 127.0.0.1:6379> GET counter2 "1"
DISCARD:取消事務spa
MULTIcode
SET testMulti 'this is a test'對象
INCR counter4
INCR counter5
DISCARD
KEYS * #這裏返回的仍是以前的值,事務並無執行#
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET testMulti 'this is a test' QUEUED 127.0.0.1:6379> INCR counter4 QUEUED 127.0.0.1:6379> INCR counter5 QUEUED 127.0.0.1:6379> DISCARD OK 127.0.0.1:6379> KEYS * 1) "counter3" 2) "counter2" 3) "counter1"
事務中的錯誤處理
語法錯誤:命令不存在,或者參數錯誤,若是有語法錯誤,Redis 接到 EXEC 後直接返回錯誤,裏面正確的命令也不會被執行
MULTI
SET test hello
SET test1 #在這一步有語法錯誤,將直接報錯,事務終止#
ERRORCOMMAND
運行錯誤,錯誤指在運行命令的時候出現的問題
MULTI
SET test2 1
SADD test2 2 #這裏有運行錯誤,可是事務沒有執行的時候看不出來,因此不會對事務的執行有影響#
SET test2 3
EXEC #事務執行後獲得的執行結果會略過有錯誤的地方,正確的命令依然所有執行了#
127.0.0.1:6379> SET test hello QUEUED 127.0.0.1:6379> SET test1 (error) ERR wrong number of arguments for 'set' command 127.0.0.1:6379> EXEC (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> KEYS * 1) "counter3" 2) "counter2" 3) "counter1" 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET test2 1 QUEUED 127.0.0.1:6379> SADD test2 2 QUEUED 127.0.0.1:6379> SET test2 3 QUEUED 127.0.0.1:6379> EXEC 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) OK
鏈接相關
PING:測試和服務器之間是否鏈接有效,若是服務器運行正常的話會獲得PONG
ECHO:打印一個特定信息
QUIT:請求服務器關閉與當前客戶端的鏈接,EXIT
SHUTDOWN:關閉服務器和客戶端
AUTH:指定Redis的身份驗證,Redis配置文件中requirepass選項的值
CONFIG SET requirepass password
登錄進來以後經過AUTH命令進行驗證
鏈接的時候-a pwd
SELECT:選擇數據庫
#這裏就只拿 ECHO 和 CONFIG 來舉例說明了,其餘幾條命令都是以前用過不少次了#
127.0.0.1:6379> ECHO 'this is a test' "this is a test" 127.0.0.1:6379> CONFIG SET requirepass tom OK 127.0.0.1:6379> KEYS * (error) NOAUTH Authentication required. 127.0.0.1:6379> AUTH tom OK 127.0.0.1:6379> KEYS * 1) "test2" 2) "counter1" 3) "counter3" 4) "counter2"
生存時間
EXPIRE/EXPIREAT #過時的秒數/時間戳#
PEXPIRE/PEXPIREAT #過時的毫秒數#
PERSIST #持久化#
TTL #獲得生存時間#
PTTL #獲得毫秒的生存時間#
SET session:test1 uid1
EXPIRE session:test1 900
TTL session:test1
SET session:test2 uid2
EXPIRE session:test2 30
SET key hello
EXPIRE key 100
TTL key
SET key world #使用SET GETSET也會清楚過時時間#
TTL key
127.0.0.1:6379> SET session:test1 uid1 OK 127.0.0.1:6379> EXPIRE session:test1 900 (integer) 1 127.0.0.1:6379> TTL session:test1 (integer) 887 127.0.0.1:6379> SET session:test2 uid2 OK 127.0.0.1:6379> EXPIRE session:test2 30 (integer) 1 127.0.0.1:6379> TTL session:tes2 (integer) -2 127.0.0.1:6379> PERSIST session:test1 (integer) 1 127.0.0.1:6379> TTL session:test1 (integer) -1 127.0.0.1:6379> SET key hello OK 127.0.0.1:6379> EXPIRE key 100 (integer) 1 127.0.0.1:6379> TTL key (integer) 98 127.0.0.1:6379> SET key world OK 127.0.0.1:6379> TTL key (integer) -1
SORT:排序相關
按照鍵值從小到大或者從大到小的順序排序
SORT key
SORT key DESC
對數值進行排序
LPUSH testSort1 12 33 -13 45 90
SORT testSort1 #升序#
SORT testSort1 DESC #降序#
127.0.0.1:6379> SORT testSort1 1) "-13" 2) "12" 3) "33" 4) "45" 5) "90" 127.0.0.1:6379> SORT testSort1 DESC 1) "90" 2) "45" 3) "33" 4) "12" 5) "-13"
對字母進行排序
LPUSH testSort2 a b c test1 test2 tom jerry lucy
SORT testSort2 ALPHA
SORT testSort2 ALPHA DESC
127.0.0.1:6379> LPUSH testSort2 a b c test1 test2 tom jerry lucy (integer) 8 127.0.0.1:6379> SORT testSort2 ALPHA 1) "a" 2) "b" 3) "c" 4) "jerry" 5) "lucy" 6) "test1" 7) "test2" 8) "tom" 127.0.0.1:6379> SORT testSort2 ALPHA DESC 1) "tom" 2) "test2" 3) "test1" 4) "lucy" 5) "jerry" 6) "c" 7) "b" 8) "a"
使用 LIMIT 限制返回結果
LPUSH testSort3 a b c d e f g h i j k l m n 1 2 3 4 6 8 900 23
SORT testSort3 ALPHA LIMIT 0 5 #起點0 偏移量5#
SORT testSort3 ALPHA LIMIT 0 5 DESC
127.0.0.1:6379> LPUSH testSort3 a b c d e f g h i j k l m n 1 2 3 4 6 8 900 23 (integer) 22 127.0.0.1:6379> SORT testSort3 ALPHA LIMIT 0 5 1) "1" 2) "2" 3) "23" 4) "3" 5) "4" 127.0.0.1:6379> SORT testSort3 ALPHA LIMIT 0 5 DESC 1) "n" 2) "m" 3) "l" 4) "k" 5) "j"
根據外部 key 的權重進行排序
LPUSH uid 1
SET user_name_1 admin
SET user_level_1 9999
LPUSH uid 2
SET user_name_2 tom
SET user_level_2 800
LPUSH uid 3
SET user_name_3 jerry
SET user_level_3 600
LPUSH uid 4
SET user_name_4 jack
SET user_level_4 300
LPUSH uid 5
SET user_name_5 mario
SET user_level_5 860
SORT uid
SORT uid BY user_level_* #根據用戶等級對用戶 uid 進行排序#
127.0.0.1:6379> LPUSH uid 1 (integer) 1 127.0.0.1:6379> SET user_name_1 admin OK 127.0.0.1:6379> SET user_level_1 9999 OK 127.0.0.1:6379> LPUSH uid 2 (integer) 2 127.0.0.1:6379> SET user_name_2 tom OK 127.0.0.1:6379> SET user_level_2 800 OK 127.0.0.1:6379> LPUSH uid 3 (integer) 3 127.0.0.1:6379> SET user_name_3 jerry OK 127.0.0.1:6379> SET user_level_3 600 OK 127.0.0.1:6379> LPUSH uid 4 (integer) 4 127.0.0.1:6379> SET user_name_4 jack OK 127.0.0.1:6379> SET user_level_4 300 OK 127.0.0.1:6379> LPUSH uid 5 (integer) 5 127.0.0.1:6379> SET user_name_5 mario OK 127.0.0.1:6379> SET user_level_5 860 OK 127.0.0.1:6379> SORT uid 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> SORT uid BY user_level_* 1) "4" 2) "3" 3) "2" 4) "5" 5) "1"
根據排序結果取出相應鍵值
SORT uid GET user_name_*
SORT uid BY user_level_* GET user_name_* #根據用戶等級對 uid 進行排序,輸出 uid 對應的名稱 user_name #
SORT uid GET user_name_* GET user_level_* #對 uid 進行排序,輸出 uid 對應的名稱 user_name 和 等級 user_level #
SORT uid GET # GET user_level_* GET user_name_* #這裏 '#' 井號表明獲得鍵的編號#
SORT uid BY user_level_* GET # GET user_level_* GET user_name_* #根據用戶等級對 uid 進行排序,輸出 uid 對應的 uid,名稱 user_name 和 等級 user_level #
SORT uid BY noExists #對一個不存在的字段進行排序,系統將自動忽略這個條件,跟沒寫同樣#
SORT uid BY noExists GET # GET user_level_* GET user_name_*
127.0.0.1:6379> SORT uid GET user_name_* 1) "admin" 2) "tom" 3) "jerry" 4) "jack" 5) "mario" 127.0.0.1:6379> SORT uid BY user_level_* GET user_name_* 1) "jack" 2) "jerry" 3) "tom" 4) "mario" 5) "admin" 127.0.0.1:6379> SORT uid GET user_name_* GET user_level_* 1) "admin" 2) "9999" 3) "tom" 4) "800" 5) "jerry" 6) "600" 7) "jack" 8) "300" 9) "mario" 10) "860" 127.0.0.1:6379> SORT uid GET # GET user_level_* GET user_name_* 1) "1" 2) "9999" 3) "admin" 4) "2" 5) "800" 6) "tom" 7) "3" 8) "600" 9) "jerry" 10) "4" 11) "300" 12) "jack" 13) "5" 14) "860" 15) "mario" 127.0.0.1:6379> SORT uid BY user_level_* GET # GET user_level_* GET user_name_* 1) "4" 2) "300" 3) "jack" 4) "3" 5) "600" 6) "jerry" 7) "2" 8) "800" 9) "tom" 10) "5" 11) "860" 12) "mario" 13) "1" 14) "9999" 15) "admin" 127.0.0.1:6379> SORT uid BY noExists 1) "5" 2) "4" 3) "3" 4) "2" 5) "1" 127.0.0.1:6379> SORT uid BY noExists GET # GET user_level_* GET user_name_* 1) "5" 2) "860" 3) "mario" 4) "4" 5) "300" 6) "jack" 7) "3" 8) "600" 9) "jerry" 10) "2" 11) "800" 12) "tom" 13) "1" 14) "9999" 15) "admin"
HMSET user_info_1 username admin level 1000
HMSET user_info_2 username tom level 999
HMSET user_info_3 username jerry level 77
HMSET user_info_4 username mario level 90
#當 SORT 對一個 HASH 類型的對象進行排序時,能夠經過 表名 -> 字段名的方式來指定排序方式#
SORT uid BY user_info_*->level #根據 user_info_ 系列的表中的 level 字段進行排序#
SORT uid GET user_info_*->username #排序結果返回 username #
SORT uid BY user_info_*->level GET # GET user_info_*->username #根據 user_info_ 系列的表中的 level 字段進行排序,返回 uid 和 username #
127.0.0.1:6379> HMSET user_info_1 username admin level 1000 OK 127.0.0.1:6379> HMSET user_info_2 username tom level 999 OK 127.0.0.1:6379> HMSET user_info_3 username jerry level 77 OK 127.0.0.1:6379> HMSET user_info_4 username mario level 90 OK 127.0.0.1:6379> SORT uid BY user_info_*->level 1) "5" 2) "3" 3) "4" 4) "2" 5) "1" 127.0.0.1:6379> SORT uid GET user_info_*->username 1) "admin" 2) "tom" 3) "jerry" 4) "mario" 5) (nil) 127.0.0.1:6379> SORT uid BY user_info_*->level GET # GET user_info_*->username 1) "5" 2) (nil) 3) "3" 4) "jerry" 5) "4" 6) "mario" 7) "2" 8) "tom" 9) "1" 10) "admin"
將排序結果保存起來
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern]] [ASC|DESC|ALPHA] [STORE destination]
BY pattern:一個參數,根據誰來排序
LIMIT offset count:兩個參數,限制顯示條數,offset 是偏移量,count 是條數
GET pattern:一個參數,返回結果中獲得的值,能夠寫多個,好比 username level 等等
ASC|DESC|ALPHA:ASC爲升序(默認值),DESC爲降序,ALPHA以字母排序
STORE destination:把結果保存在一個新的結果集中,指定的結果集名稱
RPUSH testSort4 1 2 5 8 9 20
RPUSH testSort4 43 56 90 120
SORT testSort4 DESC STORE sortRes4
127.0.0.1:6379> RPUSH testSort4 1 2 5 8 9 20 (integer) 6 127.0.0.1:6379> RPUSH testSort4 43 56 90 120 (integer) 10 127.0.0.1:6379> LRANGE testSort4 0 -1 1) "1" 2) "2" 3) "5" 4) "8" 5) "9" 6) "20" 7) "43" 8) "56" 9) "90" 10) "120" 127.0.0.1:6379> SORT testSort4 1) "1" 2) "2" 3) "5" 4) "8" 5) "9" 6) "20" 7) "43" 8) "56" 9) "90" 10) "120" 127.0.0.1:6379> SORT testSort4 DESC STORE sortRes4 (integer) 10 127.0.0.1:6379> LRANGE sortRes4 0 -1 1) "120" 2) "90" 3) "56" 4) "43" 5) "20" 6) "9" 7) "8" 8) "5" 9) "2" 10) "1"
注意:
SORT 命令的時間複雜度 O (n+mlogm),n 表示要排序的列表或者集合中的元素的個數,m 表示要返回元素的個數
儘量減小待排序中鍵的數量 (使 n 儘量的小)
使用 LIMIT 參數限制獲取元素的個數 (使 m 儘量小)
若是要排序的數據量比較大,儘量經過 STORE 緩存結果