redis入門筆記(1)

1. Redis 簡介
Redis 是一款開源的、高性能的鍵 - 值存儲( key-value store )。它常被稱做是一款數據結構服務器( data structure server )。 Redis 的鍵值能夠包括字符串( strings )類型,同時它還包括哈希( hashes )、列表( lists )、集合( sets )和 有序集合( sorted sets )等數據類型。 對於這些數據類型,你能夠執行原子操做。例如:對字符串進行附加操做( append );遞增哈希中的值;向列表中增長元素;計算集合的交集、並集與差集等。
爲了得到優異的性能, Redis 採用了內存中( in-memory )數據集( dataset )的方式。同時, Redis 支持數據的持久化,你能夠每隔一段時間將數據集轉存到磁盤上( snapshot ),或者在日誌尾部追加每一條操做命令( append only file,aof )。
Redis 一樣支持主從複製( master-slave replication ),而且具備很是快速的非阻塞首次同步( non-blocking first synchronization )、網絡斷開自動重連等功能。同時 Redis 還具備其它一些特性,其中包括簡單的事物支持、發佈訂閱 ( pub/sub )、管道( pipeline )和虛擬內存( vm )等 。
Redis 具備豐富的客戶端,支持現階段流行的大多數編程語言。 http://redis.io/clients
 
2. Redis安裝
 
下載最新穩定版 redis-2.2.11 http://redis.io/download
tar zxvf redis-2.2.11   解壓縮
cd src               進入 src 目錄
make               編譯 Redis
make test       能夠測試一下(本步可省略)
make install    安裝,默認安裝目錄是 / usr /local/bin ,生成以下圖中的 5 個二進制文件,能夠將其拷到新建目錄下,例如 :  / usr /local/ redis /bin
cp  源碼 / src / redis.conf    / usr /local/ redis /etc     配置文件複製
cd / usr /local/ redis
./bin/ redis -server ./etc/ redis.conf                     啓動 Redis 服務
此時 redis 已經運行,但要得到好的性能,還須要對配置文件進行合理的配置
 
3. Redis配置
 
•1. Redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓用守護進程
•    daemonize no
•2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,能夠經過pidfile指定
•    pidfile /var/run/redis.pid
•3. 指定Redis監聽端口,默認端口爲6379,做者在本身的一篇博文中解釋了爲何選用6379做爲默認端口,由於6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字
•    port 6379
•4. 綁定的主機地址
•    bind 127.0.0.1
•5.當 客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能
•    timeout 300
•6. 指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose
    loglevel verbose
•7. 日誌記錄方式,默認爲標準輸出,若是配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null
•    logfile stdout
•8. 設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id
•    databases 16
•9. 指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合
•    save <seconds> <changes>
•    Redis默認配置文件中提供了三個條件:
•    save 900 1
•    save 300 10
•    save 60 10000
•    分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
•10. 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變的巨大
•    rdbcompression yes
•11. 指定本地數據庫文件名,默認值爲dump.rdb
•    dbfilename dump.rdb
•12. 指定本地數據庫存放目錄
•    dir ./
•13. 設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步
•    slaveof <masterip> <masterport>
•14. 當master服務設置了密碼保護時,slav服務鏈接master的密碼
•    masterauth <master-password>
•15. 設置Redis鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接Redis時須要經過AUTH <password>命令提供密碼,默認關閉
•    requirepass foobared
•16. 設置同一時間最大客戶端鏈接數,默認無限制,Redis能夠同時打開的客戶端鏈接數爲Redis進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回max number of clients reached錯誤信息
•    maxclients 128
•17. 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
•    maxmemory <bytes>
•18. 指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲no
•    appendonly no
•19. 指定更新日誌文件名,默認爲appendonly.aof
•     appendfilename appendonly.aof
•20. 指定更新日誌條件,共有3個可選值:
    no:表示等操做系統進行數據緩存同步到磁盤(快)
    always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全)
    everysec:表示每秒同步一次(折衷,默認值)
