Redis安裝及使用

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   解壓縮

•cdsrc              進入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

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