Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工做由VMware主持。
mysql
redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都 支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排 序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文 件,而且在此基礎上實現了master-slave(主從)同步
redis
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合能夠對關係數據庫起到很好的補充做用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便算法
Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹復 制。存盤能夠有意無心的對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈 記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助sql
redis提供五種數據類型:string,hash,list,set及zset(sorted set)數據庫
string(字符串)編程
string是最簡單的類型,你能夠理解成與Memcached如出一轍的類型,一個key對應一個value,其上支持的操做與Memcached的操做相似。但它的功能更豐富。數組
redis採用結構sdshdr和sds封裝了字符串,字符串相關的操做實如今源文件sds.h/sds.c中。緩存
數據結構定義以下:安全
1服務器 2 3 4 5 6 |
|
list(雙向鏈表)
list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的全部值等等。操做中key理解爲鏈表的名字。
對list的定義和實如今源文件adlist.h/adlist.c,相關的數據結構定義以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
dict(hash表)
set是集合,和咱們數學中的集合概念類似,對集合的操做有添加刪除元素,有對多個集合求交併差等操做。操做中key理解爲集合的名字。
在源文件dict.h/dict.c中實現了hashtable的操做,數據結構的定義以下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
dict中table爲dictEntry指針的數組,數組中每一個成員爲hash值相同元素的單向鏈表。set是在dict的基礎上實現的,指定了key的比較函數爲dictEncObjKeyCompare,若key相等則再也不插入。
zset(排序set)
zset是set的一個升級版本,他在set的基礎上增長了一個順序屬性,這一屬性在添加修改元素的時候能夠指定,每次指定後,zset會自動從新按新的值調整順序。能夠理解了有兩列的mysql表,一列存value,一列存順序。操做中key理解爲zset的名字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
zset利用dict維護key -> value的映射關係,用zsl(zskiplist)保存value的有序關係。zsl實際是叉數
不穩定的多叉樹,每條鏈上的元素從根節點到葉子節點保持升序排序。
就DB來講,Redis成績已經很驚人了,且不說memcachedb和Tokyo Cabinet之流,就說原版的memcached,速度彷佛也只能達到這個級別。Redis根本是使用內存存儲,持久化的關鍵是這三條指令:SAVE BGSAVE LASTSAVE …
當接收到SAVE指令的時候,Redis就會dump數據到一個文件裏面。
值得一說的是它的獨家功能:存儲列表和集合,這是它與mc之流相比更有競爭力的地方。
不介紹mc裏面已經有的東東,只列出特殊的:
TYPE key — 用來獲取某key的類型
KEYS pattern — 匹配全部符合模式的key,好比KEYS * 就列出全部的key了,固然,複雜度O(n)
RANDOMKEY - 返回隨機的一個key
RENAME oldkeynewkey— key也能夠更名
列表操做,精華
RPUSH key string — 將某個值加入到一個key列表末尾
LPUSH key string — 將某個值加入到一個key列表頭部
LLEN key — 列表長度
LRANGE key start end — 返回列表中某個範圍的值,至關於mysql裏面的分頁查詢那樣
LTRIM key start end — 只保留列表中某個範圍的值
LINDEX key index — 獲取列表中特定索引號的值,要注意是O(n)複雜度
LSET key index value — 設置列表中某個位置的值
LPOP key
RPOP key — 和上面的LPOP同樣,就是相似棧或隊列的那種取頭取尾指令,能夠當成消息隊列來使用了
集合操做
SADD key member — 增長元素
SREM key member — 刪除元素
SCARD key — 返回集合大小
SISMEMBER key member — 判斷某個值是否在集合中
SINTER key1 key2 ... keyN — 獲取多個集合的交集元素
SMEMBERS key — 列出集合的全部元素
還有Multiple DB的命令,能夠更換db,數據能夠隔離開,默認是存放在DB 0。
redis使用了兩種文件格式:全量數據和增量請求。
全量數據格式是把內存中的數據寫入磁盤,便於下次讀取文件進行加載;
增量請求文件則是把內存中的數據序列化爲操做請求,用於讀取文件進行replay獲得數據,序列化的操做包括SET、RPUSH、SADD、ZADD。
redis的存儲分爲內存存儲、磁盤存儲和log文件三部分,配置文件中有三個參數對其進行配置。
save seconds updates,save配置,指出在多長時間內,有多少次更新操做,就將數據同步到數據文件。這個能夠多個條件配合,好比默認配置文件中的設置,就設置了三個條件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操做後進行日誌記錄,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於redis自己同步數據 文件是按上面的save條件來同步的,因此有的數據會在一段時間內只存在於內存中。
appendfsync no/always/everysec ,appendfsync配置,no表示等操做系統進行數據緩存同步到磁盤,always表示每次更新操做後手動調用fsync()將數據寫到磁盤,everysec表示每秒同步一次。
獲取源碼、解壓、進入源碼目錄
使用wget工具等下載:
wget (百度不讓用連接)
tar xzf redis-1.2.6.tar.gz
cd redis-1.2.6。
編譯生成可執行文件
因爲makefile文件已經寫好,咱們只須要直接在源碼目錄執行make命令進行編譯便可:
make
make-test
sudo make install
make命令執行完成後,會在當前目錄下生成本個可執行文件,分別是redis-server、redis-cli、redis-benchmark、redis-stat,它們的做用以下:
redis-server:Redis服務器的daemon啓動程序
redis-cli:Redis命令行操做工具。固然,你也能夠用telnet根據其純文本協議來操做
redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
redis-stat:Redis狀態檢測工具,能夠檢測Redis當前狀態參數及延遲情況。
創建Redis目錄(非必須)
這個過程不是必須的,只是爲了將Redis相關的資源統一管理而進行的操做。
執行如下命令創建相關目錄並拷貝相關文件至目錄中:
sudo -s
mkdir -p /usr/local/redis/bin
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/var
cp redis-server redis-cli redis-benchmark redis-stat /usr/local/redis/bin/
cp redis.conf /usr/local/redis/etc/
配置參數
在咱們成功安裝Redis後,咱們直接執行redis-server便可運行Redis,此時它是按照默認配置來運行的(默認配置甚至不是後臺運 行)。咱們但願Redis按咱們的要求運行,則咱們須要修改配置文件,Redis的配置文件就是咱們上面第二個cp操做的redis.conf文件,它被 咱們拷貝到了/usr/local/redis/etc/目錄下。修改它就能夠配置咱們的server了。如何修改?下面是redis.conf的主要配 置參數的意義:
daemonize:是否以後臺daemon方式運行
pidfile:pid文件位置
port:監聽的端口號
timeout:請求超時時間
loglevel:log信息級別
logfile:log文件位置
databases:開啓數據庫的數量
save * *:保存快照的頻率,第一個*表示多長時間,第二個*表示執行多少次寫操做。在必定時間內執行必定數量的寫操做時,自動保存快照。可設置多個條件。
rdbcompression:是否使用壓縮
dbfilename:數據快照文件名(只是文件名,不包括目錄)
dir:數據快照的保存目錄(這個是目錄)
appendonly:是否開啓appendonlylog,開啓的話每次寫操做會記一條log,這會提升數據抗風險能力,但影響效率。
appendfsync:appendonlylog如何同步到磁盤(三個選項,分別是每次寫都強制調用fsync、每秒啓用一次fsync、不調用fsync等待系統本身同步)
下面是一個略作修改後的配置文件內容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
將上面內容寫爲redis.conf並保存到/usr/local/redis/etc/目錄下
而後在命令行執行:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
便可在後臺啓動redis服務,這時你經過
telnet127.0.0.16379
便可鏈接到你的redis服務
Redis經常使用內存優化手段與參數
經過咱們上面的一些實現上的分析能夠看出redis實際上的內存管理成本很是高,即佔用了過多的內存,做者對這點也很是清楚,因此提供了一系列的參數和手段來控制和節省內存,咱們分別來討論下。
首先最重要的一點是不要開啓Redis的VM選項,即虛擬內存功能,這個原本是做爲Redis存儲超出物理內存數據的一種數據在內存與磁盤換入換出的一 個持久化策略,可是其內存管理成本也很是的高,而且咱們後續會分析此種持久化策略並不成熟,因此要關閉VM功能,請檢查你的redis.conf文件中 vm-enabled 爲 no。
其次最好設置下redis.conf中的maxmemory選項,該選項是告訴Redis當使用了多少物理內存後就開始拒絕後續的寫入請求,該參數能很好的保護好你的Redis不會由於使用了過多的物理內存而致使swap,最終嚴重影響性能甚至崩潰。
另外Redis爲不一樣數據類型分別提供了一組參數來控制內存使用,咱們在前面詳細分析過Redis Hash是value內部爲一個HashMap,若是該Map的成員數比較少,則會採用相似一維線性的緊湊格式來存儲該Map, 即省去了大量指針的內存開銷,這個參數控制對應在redis.conf配置文件中下面2項:
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
hash-max-zipmap-entries
含義是當value這個Map內部不超過多少個成員時會採用線性緊湊格式存儲,默認是64,即value內部有64個如下的成員就是使用線性緊湊存儲,超過該值自動轉成真正的HashMap。
hash-max-zipmap-value 含義是當 value這個Map內部的每一個成員值長度不超過多少字節就會採用線性緊湊存儲來節省空間。
以上2個條件任意一個條件超過設置值都會轉換成真正的HashMap,也就不會再節省內存了,那麼這個值是否是設置的越大越好呢,答案固然是否認 的,HashMap的優點就是查找和操做的時間複雜度都是O(1)的,而放棄Hash採用一維存儲則是O(n)的時間複雜度,若是
成員數量不多,則影響不大,不然會嚴重影響性能,因此要權衡好這個值的設置,整體上仍是最根本的時間成本和空間成本上的權衡。
一樣相似的參數
list-max-ziplist-entries 512
說明:list數據類型多少節點如下會採用去指針的緊湊存儲格式。
list-max-ziplist-value 64
說明:list數據類型節點值大小小於多少字節會採用緊湊存儲格式。
set-max-intset-entries 512
說明:set數據類型內部數據若是所有是數值型,且包含多少節點如下會採用緊湊格式存儲。
最後想說的是Redis內部實現沒有對內存分配方面作過多的優化,在必定程度上會存在內存碎片,不過大多數狀況下這個不會成爲Redis的性能瓶頸,不 過若是在Redis內部存儲的大部分數據是數值型的話,Redis內部採用了一個shared integer的方式來省去分配內存的開銷,即在系統啓動時先分配一個從1~n 那麼多個數值對象放在一個池子中,若是存儲的數據剛好是這個數值範圍內的數據,則直接從池子裏取出該對象,而且經過引用計數的方式來共享,這樣在系統存儲 了大量數值下,也能必定程度上節省內存而且提升性能,這個參數值n的設置須要修改源代碼中的一行宏定義REDIS_SHARED_INTEGERS,該值 默認是10000,能夠根據本身的須要進行修改,修改後從新編譯就能夠了。
另外redis 的6種過時策略redis 中的默認的過時策略是volatile-lru 。設置方式
config set maxmemory-policy volatile-lru
maxmemory-policy 六種方式
volatile-lru:只對設置了過時時間的key進行LRU(默認值)
allkeys-lru : 是從全部key裏 刪除 不常用的key
volatile-random:隨機刪除即將過時key
allkeys-random:隨機刪除
volatile-ttl : 刪除即將過時的
noeviction : 永不過時,返回錯誤
maxmemory-samples 3 是說每次進行淘汰的時候 會隨機抽取3個key 從裏面淘汰最不常用的(默認選項)
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