•    appendfsync everysec
•21. 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制)
•     vm-enabled no
•22. 虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享
•     vm-swap-file /tmp/redis.swap
•23. 將全部大於vm-max-memory的數據存入虛擬內存,不管vm-max-memory設置多小,全部索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置爲0的時候,實際上是全部value都存在於磁盤。默認值爲0
•     vm-max-memory 0
•24. Redis swap文件分紅了不少的page,一個對象能夠保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,做者建議若是存儲不少小對象,page大小最好設置爲32或者64bytes;若是存儲很大大對象,則可使用更大的page,若是不 肯定,就使用默認值
•     vm-page-size 32
•25. 設置swap文件中的page數量,因爲頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。
•     vm-pages 134217728
•26. 設置訪問swap文件的線程數,最好不要超過機器的核數,若是設置爲0,那麼全部對swap文件的操做都是串行的,可能會形成比較長時間的延遲。默認值爲4
•     vm-max-threads 4
•27. 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓
•    glueoutputbuf yes
•28. 指定在超過必定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法
•    hash-max-zipmap-entries 64
•    hash-max-zipmap-value 512
•29. 指定是否激活重置哈希,默認爲開啓
•    activerehashing yes
•30. 指定包含其它的配置文件,能夠在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件
•    include /path/to/local.conf
 
