連接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正是通過分數來為集合中的成員進行從小到大的排序(默認)。盡管SortedSets中的成員必須是唯一的,但是分數(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