redis簡要學習筆記(內容來自Redis入門指南,感謝原書作者)
Redis是非關係型數據庫。
JS------JSSO格式:鍵值是存儲。
php中,數組是以key-value存儲。
NoSQL使用場景:
1.對數據高併發讀寫;
2.對海量數據的高效存儲和訪問;
3.對數據的高可擴展性和高可用性。
Redis支持的數據類型:string,hash,list(鏈表),set(集合),zset(有序集合)。
Redis使用場合:
1.取最新N個數據的操作;
2.排行榜應用,取TOP N操作;
3.需要精確設定過期時間的應用(如競拍等);
4.計數器應用;
5.Uniq操作,獲取某段時間所有數據排重值;
6.實時系統
7.構建實時消息系統(Pub/sub),發佈訂閱;
8.構建棧、隊列;
9.緩存。
redis與mysql不同:
1.兩者均有庫的概念;2.redis無表、無行、無列,而mysql有。
string:
set/get/senx/setex/setrange(替換)/mset/msetnx/mget/getset(獲取key舊值,並設置新值)/GETRANGE(GETRANGE NAME 0 4,獲取NAME的[0~4]字符)
/INCR/INCRBY/DECR/DECRBY/APPEND/STRLEN
HASH:
redis的hash是string類型的filed和alue,即:hset key-name filed value
保存用戶的信息較方便。
HSET/HGET/HSETNX/HMSET/HMGET(獲取同一個key的所有字段的值)/HINCRBY/HEXISTS/HLEN(返回鍵的filed個數)/HDEL(刪除對應的filed)/HKEYS(返回所有的字段)/HVALUES(返回hash表的所有value)/HGETALL(同時返回所有字段及其對應的值)
一.命令
1.自增:incr, incr foo 1 foo=1; 返回值是變量增加後的值
incrby需要加遞增的進階值,如incrby too 5 too=5
2.自減:decr, decr foo 1 foo=-1; 返回值是變量減少後的值
decrby 需要加遞減的進階值,如decrby too -5 too=-5
3.增加指定浮點數:incrbyfloat bar 2.7 bar=2.7 ;返回值是變量增加後的值
4.向尾部追加值append,append返回值是追加後字符串的總長度
set key hello key => hello
append key "world" key => helloworld
5.獲取字符串的長度:strlen返回值是鍵值的長度
strlen key => 10 (key=> helloworld)
6.同時獲得/設置多個鍵值:mset命令
mset key1 v1 key2 v2 key3 v3
mget key1 key2 key3,輸出爲:1):"v1" 2)"v2" 3)"v3"
get key1 => v1
7.位操作
getbit/setbit/bitcount/bitop
如set foo bar,bar的三個字母對應的ASCII碼分別爲98、97和114,轉換成二進制分別爲11000010、11000001和01110010
getbit命令可以獲得第一個字符串類型鍵指定位置的二進制位的值(0或1)。getbit foo 0 輸出0;getbit foo 6 輸出1;如果需要獲取的二進制位的值,超過了二進制自身的長度,則返回0。
setbit命令設置字符串對應比特位的值爲1或者0. setbit foo 6 0;setbit foo 7 1;get foo 輸出 aar
bitcount命令可以獲得字符串類型鍵中值是1的二進制個數。 bitcount foo 10 輸出10;bitcount foo 0 1,統計前兩個字節中鍵值是1的個數。
bitop命令可以對多個字符串類型鍵值進行位運算,並將結果存儲在destkey指定的鍵中。如:
set foo1 bar;set foo2 aar; bitop or res foo1 foo2, get res 輸出car。
二、散列類型
1.命令: HSET key filed value
HGET key filed
GMSET key filed value filed value
HMGET key filed filed
HGETALL key
redis 127.0.0.1:6379> HSET car price 500
(integer) 1
redis 127.0.0.1:6379> hset car name bmw
(integer) 1
redis 127.0.0.1:6379> HGET car name
"bmw"
redis 127.0.0.1:6379> HSET car price 500
(integer) 0
redis 127.0.0.1:6379> HSET car price 1000
(integer) 0
redis 127.0.0.1:6379> HGET car name
"bmw"
redis 127.0.0.1:6379> HGET car price
"1000"
HSET不區分插入和更新。如果是執行插入操作(之前不存在對應的key)時,HSET命令返回1;如果執行的是更新操作(之前存在對應的key),HSET命令返回0.
註釋:在Redis中每個鍵都屬於一個明確的數據類型,如通過HSET命令建立的鍵是散列型,通過SET命令建立的鍵是字符串類型。使用一種類型數據操作另一種數據類型的鍵會提示錯誤。
當需要設置多個字段的值時候,可以使用HMSET命令。
HMSET key filed1 value1 filed2 value2
HMGET命令可以同時獲得多個字段的值
redis 127.0.0.1:6379> HMGET car price name
1) "1000"
2) "bmw"
如果想獲得鍵中所有的字段或者所有的值,但是卻不知道有哪些字段時,可以使用HGETALL命令,如:
redis 127.0.0.1:6379> HGETALL car
1) "price"
2) "1000"
3) "name"
4) "bmw"
2.判斷字段是否存在
HEXISTS命令用來判斷一個字段是否存在。如果存在則返回1,否則返回0.
redis 127.0.0.1:6379> HEXISTS car price
(integer) 1
redis 127.0.0.1:6379> HEXISTS car model
(integer) 0
3.當字段不存在時賦值
HSETNX命令,HSETNX key ,failed, value 如果字段已經存在,HSETNX將不執行任何操作。
4.增加數字
redis 127.0.0.1:6379> HINCRBY person score 60
(integer) 60
redis 127.0.0.1:6379> hget person score
"60"
之前的person鍵不存在,HINCRBY命令會自動建立該鍵,並默認score在命令執行前的值爲0.命令的返回值,是增值後的字段值。HINCRBYFLOAT是增加浮點數值。
5.刪除字段
redis 127.0.0.1:6379> HINCRBYFLOAT person score 15.43
"75.43"
redis 127.0.0.1:6379> HDEL person score
(integer) 1
HDLE命令可以刪除一個或多個字段,返回值是被刪除的字段的個數。
6.只獲取字段名或者字段值
HKEYS key ;僅獲取鍵中所有字段的名字而不需要字段的值
HVALS key ;僅獲得鍵中所有字段值
redis 127.0.0.1:6379> HKEYS car
1) "price"
2) "name"
redis 127.0.0.1:6379> HVALS car
1) "1000"
2) "bmw
7.獲得字段數量 HLEN key
redis 127.0.0.1:6379> HLEN car
(integer) 2
三、列表類型
LIST類型(鏈表):既可以作爲隊列,又可以作爲棧,同時也可以作爲雙向:既近也出。
LPUSH(從頭部壓入元素)/RPUSH(從尾部壓入元素):都是從頭開始取(從左邊取),從兩端對鏈表進行操作。
redis 127.0.0.1:6379> LPUSH mylist
hello //(先近的是world)
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist world //(後近的是hello)
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "world"
2) "hello"
redis 127.0.0.1:6379> RPUSH list hello
(integer) 1
redis 127.0.0.1:6379> RPUSH list world
(integer) 2
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "world"
先近先出:隊列
如果想從中間插入某個元素:
LINSERT(從中間插入元素)
下例子是先壓入one,再壓入two,如果想在中間壓入three,則:
redis 127.0.0.1:6379> LPUSH list3 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list3 two
(integer) 2
redis 127.0.0.1:6379> LRANGE list3 0 -1
1) "two"
2) "one"
redis 127.0.0.1:6379> LINSERT list3 before one three //(沒有rinsert)
(integer) 3
redis 127.0.0.1:6379> LRANGE list3 0 -1
1) "two"
2) "three"
3) "one"
LSET: 設定指定下標元素的值爲value
redis 127.0.0.1:6379> LPUSH list5 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list5 two
(integer) 2
redis 127.0.0.1:6379> LPUSH list5 three
(integer) 3
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "two"
3) "one"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LSET list5 1 "new world"
OK
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LRANGE list5 0 -1
1) "three"
2) "new world" //更改成功
3) "one"
LREM:(從key對應的list中刪除n個和value相同的元素,n<0,從尾刪,n=0全部刪除對應的key,n>0.,從左側頭部刪除)
LREM list5 3 one //從list5中刪除3個one
LTRIM:(刪除一定範圍的元素)
LTRIM list8 1 -1 //保留1,-1位置元素,其他都刪除。
redis 127.0.0.1:6379> LPUSH list8 one
(integer) 1
redis 127.0.0.1:6379> LPUSH list8 two
(integer) 2
redis 127.0.0.1:6379> LPUSH list8 three
(integer) 3
redis 127.0.0.1:6379> LPUSH list8 four
(integer) 4
redis 127.0.0.1:6379>
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LRANGE list8 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
redis 127.0.0.1:6379> LTRIM list8 1 2
OK
redis 127.0.0.1:6379> LRANGE list8 0 -1
1) "three"
2) "two" //只剩下1,2位置的three,two;其他的value都刪除。
LPOP/LPUSH:從list的頭部刪除/添加一個元素;RPOP/LPUSH:從尾部彈出/添加一個元素。
rpoplpush:從第一個list的尾部移除元素並添加到第二個list的頭部
示例:
redis 127.0.0.1:6379> LPUSH mylist5 hello
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist5 three
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist5 0 -1
1) "three"
2) "hello"
redis 127.0.0.1:6379> LPUSH mylist6 foo
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist6 hello
(integer) 2
redis 127.0.0.1:6379> LRANGE mylist6 0 -1
1) "hello"
2) "foo"
redis 127.0.0.1:6379> RPOPLPUSH mylist5 mylist6
"hello"
redis 127.0.0.1:6379> LRANGE mylist5 0 -1
1) "three"
redis 127.0.0.1:6379> LRANGE mylist6 0 -1
1) "hello"
2) "hello"
3) "foo"
LINDEX:返回名稱爲key的list中Index位置的元素
LLEN:返回list中元素的長度。
1.向列表兩端增加元素
LPUSH 用來向列表左邊增加元素,返回值表示增加元素後列表的長度。
redis 127.0.0.1:6379> LPUSH numbers 1
(integer) 1
numbers中的元素爲:【1】
LPUSH還支持同時增加多個元素,
redis 127.0.0.1:6379> LPUSH numbers 2 3
(integer) 3
操作之後,numbers中的元素爲【3 2 1】
向列表中右邊加如元素,爲RPUSH,(以當前列表中第0個元素爲基準)
redis 127.0.0.1:6379> RPUSH numbers 0 -1
(integer) 5
此時表中元素爲:【3 2 1 0 -1】
2.從列表兩端彈出元素
LPOP key ;從列表左邊彈出一個元素,返回值是被刪除的元素值
RPOP key ;從列表右邊彈出一個元素,返回值是被刪除的元素值
redis 127.0.0.1:6379> LPOP numbers
"3"
redis 127.0.0.1:6379> RPOP numbers
"-1"
LPUSH/RPUSH/LPOP/RPOP這4個命令,可以使用列表類型來模擬棧和隊列操作:如果想把列表當作棧,則搭配使用LPUSH/LPOP或RPUSH/RPOP;如果想當成隊列,則搭配LPUSH/RPOP或RPUSH/LPOP使用。
3.獲取列表中元素的個數
LLEN key ;當鍵不存在時,會返回0,如果鍵存在,則返回鍵的個數。
redis 127.0.0.1:6379> LLEN numbers
(integer) 3
4.獲得鍵的片段
LRANGE key star stop ;獲取列表中的某一片段,返回值是索引從start到stop之間所有元素(包括兩端元素,閉集);它支持負索引,表示從右邊開始計算序數。(已從左邊開始計算爲基準,如果值>=0時)
redis 127.0.0.1:6379> LRANGE numbers 0 2
1) "2"
2) "1"
3) "0"
redis 127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"
其中“-1”表示最右邊的第一個元素,“-2“表示最右邊第二個元素。
通過LRANGE numbers 0 -1 ;獲取列表中所有元素
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
5.刪除列表中指定的值
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "100"
5) "2"
redis 127.0.0.1:6379> LREM numbers -1 2
(integer) 1
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "100"
LREM key count value ;LREM會刪除列表中前count個值爲alue的元素,返回值是實際刪除的元素個數。
當count > 0時,LREM命令會從列表左邊開始刪除前 |count| 個值爲value的元素
count < 0時,LREM命令會從列表右邊開始刪除前 |count| 個值爲value的元素
count = 0時,LREM命令會從從列表中刪除所有值爲value的元素
6.獲得/設置指定索引的元素值
LINDEX key index ;返回指定索引的元素,索引從0開始;如果index 爲負值,則從右邊開始,最右邊元素的索引爲-1.
LSET key index value ; 將索引爲Index的元素賦值爲value ;如果Index超過當前的range,則報錯爲(error) ERR index out of range。
redis 127.0.0.1:6379> LINDEX numbers 3
"100"
redis 127.0.0.1:6379> LINDEX numbers -1
"100"
redis 127.0.0.1:6379> LINDEX numbers -5
(nil)
7.只保留列表指定片段
LTRIM key start end
LTRIM命令刪除指定索引範圍之外的所有元素,其指定列表範圍的方法和LRANGE命令相同。
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
4) "100"
redis 127.0.0.1:6379> LTRIM numbers 1 2
OK
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
LTRIM和LPUSH一起用來限制列表中元素的數量,比如記錄日誌時希望只保留最近的100條日誌,則每次加入新元素時調用一次LTRIM命令即可:
LPUSH logs $newLog
LTRIM logs 0 99
8.向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
LINSERT 命令首先在列表中從左到右查找值爲pivot的元素,然後根據第二個參數是BEFORE還是AFTER來決定將value插入到該元素的前面還是後面,如果未找到該值,則返回-1.
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
redis 127.0.0.1:6379> LINSERT numbers after 0 1024
(integer) 3
redis 127.0.0.1:6379> LRANGE numbers 0 -1
1) "1"
2) "0"
3) "1024"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> LINSERT numbers after 99 1024
(integer) -1
9.將元素從一個列表轉到另一個列表
RPOPLPUSH source destnation
RPOPLPUSH功能:先執行RPOP命令,在執行LPUSH命令。RPOPLPUSH命令會先從source列表類型鍵的右邊彈出一個元素,然後將其加入到destnation列表類型鍵的左邊,並返回這個元素的值,整個過程是原子的。
當把列表當作爲隊列使用時,RPOPLPUSH命令可以直觀的子多個隊列中傳遞數據。當source和destination相同時,RPOPLPUSH命令會不斷的將隊尾的元素移到隊首。這個特性可以實時監控網站:使用一個隊列存儲需要監控的網站,然後監控程序不斷地使用RPOPLPUSH命令循環取出一個網址來測試可用性。
RPOPLPUSH好處在於:程序執行過程中,可以不斷地向網址列表中加入新網址,允許多個客戶端同時處理隊列。