redis學習總結
1、docker中連接redis
docker exec -it redis redis-cli
// 注:使用redis鏡像執行redis-cli命令連接到剛啓動的容器,主機IP爲172.17.0.1
// 如果是遠程連接使用下面語句:
docker exec -it redis_s redis-cli -h 192.168.1.100 -p 6379 -a your_password //如果有密碼 使用 -a參數
2、不使用docker連接redis
// 連接遠程
redis-cli -h 47.101.63.222 -p 56379
// 連接本地
redis-cli
// 參考連接:https://blog.csdn.net/wcuuchina/article/details/86610045
3、redis命令總結(參考《Redis入門指南》(第二版))
1、獲得符合規則的鍵名列表
keys pattern
(keys * 獲取所有鍵)
2、判斷一個鍵是否存在
exists key
// 如果鍵存在則返回整數類型1,否則返回0。
3、刪除鍵
del key [key ...]
// 可以刪除一個或多個鍵,返回值是刪除的鍵的個數。
4、獲取鍵值的數據類型
type key
5、清空數據庫
flushdb
6、過期時間
expire
// 秒爲單位、如果要做緩存,一定要設置一個過期時間
7、查看剩餘存活時間
ttl
// 以秒爲單位
4、redis的基本類型
1、字符串類型
1、介紹
一個字符串類型鍵允許存儲的數據最大容量爲512MB,字符串類型是其他4種數據類型的基礎,其他數據類型和字符串類型的差別從某種角度來說只是組織字符串的形式不同。例如,列表類型是以列表的形式組織字符串,而集合類型是以集合的形式組織字符串。
2、命令
1、賦值與取值
set key value
get key
2、遞增數字
INCR key
// 其作用是讓當前鍵值遞增,並返回遞增後的值
// 當要操作的鍵不存在時會默認鍵值爲0,所以第一次遞增後的結果是1。當鍵值不是整數時Redis會提示錯誤
3、增加指定的整數
INCRBY key increment
// INCRBY命令與INCR命令基本一樣,只不過前者可以通過increment參數指定一次增加的數值
// 例如
redis> INCRBY bar 2
(integer) 2
redis> INCRBY bar 3
(integer) 5
4、減少指定的整數
DECR key
DECRBY KEY
// DECR命令與INCR命令用法相同,只不過是讓鍵值遞減
5、增加指定浮點數
INCRBYFLOAT key increment
// INCRBYFLOAT命令類似INCRBY命令,差別是前者可以遞增一個雙精度浮點數
6、向尾部追加值
APPEND key value
// APPEND作用是向鍵值的末尾追加value。如果鍵不存在則將該鍵的值設置爲value,即相當於 SET key value。返回值是追加後字符串的總長度。
// 例如:
redis> SET key hello
OK
redis> APPEND key " world!"
(integer) 12
7、獲取字符串長度
STRLEN key
// 如果鍵不存在則返回0。
8、同時獲得/設置多個鍵值
MGET key [key ...]
MSET key value [key value ...]
// MGET/MSET 與GET/SET 相似,不過MGET/MSET 可以同時獲得/設置多個鍵的鍵值。
// 例如
redis> MSET key1 v1 key2 v2 key3 v3
OK
redis> GET key2
"v2"
redis> MGET key1 key3
1) "v1"
2) "v3"
2、散列類型
1、介紹
一個散列類型鍵可以包含至多2^32−1個字段。
2、命令
1、HSET命令用來給字段賦值,而HGET命令用來獲得字段的值。
// 例如
redis 127.0.0.1:6379> HSET myhash field1 "foo"
OK
redis 127.0.0.1:6379> HGET myhash field1
"foo"
// 如果想獲取鍵中所有字段和字段值卻不知道鍵中有哪些字段時應該使用HGETALL命令
HGETALL key
2、判斷字段是否存在
HEXISTS key field
// HEXISTS命令用來判斷一個字段是否存在。如果存在則返回1,否則返回0(如果鍵不存在也會返回0)。
3、當字段不存在時賦值
HSETNX key field value
// HSETNX命令與HSET命令類似,區別在於如果字段已經存在,HSETNX命令將不執行任何操作。
4、增加指定數字
HINCRBY key field increment
5、刪除字段
HDEL key field [field …]
// HDEL命令可以刪除一個或多個字段,返回值是被刪除的字段個數。
6、只獲取字段名或字段值
HKEYS key
HVALS key
7、獲得字段數量
HLEN key
3、列表類型
1、介紹
列表類型(list)可以存儲一個有序的字符串列表,常用的操作是向列表兩端添加元素,或者獲得列表的某一個片段。與散列類型鍵最多能容納的字段數量相同,一個列表類型鍵最多能容納2^32−1個元素。
2、命令
1、向列表兩端增加元素
LPUSH key value [value …]
PUSH key value [value …]
// LPUSH命令用來向列表左邊增加元素,返回值表示增加元素後列表的長度。
// LPUSH命令還支持同時增加多個元素
// 例如
redis> LPUSH numbers 2 3
(integer) 3
// 同理,向列表右邊增加元素的話則使用RPUSH命令
2、從列表兩端彈出元素
LPOP key
RPOP key
// 有進有出,LPOP命令可以從列表左邊彈出一個元素。LPOP命令執行兩步操作:第一步是將列表左邊的元素從列表中移除,第二步是返回被移除的元素值。
// 例如
redis> LPOP numbers
"3"
// 同理,RPOP命令可以從列表右邊彈出一個元素。
// 結合上面提到的 4 個命令可以使用列表類型來模擬棧和隊列的操作:如果想把列表當做棧,則搭配使用LPUSH和LPOP或RPUSH和RPOP,如果想當成隊列,則搭配使用LPUSH和RPOP或RPUSH和LPOP。
3、獲取列表中元素的個數
LLEN key
// 當鍵不存在時LLEN會返回0:
// 例如
redis> LLEN numbers
(integer) 3
// LLEN 命令的功能類似SQL語句 SELECT COUNT(*) FROM table_name,但是 LLEN的時間複雜度爲O(1),使用時Redis會直接讀取現成的值,而不需要像部分關係數據庫(如使用InnoDB存儲引擎的MySQL表)那樣需要遍歷一遍數據表來統計條目數量。
4、獲得列表片段(一定範圍內的值)
LRANGE key start stop
/*
LRANGE命令是列表類型最常用的命令之一,它能夠獲得列表中的某一片段。LRANGE命令將返回索引從 start到 stop之間的所有元素(包含兩端的元素)。與大多數人的直覺相同,Redis的列表起始索引爲0。
LRANGE命令也支持負索引,表示從右邊開始計算序數,如"−1"表示最右邊第一個元素,"-2"表示最右邊第二個元素,依次類推。
LRANGE numbers 0 -1 可以獲取列表中的所有元素。
另外一些特殊情況如下:
1)如果start的索引位置比stop的索引位置靠後,則會返回空列表。
2)如果stop大於實際的索引範圍,則會返回到列表最右邊的元素。
*/
5、刪除列表中指定的值
LREM key count value
/*
LREM命令會刪除列表中前count個值爲value的元素,返回值是實際刪除的元素個數。根據count值的不同,LREM命令的執行方式會略有差異。
1)當 count > 0時 LREM 命令會從列表左邊開始刪除前 count 個值爲 value的元素。
2)當 count < 0時 LREM 命令會從列表右邊開始刪除前|count|個值爲 value 的元素。
3)當 count = 0是 LREM命令會刪除所有值爲 value的元素。
*/
6、獲得/設置指定索引的元素值
LINDEX key index
LSET key index value
/*
如果要將列表類型當作數組來用,LINDEX命令是必不可少的。LINDEX命令用來返回指定索引的元素,索引從0開始。
LSET是另一個通過索引操作列表的命令,它會將索引爲index的元素賦值爲value。
*/
// 例如:
redis> LSET numbers 1 7
OK
redis> LINDEX numbers 1
"7"
7、只保留列表指定片段
LTRIM key start end LTRIM
/*
命令可以刪除指定索引範圍之外的所有元素,其指定列表範圍的方法和LRANGE命令相同。
LTRIM命令常和LPUSH命令一起使用來限制列表中元素的數量,比如記錄日誌時我們希望只保留最近的100條日誌,則每次加入新元素時調用一次LTRIM命令即可:
*/
LPUSH logs $newLog
LTRIM logs 0 99
8、向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
/*
LINSERT 命令首先會在列表中從左到右查找值爲 pivot 的元素,然後根據第二個參數是BEFORE還是AFTER來決定將value插入到該元素的前面還是後面。
LINSERT命令的返回值是插入後列表的元素個數。
*/
9、將元素從一個列表轉到另一個列表
RPOPLPUSH source destination
/*
RPOPLPUSH是個很有意思的命令,從名字就可以看出它的功能:先執行RPOP命令再執行LPUSH命令。RPOPLPUSH命令會先從source列表類型鍵的右邊彈出一個元素,然後將其加入到destination列表類型鍵的左邊,並返回這個元素的值,整個過程是原子的。
當把列表類型作爲隊列使用時,RPOPLPUSH 命令可以很直觀地在多個隊列中傳遞數據。當source和destination相同時,RPOPLPUSH命令會不斷地將隊尾的元素移到隊首,藉助這個特性我們可以實現一個網站監控系統;
*/
4、集合類型
1、介紹
在集合中的每個元素都是不同的,且沒有順序。一個集合類型(set)鍵可以存儲至多2^32 −1個(相信這個數字對大家來說已經很熟悉了)字符串。
集合類型的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等,由於集合類型在Redis內部是使用值爲空的散列表(hash table)實現的,所以這些操作的時間複雜度都是O(1)。最方便的是多個集合類型鍵之間還可以進行並集、交集和差集運算。
2、命令
1、增加/刪除元素
SADD key member [member …]
SREM key member [member …]
/**
SADD 命令用來向集合中增加一個或多個元素,如果鍵不存在則會自動創建。因爲在一個集合中不能有相同的元素,所以如果 要加入的元素已經存在於集合中就會忽略這個元素。本命令的返回值是成功加入的元素數量(忽略的元素不計算在內)。
SREM命令用來從集合中刪除一個或多個元素,並返回刪除成功的個數。
*/
2、獲的集合中所有元素
SMEMBERS key
/*
判斷一個元素是否在集合中是一個時間複雜度爲O(1)的操作,無論集合中有多少個元素,SISMEMBER命令始終可以極快地返回結果。當值存在時 SISMEMBER命令返回1,當值不存在或鍵不存在時返回0。
*/
3、集合間運算
SDIFF key [key „]
SINTER key [key „]
SUNION key [key „]
/*
1)SDIFF命令用來對多個集合執行差集運算。集合A與集合B的差集表示爲A−B,代表所有屬於A且不屬於B的元素構成的集合。
2)SINTER命令用來對多個集合執行交集運算。集合A與集合B的交集表示爲A ∩ B,代表所有屬於A 且屬於B的元素構成的集合。
3)SUNION命令用來對多個集合執行並集運算。
*/
4、獲得集合中元素個數
SCARD key
// SCARD命令用來獲得集合中的元素個數。
5、進行集合運算並將結果存儲
SDIFFSTORE destination key [key …]
SINTERSTORE destination key [key …]
SUNIONSTORE destination key [key …]
/*
SDIFFSTORE命令和SDIFF命令功能一樣,唯一的區別就是前者不會直接返回運算結果,而是將結果存儲在destination鍵中。
SDIFFSTORE命令常用於需要進行多步集合運算的場景中,如需要先計算差集再將結果和其他鍵計算交集。SINTERSTORE和SUNIONSTORE命令與之類似,不再贅述。
*/
6、隨機獲得集合中的元素
SRANDMEMBER key [count]
/*
SRANDMEMBER命令用來隨機從集合中獲取一個元素,還可以傳遞count參數來一次隨機獲得多個元素。
根據count的正負不同,具體表現也不同。
1)當count爲正數時,SRANDMEMBER會隨機從集合裏獲得count個不重複的元素。如果count的值大於集合中的元素個數,則SRANDMEMBER會返回集合中的全部元素。
2)當count爲負數時,SRANDMEMBER會隨機從集合裏獲得|count|個的元素,這些元素有可能相同。
*/
7、從集合中彈出一個元素
SPOP key
// 由於集合類型的元素是無序的,所以 SPOP命令會從集合中隨機選擇一個元素彈出。
5、有序集合類型
1、介紹
在集合類型的基礎上有序集合類型爲集合中的每個元素都關聯了一個分數,這使得我們不僅可以完成插入、刪除和判斷元素是否存在等集合類型支持的操作,還能夠獲得分數最高(或最低)的前N個元素、獲得指定分數範圍內的元素等與分數有關的操作。雖然集合中每個元素都是不同的,但是它們的分數卻可以相同。
有序集合類型在某些方面和列表類型有些相似:
(1)二者都是有序的。
(2)二者都可以獲得某一範圍的元素。
但是二者有着很大的區別,這使得它們的應用場景也是不同的:
(1)列表類型是通過鏈表實現的,獲取靠近兩端的數據速度極快,而當元素增多後,訪問中間數據的速度會較慢,所以它更加適合實現如“新鮮事”或“日誌”這樣很少訪問中間元素的應用。
(2)***有序集合類型是使用散列表和跳躍表(Skip list)實現的,所以即使讀取位於中間部分的數據速度也很快(時間複雜度是O(log(N)))***。
(3)列表中不能簡單地調整某個元素的位置,但是有序集合可以(通過更改這個元素的分數)。
(4)有序集合要比列表類型更耗費內存。
有序集合類型算得上是Redis的5種數據類型中最高級的類型了,在學習時可以與列表類型和集合類型對照理解。
2、命令
1、增加元素
ZADDkey score member [score member …]
/*
ZADD 命令用來向有序集合中加入一個元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數。ZADD命令的返回值是新加入到集合中的元素個數(不包含之前已經存在的元素)。
+inf和-inf分別表示正無窮和負無窮。
*/
2、獲得元素的分數
ZSCORE key member
3、獲得排名在某個範圍的元素列表
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
/*
ZRANGE命令會按照元素分數從小到大的順序返回索引從 start到stop之間的所有元素(包含兩端的元素)。負數代表從後向前查找(−1表示最後一個元素)。
如果需要同時獲得元素的分數的話可以在 ZRANGE 命令的尾部加上 WITHSCORES 參數。
ZRANGE命令的時間複雜度爲O(log n+m)(其中n爲有序集合的基數,m爲返回的元素個數)。
*/
4、獲得指定分數範圍的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
// ZRANGEBYSCORE 命令參數雖然多,但是都很好理解。該命令按照元素分數從小到大的順序返回分數在min和max之間(包含min和max)的元素:
// 例如:
redis> ZRANGEBYSCORE scoreboard 80 100
1) "Tom"
2) "David"
// 如果希望分數範圍不包含端點值,可以在分數前加上“(”符號。例如,希望返回80分到100分的數據,可以含80分,但不包含100分,則稍微修改一下上面的命令即可:
// 例如:
redis> ZRANGEBYSCORE scoreboard 80 (100
1) "Tom"
5、增加某個元素的分數
ZINCRBY key increment member
// ZINCRBY 命令可以增加一個元素的分數,返回值是更改後的分數。例如,想給 Jerry加4分:
// 例如:
redis> ZINCRBY scoreboard 4 Jerry
"60"
// increment也可以是個負數表示減分,例如,給Jerry減4分:
// 例如:
redis> ZINCRBY scoreboard -4 Jerry
"56"
// 如果指定的元素不存在,Redis 在執行命令前會先建立它並將它的分數賦爲 0 再執行操作。
6、獲得集合中元素的數量
ZCARD key
// 例如:
redis> ZCARD scoreboard
(integer) 6
7、獲得指定分數範圍的元素個數
ZCOUNT key min max
// 例如
redis> ZCOUNT scoreboard 90 100
(integer) 2
8、刪除一個或多個元素
ZREM key member [member …]
// ZREM命令的返回值是成功刪除的元素數量(不包含本來就不存在的元素)。
9、按照排名範圍刪除元素
ZREMRANGEBYRANK key start stop
// ZREMRANGEBYRANK 命令按照元素分數從小到大的順序(即索引0表示最小的值)刪除處在指定排名範圍內的所有元素,並返回刪除的元素數量。
10、按照分數範圍刪除元素
ZREMRANGEBYSCORE key min max
// ZREMRANGEBYSCORE命令會刪除指定分數範圍內的所有元素,參數min和max的特性和ZRANGEBYSCORE命令中的一樣。返回值是刪除的元素數量。
11、獲得元素的排名
ZRANK key member
ZREVRANK key member
// ZRANK命令會按照元素分數從小到大的順序獲得指定的元素的排名,(從0開始,即分數最小的元素排名爲0)
// 例如:
redis> ZRANK scoreboard Peter
(integer) 0
// ZREVRANK命令則相反(分數最大的元素排名爲0):
// 例如:
redis> ZREVRANK scoreboard Peter
(integer) 4
12、計算有序集合的交集
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight…]] [AGGREGATE SUM|MIN|MAX]
/*
ZINTERSTORE命令用來計算多個有序集合的交集並將結果存儲在destination鍵中(同樣以有序集合類型存儲),返回值爲destination鍵中的元素個數。
destination鍵中元素的分數是由AGGREGATE參數決定的。
(1)當AGGREGATE是SUM時(也就是默認值),destination鍵中元素
的分數是每個參與計算的集合中該元素分數的和。
(2)當AGGREGATE是MIN時,destination鍵中元素的分數是每個參與
計算的集合中該元素分數的最小值。
(3)當AGGREGATE是MAX時,destination鍵中元素的分數是每個參與
計算的集合中該元素分數的最大值。
ZINTERSTORE命令還能夠通過WEIGHTS參數設置每個集合的權重,每
個集合在參與計算時元素的分數會被乘上該集合的權重。
*/
參考連接;https://www.cnblogs.com/liumt/p/6095289.html*
電子書可在得到APP上查看