redis常用操作(測試必備)


連接redis

redis的安裝及基礎配置,參考:https://www.cnblogs.com/UncleYong/p/9882843.html

redis中,數據是key-value方式存儲,key永遠都是string類型,value可以是String、List、Set、Sorted-Sets、Hash。

連接redis服務器,默認是第一個數據庫

默認有16個數據庫,索引從0開始

切換到第二個數據庫

切換到第一個數據庫,顯示所有的鍵key

命令不區分大小寫,但key和value區分大小寫

命令可以通過tab補全,補全的命令都是大寫

String

set,設置鍵

get,獲取鍵的值

exists,判斷該鍵是否存在,存在返回1,不存在返回0

append,如果該鍵不存在,則創建,返回當前value的長度;如果該鍵已經存在,則追加,返回追加后value的長度

如果值有空格,需要加引號

strlen,獲取key的長度

可以看到提示,有很多選項

EX和PX表示失效時間,單位為秒和毫秒,兩者不能同時使用;

NX表示數據庫中不存在時才能設置,XX表示存在時才能設置

ttl查看過期剩余時間,如果為-2表示已經過期

下面第二次set不成功

如果是一直不失效的,ttl的值是-1

flushdb,清空數據庫

incr,遞增1

decr,遞減1

del,刪除鍵

刪除后,get不到值,但是可以進行incr和decr操作,是基於默認值為0進行操作

下面字符串不能轉換為整型,所以報錯

下面字符串能轉換為整型

incrby,遞增,可以設置步長 

不加步長報錯

decrby,遞減,可以設置步長 

getset,獲取的同時並設置新的值

setex,設置過期時間

等同於set name jack ex 10

setnx,當key不存在時才能設置,等同於set name jack nx;如果key存在,就不能設置

setrange,設置指定索引位置的字符,索引從0開始

從索引為6的位置開始替換

超過的長度使用0代替

getrange,獲取指定索引位置的字符,索引從0開始 

獲取索引為[1,7]之間的內容,閉區間

setbit/getbit,設置/獲取指定位的BIT值,應用場景:考勤打卡

設置從0開始計算的第七位BIT值為1,返回原有BIT值0

獲取設置的結果,二進制的0000 0001的十六進制值為0x01

設置從0開始計算的第六位BIT值為1,返回原有BIT值0

獲取設置的結果,二進制的0000 0011的十六進制值為0x03

返回了指定Offset的BIT值

如果offset已經超出了value的長度,則返回0 

mset,批量設置key

mget,批量獲取

msetnx,批量設置key,如果key都不存在,執行成功並返回1;如果有一個key存在,執行失敗並返回0。

key5沒設置成功

 

List

是按照插入順序排序的字符串鏈表

lpush
創建鍵test及與其關聯的List,然后將參數中的values從左到右依次插入【看着從左往右放的棧】

可以通過type查看數據類型

lrange

獲取從位置0開始到位置2結束的3個元素

獲取鏈表中的全部元素,其中0表示第一個元素,­1表示最后一個元素

獲取從倒數第3個到倒數第2個的元素

lpushx,表示鍵存在時才能插入

如果鍵不存在,命令將不會進行任何操作,其返回值為0

可以看到test2沒有關聯任何List Value

test鍵此時已經存在,所以該命令插入成功,並返回鏈表中當前元素的數量

獲取該鍵的List中的第一個元素

lpop,取出鏈表頭部的元素,該元素在鏈表中就已經不存在了 

llen,列表長度。在執行lpop命令兩次后,鏈表頭部的兩個元素已經被彈出,此時鏈表中元素的數量是3

lrem,從頭部(left)向尾部(right)操作鏈表,刪除2個值等於a的元素,返回值為實際刪除的數量

查看刪除后鏈表中的全部元素

lindex,根據索引獲取值

獲取索引值為1(頭部的第二個元素)的元素值

lset

將索引值為1(頭部的第二個元素)的元素值設置為新值w

索引值6超過了鏈表中元素的數量,該命令返回nil

設置的索引值6超過了鏈表中元素的數量,設置失敗,該命令返回錯誤信息

ltrim

僅保留索引值0到2之間的3個元素,注意第0個和第2個元素均被保留

linsert

在a的前面插入新元素a0

在e的后面插入新元素e2,從返回結果看已經插入成功

在不存在的元素之前或之后插入新元素,該命令操作失敗,並返回­1

為不存在的Key插入新元素,該命令操作失敗,返回0

rpush

從鏈表的尾部插入參數中給出的values,插入順序是從右到左依次插入【看作是從右到左的棧】

rpushx