4. Redis 支持的數據類型
Keys
非二進制安全的字符類型( not binary-safe strings
Values
Strings         Binary-safe strings
Lists              Lists of binary-safe strings
Sets              Sets of binary-safe strings
Sorted sets Sorted sets of binary-safe strings
Hash
 
 Key說明
redis 本質上一個 key-value 數據庫,因此咱們首先來看看他的 key. 首先 key 也是字符串類型,因爲 key 不是 binary safe 的字符串,因此像 「my key」 mykey \n」 這樣包含空格和換行的 key 是不容許的。
咱們在使用的時候能夠本身定義一個 Key 的格式。例如 object- type:id:field
Key 不要太長。佔內存,查詢慢。
Key 不要過短。 u:1000:pwd   不如   user:1000:password  可讀性好
 
Key相關命令
•exits key 測試指定key是否存在,返回1表示存在,0不存在
•del key1 key2 ....keyN  刪除給定key,返回刪除key的數目,0表示給定key都不存在
•type key 返回給定key的value類型。返回 none 表示不存在,key有string字符類型,list 鏈表類型 set 無序集合類型等...
keys pattern 返回匹配指定模式的全部key(支持*,?,[abc ]的方式)
•randomkey 返回從當前數據庫中隨機選擇的一個key,若是當前數據庫是空的,返回空串
•rename oldkey newkey 原子的重命名一個key,若是newkey存在,將會被覆蓋,返回1表示成功,0失敗。失敗多是oldkey不存在或者和newkey相同
•renamenx oldkey newkey 同上,可是若是newkey存在返回失敗
•dbsize 返回當前數據庫的key數量
•expire key seconds 爲key指定過時時間,單位是秒。返回1成功,0表示key已經設置過過時時間或者不存在
•ttl key 返回設置了過時時間的key的剩餘過時秒數, -1表示key不存在或者沒有設置過過時時間
•select db-index 經過索引選擇數據庫,默認鏈接的數據庫全部是0,默認數據庫數是16個。返回1表示成功,0失敗
•move key db-index  將key從當前數據庫移動到指定數據庫。返回1成功。0 若是key不存在,或者已經在指定數據庫中
•flushdb 刪除當前數據庫中全部key,此方法不會失敗。慎用
flushall 刪除全部數據庫中的全部key,此方法不會失敗。更加慎用
 
Value說明
 
String
string redis 最基本的類型,並且 string 類型是二進制安全的。
redis string 能夠包含任何數據。包括 jpg 圖片或者序列化的對象。
最大上限是 1G 字節。
若是隻用 string 類型, redis 就能夠被看做加上持久化特性的 memcached
 
String 相關命令
•set key value 設置key對應的值爲string類型的value,返回1表示成功,0失敗
•setnx key value 同上,若是key已經存在,返回0 。nx 是not exist的意思
•get key 獲取key對應的string值,若是key不存在返回nil
•getset key value  設置key的值,並返回key的舊值。若是key不存在返回nil
•mget key1 key2 ... keyN 一次獲取多個key的值,若是對應key不存在,則對應返回nil。下面是個實驗, nonexisting不存在,對應返回nil
•mset key1 value1 ... keyN valueN 一次設置多個key的值,成功返回1表示全部的值都設置了,失敗返回0表示沒有任何值被設置
•msetnx key1 value1 ... keyN valueN 同上,可是不會覆蓋已經存在的key
•incr key 對key的值作加加操做,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key爲1
•decr key 同上,可是作的是減減操做,decr一個不存在key,則設置key爲-1
•incrby key integer 同incr,加指定值 ,key不存在時候會設置key,並認爲原來的value是 0
decrby key integer 同decr,減指定值。decrby徹底是爲了可讀性,咱們徹底能夠經過incrby一個負值來實現一樣效果,反之同樣。
append key value  給指定key的字符串值追加value,返回新字符串值的長度。
•substr key start end 返回截取過的key的字符串值,注意並不修改key的值。下標是從0開始的。
 
List
redis list 類型其實就是一個每一個子元素都是 string 類型的雙向鏈表。咱們能夠經過 push,pop 操做從鏈表的頭部或者尾部添加刪除元素。這使得 list 既能夠用做棧,也能夠用做隊列。
list pop 操做還有阻塞版本的。當咱們 [ lr ]pop 一個 list 對象是,若是 list 是空,或者不存在,會當即返回 nil 。可是阻塞版本的 b[ lr ]pop 能夠則能夠阻塞,固然能夠加超時時間,超時後也會返回 nil 。爲何要阻塞版本的 pop 呢,主要是爲了不輪詢。舉個簡單的例子若是咱們用 list 來實現一個工做隊列。執行任務的 thread 能夠調用阻塞版本的 pop 去獲取任務這樣就能夠避免輪詢去檢查是否有任務存在。當任務來時候工做線程能夠當即返回,也能夠避免輪詢帶來的延遲。 
 
List相關命令
 
•lpush key string 在key對應list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list類型
•rpush key string 同上,在尾部添加
•llen key 返回key對應list的長度,key不存在返回0,若是key對應類型不是list返回錯誤
•lrange key start end 返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素 ,key不存在返回空列表
•ltrim key start end  截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤
•lset key index value 設置list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤
•lrem key count value 從key對應list中刪除count個和value相同的元素。count爲0時候刪除所有
lpop key 從list的頭部刪除元素,並返回刪除元素。若是key對應list不存在或者是空返回nil,若是key對應值不是list返回錯誤
•rpop 同上,可是從尾部刪除
•blpop key1...keyN timeout 從左到右掃描返回對第一個非空list進行lpop操做並返回,好比blpop list1 list2 list3 0 ,若是list不存在,list2,list3都是非空則對list2作lpop並返回從list2中刪除的元素。若是全部的list都是空或不存在,則會阻塞timeout秒,timeout爲0表示一直阻塞。
當阻塞時,若是有client對key1...keyN中的任意key進行push操做,則第一在這個key上被阻塞的client會當即返回。若是超時發生,則返回nil。
•brpop 同blpop,一個是從頭部刪除一個是從尾部刪除
•rpoplpush srckey destkey 從srckey對應list的尾部移除元素並添加到destkey對應list的頭部,最後返回被移除的元素值,整個操做是原子的.若是srckey是空
或者不存在返回nil
 
Set
redis set string 類型的無序集合。
set 元素最大能夠包含 (2 32 次方 -1) 個元素。
set 的是經過 hash table 實現的, hash table 會隨着添加或者刪除自動的調整大小
關於 set 集合類型除了基本的添加刪除操做,其餘有用的操做還包含集合的取並集 (union) ,交集 (intersection) ,差集 (difference) 。經過這些操做能夠很容易的實現 sns 中的好友推薦和 blog tag 功能。
 
Set相關命令
•sadd key member 添加一個string元素到,key對應的set集合中,成功返回1,若是元素以及在集合中返回0,key對應的set不存在返回錯誤
•srem key member 從key對應set中移除給定元素,成功返回1,若是member在集合中不存在或者key不存在返回0,若是key對應的不是set類型的值返回錯誤
•spop key 刪除並返回key對應set中隨機的一個元素,若是set是空或者key不存在返回nil
•srandmember key 同spop,隨機取set中的一個元素,可是不刪除元素
•smove srckey dstkey member 從srckey對應set中移除member並添加到dstkey對應set中,整個操做是原子的。成功返回1,若是member在srckey中不存在返回0,若是key不是set類型返回錯誤
•scard key 返回set的元素個數,若是set是空或者key不存在返回0
•sismember key member 判斷member是否在set中,存在返回1,0表示不存在或者key不存在
•sinter key1 key2...keyN 返回全部給定key的交集
•sinterstore dstkey key1...keyN 同sinter,可是會同時將交集存到dstkey下
•sunion key1 key2...keyN 返回全部給定key的並集
•sunionstore dstkey key1...keyN 同sunion,並同時保存並集到dstkey下
•sdiff key1 key2...keyN 返回全部給定key的差集
•sdiffstore dstkey key1...keyN 同sdiff,並同時保存差集到dstkey下
•smembers key 返回key對應set的全部元素,結果是無序的
 
Sorted set
set 同樣 sorted set 也是 string 類型元素的集合,不一樣的是每一個元素都會關聯一個 double 類型的 score sorted set 的實現是 skip list hash table 的混合體。當元素被添加到集合中時,一個元素到 score 的映射被添加到 hash table 中,另外一個 score 到元素的映射被添加到 skip list
並按照 score 排序,因此就能夠有序的獲取集合中的元素。
Sorted set 相關命令
•zadd key score member 添加元素到集合,元素在集合中存在則更新對應score
•zrem key member 刪除指定元素,1表示成功,若是元素不存在返回0
•zincrby key incr member 增長對應member的score值,而後移動元素並保持skip list有序。返回更新後的score值
•zrank key member 返回指定元素在集合中的排名(下標,非score),集合中元素是按score從小到大排序的
•zrevrank key member 同上,可是集合中元素是按score從大到小排序
•zrange key start end 相似lrange操做從集合中取指定區間的元素。返回的是有序結果
•zrevrange key start end 同上,返回結果是按score逆序的
•zrangebyscore key min max 返回集合中score在給定區間的元素
•zcount key min max 返回集合中score在給定區間的數量
•zcard key 返回集合中元素個數
•zscore key element  返回給定元素對應的score
•zremrangebyrank key min max 刪除集合中排名在給定區間的元素
•zremrangebyscore key min max 刪除集合中score在給定區間的元素
 
Hash
redis hash 是一個 string 類型的 field value 的映射表。
hash 特別適合用於存儲對象。相較於將對象的每一個字段存成單個 string 類型。將一個對象存儲在 hash 類型中會佔用更少的內存,而且能夠更方便的存取整個對象。
Hash相關命令
•hset key field value 設置hash field爲指定值,若是key不存在,則先建立
•hget key field  獲取指定的hash field
•hmget key filed1....fieldN 獲取所有指定的hash filed
•hmset key filed1 value1 ... filedN valueN 同時設置hash的多個field
•hincrby key field integer 將指定的hash filed 加上給定值
•hexists key field 測試指定field是否存在
•hdel key field 刪除指定的hash field
•hlen key 返回指定hash的field數量
•hkeys key 返回hash的全部field
•hvals key 返回hash的全部value
hgetall 返回hash的全部filed和value
相關文章
相關標籤/搜索