Redis 的數據類型 - MULTI 事務,SORT 排序

開啓事務數據庫

  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 緩存結果

相關文章
相關標籤/搜索