鍵已經存在並且包含5個元素,rpushx命令將執行成功,並將元素e插入到鏈表的尾部

rpop

從尾部(right)彈出元素,即取出元素

rpoplpush

創建test2

將test的尾部元素彈出,然后插入到test2的頭部(原子性的完成這兩步操作)

將source和destination設為同一鍵,將test中的尾部元素移到其頭部

 

Set

沒有排序的字符集合,Set集合中不允許出現重復的元素,和List類型相比,Sets之間可以聚合計算操作,如unions並、intersections交和differences差。

sadd

由於該鍵test之前並不存在,因此參數中的三個成員都被正常插入

smembers

查看集合中的元素,從結果可以,輸出的順序和插入順序無關(無序的)

由於參數中的a在test中已經存在,因此本次操作僅僅插入了d和e兩個新成員(不允許重復)

sismember

判斷a是否已經存在,返回值為1表示存在

判斷w是否已經存在,返回值為0表示不存在

scard

獲取集合中元素的數量

srandmember

隨機返回一個成員,成員還在集合中

spop

取出一個成員,成員會從集合中刪除

srem

從Set中移出b、d和w三個成員,其中f並不存在,因此只有b和d兩個成員被移出,返回為2

smove

將a從test移到test2,從結果可以看出移動成功

再次將a從test移到test2,由於此時a已經不是test的成員了,因此移動失敗並返回0

sdiff

獲取多個集合之間的不同成員,要注意匹配的規則
先將test和test2進行比較,a、b和d三個成員是兩者之間的差異成員,然后再用這個結果繼續和
test3進行差異比較,b和d是test3不存在的成員

sdiffstore

將3個集合的差異成員存儲到與diffkey關聯的Set中,並返回插入的成員數量

sinter

獲取多個集合之間的交集,這三個Set的成員交集只有c

sinterstore

將3個集合中的交集成員存儲到與intertest關聯的Set中,並返回交集成員的數量

sunion

獲取多個集合之間的並集

sunionstore

將3個集合中成員的並集存儲到uniontest關聯的set中,並返回並集成員的數量

Sorted-Sets

也稱為Zset,每一個成員都會有一個分數(score)與之關聯,Redis正是通過分數來為集合中的成員進行從小到大的排序(默認)。盡管Sorted­Sets中的成員必須是唯一的,但是分數(score)卻是可以重復的。

zadd

添加一個分數為10的成員

添加兩個分數分別是20和30的兩個成員

zrange

通過索引獲取元素,0表示第一個成員,­1表示最后一個成員。WITHSCORES選項表示返回的結果中包含每個成員及其分數,否則只返回成員

zcard

獲取test鍵中成員的數量

zrank

獲取成員在集合中的索引,索引從0開始

成員ddd並不存在,因此返回nil

zcount

獲取符合指定條件的成員數量,分數滿足表達式10 <= score <= 20的成員的數量

zrem

刪除成員aaa和bbb,返回實際刪除成員的數量

zscore

獲取成員ccc的分數。返回值是字符串形式

由於成員aaa已經被刪除,所以該命令返回nil

zincrby

將成員ccc的分數增加10,並返回該成員更新后的分數

將成員ccc的分數增加­-5,並返回該成員更新后的分數

zrangebyscore

通過分數獲取元素,獲取分數滿足表達式10 <= score <= 20的成員

­inf表示第一個成員,+inf表示最后一個成員,limit后面的參數用於限制返回成員的數量,
limit 2 3,2表示從位置索引(0­-based)等於2的成員開始,取后面3個成員,成員不足就有多少顯示多少,類似於MySQL中的limit

zremrangebyscore

根據分數刪除成員,刪除分數滿足表達式10 <= score <= 20的成員,並返回實際刪除的數量

zremrangebyrank

根據索引刪除成員,刪除索引滿足表達式0 <= rank <= 1的成員 

zrevrange

按索引從高到低的方式獲取成員(獲取top10:zrevrange test 0 9)

由於是從高到低的排序,所以位置等於0的是ddd,1是ccc,並以此類推

zrevrangebyscore

按索引從高到低的方式根據分數獲取成員,分數滿足表達式30 >= score >= 10的成員

limit選項的含義等同於zrangebyscore中的該選項,只是在計算位置時按照相反的順序計算和獲取

zrevrank

獲取成員aaa在集合中的索引,由於是從高到低的排序,所以aaa的位置是3

由於是從高到低的排序,所以ddd的位置是0

Hash

hset

給鍵為test的鍵設置字段為name,值為jack

hget

獲取鍵為test,字段為name的值

test鍵中不存在age字段,因此返回nil

hlen

獲取test鍵的字段數量

