內存數據庫
就是將數據放在內存中進行直接操作的數據庫;
特點:
--數據緩存、並行操作
--高性能、高速的內存讀寫速度
--多位主拷貝、輔助主數據庫
--數據存在內存中,易丟失
內存數據庫產品
商業(通用級內存數據庫)
--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處理網絡連接;
服務器互相不通信的分佈式:分佈式的實現完全取決於客戶端;
內置內存存儲方式;