Redis數(shù)據(jù)庫的相關介紹

2016年11月14日04:32:37 發(fā)表評論 3,850 ℃

Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡、可基于內存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。從2010年3月15日起,Redis的開發(fā)工作由VMware主持。從2013年5月開始,Redis的開發(fā)由Pivotal贊助。

Redis數(shù)據(jù)庫的定義

redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內存中。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現(xiàn)了master-slave(主從)同步。

Redis 是一個高性能的key-value數(shù)據(jù)庫。 redis的出現(xiàn),很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系數(shù)據(jù)庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。  

Redis支持主從同步。數(shù)據(jù)可以從主服務器向任意數(shù)量的從服務器上同步,從服務器可以是關聯(lián)其他從服務器的主服務器。這使得Redis可執(zhí)行單層樹復制。存盤可以有意無意的對數(shù)據(jù)進行寫操作。由于完全實現(xiàn)了發(fā)布/訂閱機制,使得從數(shù)據(jù)庫在任何地方同步樹時,可訂閱一個頻道并接收主服務器完整的消息發(fā)布記錄。同步對讀取操作的可擴展性和數(shù)據(jù)冗余很有幫助。

redis的官網(wǎng)地址,非常好記,是redis.io。(特意查了一下,域名后綴io屬于國家域名,是british Indian Ocean territory,即英屬印度洋領地)

目前,Vmware在資助著redis項目的開發(fā)和維護。

Redis數(shù)據(jù)庫的作者

redis 的作者,叫Salvatore Sanfilippo,來自意大利的西西里島,現(xiàn)在居住在卡塔尼亞。目前供職于Pivotal公司。他使用的網(wǎng)名是antirez。

Redis數(shù)據(jù)庫的性能

下面是官方的bench-mark數(shù)據(jù):

測試完成了50個并發(fā)執(zhí)行100000個請求。

設置和獲取的值是一個256字節(jié)字符串。

Linux box是運行Linux 2.6,這是X3320 Xeon 2.5 ghz。

文本執(zhí)行使用loopback接口(127.0.0.1)。

結果:讀的速度是110000次/s,寫的速度是81000次/s 。

Redis數(shù)據(jù)庫支持語言

許多語言都包含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數(shù)據(jù)庫的常用命令

就DB來說,Redis成績已經(jīng)很驚人了,且不說memcachedb和Tokyo Cabinet之流,就說原版的memcached,速度似乎也只能達到這個級別。Redis根本是使用內存存儲,持久化的關鍵是這三條指令:SAVE BGSAVE LASTSAVE …

當接收到SAVE指令的時候,Redis就會dump數(shù)據(jù)到一個文件里面。

值得一說的是它的獨家功能:存儲列表和集合,這是它與mc之流相比更有競爭力的地方。

不介紹mc里面已經(jīng)有的東東,只列出特殊的:

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一樣,就是類似?;蜿犃械哪欠N取頭取尾指令,可以當成消息隊列來使用了

集合操作

SADD key member — 增加元素

SREM key member — 刪除元素

SCARD key — 返回集合大小

SISMEMBER key member — 判斷某個值是否在集合中

SINTER key1 key2 ... keyN — 獲取多個集合的交集元素

SMEMBERS key — 列出集合的所有元素

還有Multiple DB的命令,可以更換db,數(shù)據(jù)可以隔離開,默認是存放在DB 0。

Redis數(shù)據(jù)庫的數(shù)據(jù)模型

Redis的外圍由一個鍵、值映射的字典構成。與其他非關系型數(shù)據(jù)庫主要不同在于:Redis中值的類型不僅限于字符串,還支持如下抽象數(shù)據(jù)類型:

·字符串列表

·無序不重復的字符串集合

·有序不重復的字符串集合

·鍵、值都為字符串的哈希表

值的類型決定了值本身支持的操作。Redis支持不同無序、有序的列表,無序、有序的集合間的交集、并集等高級服務器端原子操作。

Redis數(shù)據(jù)庫的數(shù)據(jù)結構

redis提供五種數(shù)據(jù)類型:string,hash,list,set及zset(sorted set)。

string(字符串)

string是最簡單的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value,其上支持的操作與Memcached的操作類似。但它的功能更豐富。

redis采用結構sdshdr和sds封裝了字符串,字符串相關的操作實現(xiàn)在源文件sds.h/sds.c中。

list(雙向鏈表)

list是一個鏈表結構,主要功能是push、pop、獲取一個范圍的所有值等等。操作中key理解為鏈表的名字。

對list的定義和實現(xiàn)在源文件adlist.h/adlist.c

dict(hash表)

set是集合,和我們數(shù)學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交并差等操作。操作中key理解為集合的名字。

在源文件dict.h/dict.c中實現(xiàn)了hashtable的操作

dict中table為dictEntry指針的數(shù)組,數(shù)組中每個成員為hash值相同元素的單向鏈表。set是在dict的基礎上實現(xiàn)的,指定了key的比較函數(shù)為dictEncObjKeyCompare,若key相等則不再插入。

zset(排序set)

zset是set的一個升級版本,他在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定后,zset會自動重新按新的值調整順序??梢岳斫饬擞袃闪械膍ysql表,一列存value,一列存順序。操作中key理解為zset的名字。

zset利用dict維護key -> value的映射關系,用zsl(zskiplist)保存value的有序關系。zsl實際是叉數(shù)

不穩(wěn)定的多叉樹,每條鏈上的元素從根節(jié)點到葉子節(jié)點保持升序排序。

Redis數(shù)據(jù)庫的存儲

redis使用了兩種文件格式:全量數(shù)據(jù)和增量請求。

全量數(shù)據(jù)格式是把內存中的數(shù)據(jù)寫入磁盤,便于下次讀取文件進行加載;

增量請求文件則是把內存中的數(shù)據(jù)序列化為操作請求,用于讀取文件進行replay得到數(shù)據(jù),序列化的操作包括SET、RPUSH、SADD、ZADD。

redis的存儲分為內存存儲、磁盤存儲和log文件三部分,配置文件中有三個參數(shù)對其進行配置。

save seconds updates,save配置,指出在多長時間內,有多少次更新操作,就將數(shù)據(jù)同步到數(shù)據(jù)文件。這個可以多個條件配合,比如默認配置文件中的設置,就設置了三個條件。

appendonly yes/no ,appendonly配置,指出是否在每次更新操作后進行日志記錄,如果不開啟,可能會在斷電時導致一段時間內的數(shù)據(jù)丟失。因為redis本身同步數(shù)據(jù)文件是按上面的save條件來同步的,所以有的數(shù)據(jù)會在一段時間內只存在于內存中。

appendfsync no/always/everysec ,appendfsync配置,no表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤,always表示每次更新操作后手動調用fsync()將數(shù)據(jù)寫到磁盤,everysec表示每秒同步一次。

Redis數(shù)據(jù)庫的版本發(fā)布

2012年08月02日,Redis 2.4.16 小更新版本 NoSQL。

2012年08月31日 ,Redis 2.4.17 小更新版本 NoSQL。

2012年11月7日 Redis 2.6.3 發(fā)布,高性能K/V服務器

2013年4月30日Redis 2.6.13 發(fā)布,高性能K/V服務器  

2013年11月25日,Redis 2.8.1發(fā)布。 

2015年2月,Redis3.0.0發(fā)布.

【騰訊云】云服務器、云數(shù)據(jù)庫、COS、CDN、短信等云產品特惠熱賣中

發(fā)表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: