1. 程式人生 > >Redis學習筆記-基礎

Redis學習筆記-基礎

1.什麼是redis?

Redis是Remote Dictionary Server(遠端字典伺服器)的縮寫,以字典的形式儲存資料,允許其他應用通過TCP協議讀寫字典中的內容。redis是一種高效能的基於鍵值對的資料庫。

2.redis支援的資料型別

字串型別、雜湊型別、集合型別、有序集合、列表型別。

3.與mysql資料庫的區別

Mysql是關係型資料庫,使用二維表儲存資料;redis是一種基於鍵值對的資料庫;mysql支援多執行緒高併發,redis不支援;redis將資料儲存在記憶體中,而mysql儲存在硬碟中,所以redis的處理速度較快,可以通過持久化將資料儲存到硬碟中。Redis可以設定鍵的過期時間,過期後自動(惰性)清除鍵。

4.資料型別介紹

1)字串型別:是最基本的資料型別,可以儲存任何形式的字串,包括二進位制資料。

2)雜湊型別:儲存了欄位和欄位值的對映,但欄位只能是字串,不支援其他型別,即雜湊不能巢狀其他資料型別,一個雜湊鍵可以包含至多2的32次冪減1個欄位。

3)列表型別:可以儲存一個有序的字串列表,常見的操作是向列表的兩端新增元素,或者獲取列表的某一個片段,列表型別的內部使用雙向連結串列實現的,所以向列表的兩端新增元素的時間複雜度為O(1),因此越靠近兩端的元素獲取的速度越快。

4)集合型別:在集合中每一個元素均不同,且沒有順序,一個集合型別(set)鍵可以儲存至多2的32次冪減1個字串。集合與列表的區別在於列表是有序的,元素可以相同;而集合中元素是無序的,元素必須互不相同。

5)有序集合:在集合的基礎上每一個元素都關聯了一個分數,雖然集合中每一個元素都是不同的,但他們的分數確實可以相同的。

5.有序集合與列表的異同點

有序集合與列表均是有序的,而且二者均可以獲得某一範圍的元素;列表是通過雙向連結串列實現的,所以在獲取兩端的元素時很快,當元素增多時,操作的速度會明顯下降。有序集合是使用散列表和跳躍表實現的,所以即使讀取位於中間部分的資料速度也很快,時間複雜度為O(logN);列表中不能簡單的調整某一個元素的位置,但有序集合可以(通過改變分數的值實現);有序集合要比列表更耗記憶體。

6.常用命令-1

1)啟動redis執行redis-server命令即可,redis伺服器的預設埠是6379,可以通過--port自定義通訊的埠,例如:redis-server --port 6399

2)通過執行redis安裝目錄中的utils資料夾下的redis_init_script指令碼啟動redis,例如:/etc/init.d/redis_埠號 start啟動redis的服務,隨後執行sudo update-rc.d redis_埠號 defaults。

3)停止redis的命令:redis-cli SHUTDOWN此命令會先斷開所有的客戶端,然後按照配置檔案執行持久化後退出

4)通過命令列登入redis,命令如下:redis-cli –h 127.0.0.1 –p 6399,其中-h指定了登入的主機,-p指定連線的埠

5)通常在連線前現確定一下通訊是否正常,命令如下redis-cli PING,如果連線正常,則返回PONG;或者在登陸後再執行ping命令,返回pong則表明通訊正常。

6)設定redis的相關選項,使用同名引數覆蓋檔案中的原有設定,例如redis-server /path/to/redis.conf –loglevel warning

7)可以通過執行的redis中輸入CONFIG SET命令在不重複啟動redis的情況下,動態修改部分配置,例如:CONFIG SET loglevel warning;但要注意的是並不是所有的設定均可通過CONFIG SET來更改。

7.redis執行結果返回值分析

1)狀態資訊:當redis命令執行後返回執行的狀態資訊,例如執行PING命令時回覆PONG

2)錯誤回覆:錯誤回覆以error開頭,例如ERRORCOMMEND,並在後面追加錯誤的具體資訊。

3)整數回覆:例如一些操作鍵值的命令(INCR)或者檢視資料庫中的鍵的數量(DBSIZE)的命令會返回整數,返回資訊通常為:(interger)開頭+數字

4)字串回覆:當檢視某一個字串型別鍵的指定返回值,返回值以雙引號括起來,特殊情況會返回空(nil)。例如執行GET 鍵名。

5)多行字串:當查詢的鍵是非字串時,返結果以一個序列號開頭的多行字串,例如1)“”2)“”

8.對鍵值常用的操作命令

1)字串型別鍵的常用命令

(1)檢視當前使用的資料字典中的所有鍵值:KEY  *;

(2)設定鍵的名字並賦值SET 鍵名 值,例如:SET FIRST 1;

(3)判斷資料字典中是否存在某一個鍵命令:EXISTS 鍵名,例如:EXISTS FIRST;

(4)刪除資料字典中的指定的鍵值命令格式為DEL 鍵名,如果刪除成功返回1否則返貨回0,例如:DEL FIRST;

(5)檢視指定鍵的型別命令格式為TYPE 鍵名,例如:TYPE FIRST;

(6)獲取某一個鍵的值命令格式,GET 鍵名,此命令當鍵為空時返回空,不為空則返回鍵的值,例如:GET FIRST

(7)遞增整型鍵的值命令格式為INCR 鍵名,此種形式的命令每一次只增加1,例如:INCR FRST

(8)增加任意數量的命令格式 INCRBY 鍵名 數值,例如:INCRBY FIRST 6

(9)相對的減少鍵值的命令也有兩種形式:DECR 鍵名/DECR 鍵名 數量

(10)增加指定鍵值的浮點數值,命令個數如下INCRBYFLOAT 鍵名 鍵值,例如:INCRBYFLOAT FIRST 2.7

(11)向尾部增加字元命令格式:APPEND 鍵名 字串,返回的結果為改變後改鍵的總長度,例如:APPEND FIRST “ HELLO WORLD!”

(12)獲取字串的長度命令格式為:STRLEN      鍵名,例如:STRLEN FIRST

(13)同時設定多個鍵的值的命令格式為MSET 鍵1 值1 鍵2 值2….,例如:MSET First 1 second 2;獲取多個指定鍵的值的命令格式為MGET 鍵1 鍵2…例如MGET First second

(14)位操作命令:

GETBIT 鍵名 第幾位      // GETBIT FIRST 6

SETBIT鍵名 第幾位 值           //SETBIT FIRST 6 1

BITCOUNT 鍵名 開始 結束  //獲取指定範圍內1的個數BITCOUNT FIRST 0 10

BITOP 操作 目標鍵名 源鍵名序列//對多個鍵做位運算將結果儲存在目標鍵名中,例如BITOP OR res fir second

2)雜湊型別鍵的常用命令

(1)賦值命令:HSET 鍵名 域名 值,例如:HSET test first 1

(2)獲取鍵的指定域名的值:HGET 鍵名 域名,例如:HGET test first

(3)設定多個域的值HMSET 鍵名 域名1 值1 域名2 值2,例如HMSET test first1 second 2

(4)獲取多個域的值HMGET 鍵名 域名1 域名2….例如HMGET test first second;也可使用HGETALL 鍵名 命令獲取鍵名的所有域值

(5)判斷欄位是否存在HEXISTS 鍵名 域名,存在返回1否則返回0,例如:HEXISTS test first

(6)當欄位不存在的時候自動建立並賦值:HSETNX 鍵名 域名 值//HSETNX test third 4

(7)增加數字HINCRBY 鍵名 域名 值// HINCRBY test first 2

(8)刪除欄位HDEL 鍵名 域名1 域名2…//HDEL test first second

(9)只獲取欄位名和欄位值HKEY 鍵名;HVALS 鍵名//HKEY test,HVALS test

(10)獲取欄位的數量HLEN 鍵名//HLEN test

3)列表型別鍵的常用命令

(1)向列表的兩端新增元素,操作後返回列表的長度LPUSH/RPUSH 鍵名 值1 值2…//LPUSH/RPUSH test 1 2 3 4

