redis/memcache

內存數據庫

就是將數據放在內存中進行直接操作的數據庫;

特點:

--數據緩存、並行操作

--高性能、高速的內存讀寫速度

--多位主拷貝、輔助主數據庫

--數據存在內存中,易丟失


內存數據庫產品

商業(通用級內存數據庫)

--Oracle Timesten

--Altbase

--eXtremDb

開源(分佈式緩存系統,KEY/VALUE操作)

--Mecache,Memcachedb(新浪)

--Redis

--Dbcached(Memcached+持久化存儲管理)

--Tbstore(淘寶實現的高性能、分佈式的基於Berkerley DB緩存系統)

其他:

--內存表

傳統數據庫提供的內存表,如:sqlite,mysql臨時表和內存表

Memcache是什麼?Memcache常見操作命令?Memcache分佈式?Memcache單點問題?

一、

Memcache作爲一個高性能的分佈式內存對象緩存系統,通過在內存維護一個統一的巨大的hash表,存儲數據,使用key/value的形式,存取速度非常快;

Memcache是項目,memcached是運行的程序名稱。

二、

使用方式:可以通過telnet;各種語言的api:java/c++/php/c#/python/ruby/lua等。

常用命令操作:

command <key> <flag><exprtime> <bytes>\r\n <values>\r\n

--key:客戶端需要保存的數據key;

--flags:16位的無符號整數,客戶端可將此標誌用特舒用途;

--exprtie:過期時間,0表示永不國企

--bytes:需要存儲的字節數,不包括"\r\n"

--values:存儲的數據

command包括:

-set:存數據,key不存在則添加;存在則更新

-add:存在則不處理,不存在添加

-replace:存在則替換

-get:獲取數據

-delete:刪除

三、服務器端無分佈式,只管處理數據。

通過客戶端進行分佈式,通過某種分佈式算法(讀/寫的分佈式算法相同)。

四、單點故障

1.通過magent緩存代理,可防止單點現象。緩存代理服務器可以連接多臺memcached機器,可以將每臺memcached機器進行數據同步。如果其中一臺緩存服務器down機,系統仍可繼續工作;

-client+magent+memcached

2.repcached補丁,可實現memcached的數據複製,構建主/從數據庫,目前只支持到memcache1-2.8。repcached是一個單master/slave的方案,master/slave都可讀寫,可互相同步。如果master壞掉,slave偵測到連接斷了,會自動listen成爲master;而如果slave壞掉,master也會偵測到連接斷開,會更新listen等待新的Slave加入。

redis/memcace功能比較:

1.數據類型:Memcache類型單一;Redis有string,list,set,有序集合和HASH;

2.數據大小:Memcache單數據大小不能超過1M;Redis:string上限是1G,列表最大個數是2的32次方

3.過期策略:Redis/Memcache均支持;但是redis需要先set,然後在用expire命令設置,所以是兩次操作,多義詞網絡傳輸。

4.分佈式:Memcache由客戶端實現僞分佈式;Redis:有客戶端支持;

5.單點容錯:Memcache可用magent做一主多從;Redis支持:Master-Slave,一主一從或一主多從;

6.持久化:Memcache不支持;Redis支持持久化。兩種持久化的方式。

併發操作控制:

一、Memcache在1.2.4版本增加了CAS(Check and Set)協議,處理同一個item被多個線程更改過程的併發問題:

--每個key關聯一個版本號,客戶端讀key時,版本值也返回給客戶端。當多個客戶端更新key的值時,會判斷提交的版本值是否與server上的版本值一致,一致則更新成功,否則不成功。

--兩種情況下這個版本數值會增加1:1.新增一個key-value時;2.對某個已存key對應的value值更新成功;

二、Redis服務器端由於是單線程的,所有客戶端發送的命令在服務器端都是串行執行,所以不存在併發控制的問題。

性能問題:

多種觀點:

--Redis讀寫內存比Memcache快

--Memcache讀寫內存比Redis快

--Memcache讀寫內存比redis快,但是Redis整體性能優於Memcache

不必過多關心性能,二者的性能都非常高。在存儲小數據上,Redis性能比Memcache高。而在100K以上的數據中,Memcache性能優於Redis。無論使用哪一個,每秒處理請求的次數,都不會成爲瓶頸。

在選擇上,性能不是主要考慮因素,更多的是要考慮存儲的數據需求。

沒有最終的結論,到底哪個更快。主要是跟業務相結合。

問題:

在大併發的場合,當cache失效時,大量併發同時取不到cache時,會同一時間去訪問DB並設置cache,特別當DB的操作比較費時時,給系統造成很大的壓力。

可以將將第一個訪問key或者設置key的操作,設置鎖,然後操作完成後,將value寫到內存中,而且其他線程的操作,由於設置了鎖,無法對其進行操作;在第一個線程獲取完數據後,value已經在內存中,所以其他線程可以直接獲取到數據,而不需要去訪問db。降低後端的壓力。


1.memcahce對於變量的自增操作時,需要在使用前先判斷變量是否存在;而redis使用時,如果變量不存在,則默認爲初始值爲0.


協議;

libevent處理網絡連接;

服務器互相不通信的分佈式:分佈式的實現完全取決於客戶端;

內置內存存儲方式;

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