Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。
Redis數據庫的定義
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹復制。存盤可以有意無意的對數據進行寫操作。由于完全實現了發布/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道并接收主服務器完整的消息發布記錄。同步對讀取操作的可擴展性和數據冗余很有幫助。
redis的官網地址,非常好記,是redis.io。(特意查了一下,域名后綴io屬于國家域名,是british Indian Ocean territory,即英屬印度洋領地)
目前,Vmware在資助著redis項目的開發和維護。
Redis數據庫的作者
redis 的作者,叫Salvatore Sanfilippo,來自意大利的西西里島,現在居住在卡塔尼亞。目前供職于Pivotal公司。他使用的網名是antirez。
Redis數據庫的性能
下面是官方的bench-mark數據:
測試完成了50個并發執行100000個請求。
設置和獲取的值是一個256字節字符串。
Linux box是運行Linux 2.6,這是X3320 Xeon 2.5 ghz。
文本執行使用loopback接口(127.0.0.1)。
結果:讀的速度是110000次/s,寫的速度是81000次/s 。
Redis數據庫支持語言
許多語言都包含Redis支持,包括:
·ActionScript
·C
·C++
·C#
·Clojure
·Common Lisp
·Dart
·Erlang
·Go
·Haskell
·Haxe
·Io
·Java
·Node.js
·Lua
·Objective-C
·Perl
·PHP
·Pure Data
·Python
·R
·Ruby
·Scala
·Smalltalk
·Tcl
Redis數據庫的常用命令
就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數據庫的數據模型
Redis的外圍由一個鍵、值映射的字典構成。與其他非關系型數據庫主要不同在于:Redis中值的類型不僅限于字符串,還支持如下抽象數據類型:
·字符串列表
·無序不重復的字符串集合
·有序不重復的字符串集合
·鍵、值都為字符串的哈希表
值的類型決定了值本身支持的操作。Redis支持不同無序、有序的列表,無序、有序的集合間的交集、并集等高級服務器端原子操作。
Redis數據庫的數據結構
redis提供五種數據類型:string,hash,list,set及zset(sorted set)。
string(字符串)
string是最簡單的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value,其上支持的操作與Memcached的操作類似。但它的功能更豐富。
redis采用結構sdshdr和sds封裝了字符串,字符串相關的操作實現在源文件sds.h/sds.c中。
list(雙向鏈表)
list是一個鏈表結構,主要功能是push、pop、獲取一個范圍的所有值等等。操作中key理解為鏈表的名字。
對list的定義和實現在源文件adlist.h/adlist.c
dict(hash表)
set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交并差等操作。操作中key理解為集合的名字。
在源文件dict.h/dict.c中實現了hashtable的操作
dict中table為dictEntry指針的數組,數組中每個成員為hash值相同元素的單向鏈表。set是在dict的基礎上實現的,指定了key的比較函數為dictEncObjKeyCompare,若key相等則不再插入。
zset(排序set)
zset是set的一個升級版本,他在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定后,zset會自動重新按新的值調整順序。可以理解了有兩列的mysql表,一列存value,一列存順序。操作中key理解為zset的名字。
zset利用dict維護key -> value的映射關系,用zsl(zskiplist)保存value的有序關系。zsl實際是叉數
不穩定的多叉樹,每條鏈上的元素從根節點到葉子節點保持升序排序。
Redis數據庫的存儲
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表示每秒同步一次。
Redis數據庫的版本發布
2012年08月02日,Redis 2.4.16 小更新版本 NoSQL。
2012年08月31日 ,Redis 2.4.17 小更新版本 NoSQL。
2012年11月7日 Redis 2.6.3 發布,高性能K/V服務器
2013年4月30日Redis 2.6.13 發布,高性能K/V服務器
2013年11月25日,Redis 2.8.1發布。
2015年2月,Redis3.0.0發布.