(2)從列表的兩端彈出元素,返回結果為彈出的元素LPOP/RPOP 鍵名 //LPOP/RPOP test

(3)獲取列表中元素的個數當鍵不存在時返回0,否則返回鍵的個數,LLEN 鍵名//LLEN test

(4)獲取列表的片段,返回範圍區間內的元素LRANGE 鍵名 開始 截止位置;如果開始位置或者截止位置為負數時,表示的區間為列表的倒數第幾位的區間 // LRANGE test 0 3

(5)刪除列表中的指定值LREM 鍵名 個數 值//刪除列表中指定值n個元素,返回值為被操作的元素個數,當個數大於0表示從左側開始,小於0表示從右側開始刪除絕對值個值,當個數為0時,刪除所有值為指定值的元素,例如:LREM first -4 1

(6)獲取指定索引的元素值,如果索引是陣列的情況下,索引從0開始,LINDEX 鍵名 索引值//LINDEX test 1

(7)設定指定索引的元素值,命令格式為LSET key index value

(8)只保留列表的指定範圍,刪除指定範圍外的元素,LTRIM 鍵名 start end         // LTRIM test start end

(9)向列表中插入元素 LINSERT key BEFORE|AFTER pivot value。此命令會在列表中從左到右查詢值為pivot的元素,然後根據BEFORE|AFTER引數決定將value值插在哪。

(10)將一個元素由一個列表轉移到另一個列表,RPOPLPUSH source destination

4)集合型別鍵的常用命令

(1)增加元素 SADD key member [member2 …..](集合中的間不能重複,所以遇見已有的鍵就會跳過,沒有的會自動建立,操作返回鍵入的鍵的個數)

(2)刪除元素:SREM KEY member [member2 …..],返回值為操作的個數

(3)獲得集合中所有的key:SMEMBERS KEY

(4)判斷集合中是否存在該key:SISMEMBER KEY MEMBER

(5)集合間的差集:SDIFF setA setB setC

(6)集合交集:SINTER setA setB setC

(7)集合間的並集:SUNION setA setB setC

(8)集合中元素的個數:SCARD key

(9)求集合間的差集並將結果儲存:SDIFFSTORE destination key [key…]

(10)求集合間的交集並將結果儲存:SINTERSTORE destination key [key…]

(11)從集合中彈出一個元素:SPOP key

(12)求集合間的並集並將結果儲存:SUNIONSTORE destination key

(13)隨機獲得集合中的元素:SRANDMEMBER key [count]//使用count指定一次隨機獲得多個元素,count的使用方法:

(14)整數:隨機獲取count個不重複的元素

(15)負數:獲取|count|個元素,可能重複

5)有序集合型別鍵的常用命令

(1)ZADD key score member [score member…]//如果新增的元素已經存在,則使用新的分數覆蓋原分數

(2)獲得元素的分數:ZSCORE key member

(3)獲得某一個範圍內的元素列表:ZRANGE key start stop [WITHSCORES]//升序排序

(4)ZREVRANGE key start stop [WITHSCORES]//降序排序結果

(5)獲得指定分數範圍的元素:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

(6)增加某個元素的分數:ZINCRBY key increment member

(7)獲得集合中元素的個數:ZCARD key

(8)獲得指定分數範圍內的元素的個數:ZCOUNT key min max

(9)刪除元素:ZREM key member [key member…]

(10)按照排名範圍刪除元素:ZREMRANGEBYRANK key start stop

(11)按照分數範圍刪除元素: ZREMRANGEBYACORE key min max

(12)獲得元素的排名:ZRANK key member//按照分數升序排序

(13)ZREVRANK key member // 按照分數逆序排序

(14)計算有序集合的交集:ZINTERSTORE destination numkeys key [key..] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]

注意:在redis中每一字典單成一個數據庫,每一個數據庫對外均是從0開始的遞增數字來命名,可以通過database來修改這一數字。客戶端與redis伺服器建立連線後預設選擇0號資料庫,可以通過select命令更換資料庫,例如SELECT 6   //選擇6號資料庫