redis學習筆記(一)

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好處在於:程序執行過程中,可以不斷地向網址列表中加入新網址,允許多個客戶端同時處理隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章