redis的安裝及基礎配置,參考:http://www.javashuo.com/article/p-ayflllaf-bb.html
html
redis中,數據是key-value方式存儲,key永遠都是string類型,value能夠是String、List、Set、Sorted-Sets、Hash。redis
鏈接redis服務器,默認是第一個數據庫數據庫
默認有16個數據庫,索引從0開始服務器
切換到第二個數據庫app
切換到第一個數據庫,顯示全部的鍵keydom
命令不區分大小寫,但key和value區分大小寫測試
命令能夠經過tab補全,補全的命令都是大寫unix
set,設置鍵htm
get,獲取鍵的值blog
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沒設置成功
是按照插入順序排序的字符串鏈表
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集合中不容許出現重複的元素,和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中,並返回並集成員的數量
也稱爲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
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字段的值加-一、-20,返回加後的結果
hmset
爲該鍵test,一次性設置多個字段,分別是:name=jack,age=18
hmget
獲取test鍵的多個字段,其中city並不存在,由於在返回結果中與該字段對應的值爲nil
hgetall
返回test鍵的全部字段及其值,從結果中能夠看出,他們是逐對列出的
hkeys
僅獲取test鍵中全部字段的名字
hvals
僅獲取test鍵中全部字段的值
keys
根據參數中的模式,獲取當前數據庫中符合該模式的全部key,從輸出能夠看出,該命令在執行時並不區分與Key關聯的Value類型
del
刪除一個或多個key
刪除了兩個Keys
批量刪除,其他參數:-h redis所在服務器ip
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