hexists

判斷test鍵中是否存在字段名為city的字段,由於存在,返回值為1

hdel

刪除test鍵中字段名為age的字段,刪除成功返回1

再次刪除test鍵中字段名為age的字段,由於上一條命令已經將其刪除,因為沒有刪除,返回0

hsetnx

通過hsetnx命令給test添加新字段age,其值為18,因為該字段已經被刪除,所以該命令添加成功並返回1

由於test的age字段已經通過上一條命令添加成功,因為本條命令不做任何操作后返回0

hincrby

給test的age字段的值加1,返回加后的結果

給test的age字段的值加-­1、-20,返回加后的結果

hmset

為該鍵test,一次性設置多個字段,分別是:name=jack,age=18

hmget

獲取test鍵的多個字段,其中city並不存在,因為在返回結果中與該字段對應的值為nil

hgetall

返回test鍵的所有字段及其值,從結果中可以看出,他們是逐對列出的

hkeys

僅獲取test鍵中所有字段的名字

hvals

僅獲取test鍵中所有字段的值

 

Key操作命令

keys

根據參數中的模式,獲取當前數據庫中符合該模式的所有key,從輸出可以看出,該命令在執行時並不區分與Key關聯的Value類型

del

刪除一個或多個key

刪除了兩個Keys

批量刪除,其余參數:-h redis所在服務器ip

redis-cli -a qzcsbj@qzcsbj -h 192.168.168.168 -p 6379 keys "qzcsbj*" | xargs redis-cli -a qzcsbj@qzcsbj -h 192.168.168.168 -p 6379 del

 

 

exists

如果存在,返回整數類型1,否則返回0

查看剛剛刪除的Key是否還存在,從返回結果看,name確實已經刪除了

查看一下沒有刪除的Key,以和上面的命令結果進行比較

move

將當前數據庫中的testset鍵移入到ID為1的數據庫中

rename

修改鍵的名稱,將name改名為username,然后獲取值只能通過新的鍵

renamenx

當新名稱不存在時才會執行。由於mycity已經存在,因此該命令未能成功執行

ttl

將該鍵的超時設置為1000秒

通過ttl命令查看還剩多少秒

persist

立刻執行persist命令,該存在超時的鍵變成持久化的鍵,即將該Key的超時去掉;-1表示該鍵已經沒有超時了

expire

設置該鍵的超時被1000秒;用ttl命令看當前還剩下多少秒,從結果中可以看出還剩下991秒

重新更新該鍵的超時時間為200秒,從返回值可以看出該命令執行成功;再用ttl確認一下,從結果中可以看出被更新了

立刻更新該鍵的值,以使其超時無效;從ttl的結果可以看出,在上一條修改該鍵的命令執行后,該鍵的超時也無效了

expireat

以 UNIX 時間戳(unix timestamp)格式設置 key 的過期時間

type

添加不同類型的測試數據

分別查看數據的類型

randomkey

返回數據庫中的任意鍵

由於沒有數據了,因此返回nil

flushdb

清空當前打開的數據庫,不影響其它數據庫

dbsize

返回當前數據庫的key的數量

 

事務

Redis事務中如果有某一條命令執行失敗,其后的命令仍然會被繼續執行。

multi,標記事務的開始

exec,執行在一個事務內命令隊列中的所有命令

discard,回滾事務隊列中的所有命令,discard只能在exec前執行

在當前連接上啟動一個新的事務

執行事務中的第一條命令,從該命令的返回結果可以看出,該命令並沒有立即執行,而是存於事務的命令隊列

又執行一個新的命令,從結果可以看出,該命令也被存於事務的命令隊列

執行事務命令隊列中的所有命令,從結果可以看出,隊列中命令的結果得到返回

開啟一個新的事務,設置鍵name的值為string類型的jack

從鍵name所關聯的值的頭部彈出元素,由於該值是字符串類型,而lpop命令僅能用於List類型,因此在執行exec命令時,該命令將會失敗

再次設置鍵name的值為字符串

獲取鍵name的值,以便確認該值是否被事務中的第二個set命令設置成功

從結果中可以看出,事務中的第二條命令lpop執行失敗,而其后的set和get命令均執行成功,這一點是Redis的事務與關系型數據庫中的事務之間最為重要的差別

為鍵city設置一個事務執行前的值;開啟一個事務;在事務內為該鍵設置一個新值;放棄事務;查看鍵city的值,從結果中可以看出該鍵的值仍為事務開始之前的值

discard只能在exec前執行

 

參考:1.https://www.runoob.com/redis/redis-tutorial.html

      2.其它Q群分享的湯小洋筆記.pdf


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM