Redis相比memcached有哪些優勢?
(1) memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數據類型
(2) redis的速度比memcached快很多
(3) redis可以持久化其數據
Redis支持哪幾種數據類型?
String、List、Set、Sorted Set、hashes
Redis集群方案應該怎么做?都有哪些方案?
1.twemproxy,大概概念是,它類似於一個代理方式,使用方法和普通redis無任何區別,設置好它下屬的多個redis實例后,使用時在本需要連接redis的地方改為連接twemproxy,它會以一個代理的身份接收請求並使用一致性hash算法,將請求轉接到具體redis,將結果再返回twemproxy。使用方式簡便(相對redis只需修改連接端口),對舊項目擴展的首選。 問題:twemproxy自身單端口實例的壓力,使用一致性hash后,對redis節點數量改變時候的計算值的改變,數據無法自動移動到新的節點。
Redis回收使用的是什么算法?
LRU算法
為什么要做Redis分區?
分區可以讓Redis管理更大的內存,Redis將可以使用所有機器的內存。如果沒有分區,你最多只能使用一台機器的內存。分區使Redis的計算能力通過簡單地增加計算機得到成倍提升,Redis的網絡帶寬也會隨着計算機和網卡的增加而成倍增長。
Redis的內存占用情況怎么樣?
給你舉個例子: 100萬個鍵值對(鍵是0到999999值是字符串“hello
world”)在我的32位的Mac筆記本上 用了100MB。同樣的數據放到一個key里只需要16MB, 這是因為鍵值有一個很大的開銷。 在Memcached上執行也是類似的結果,但是相對Redis的開銷要小一點點,因為Redis會記錄類型信息引用計數等等。
Memcached服務特點及工作原理是什么?
a、完全基於內存緩存的
b、節點之間相互獨立
c、C/S模式架構,C語言編寫,總共2000行代碼。
d、異步I/O 模型,使用libevent作為事件通知機制。
e、被緩存的數據以key/value鍵值對形式存在的。
f、全部數據存放於內存中,無持久性存儲的設計,重啟服務器,內存里的數據會丟失。
g、當內存中緩存的數據容量達到啟動時設定的內存值時,就自動使用LRU算法刪除過期的緩存數據。
h、可以對存儲的數據設置過期時間,這樣過期后的數據自動被清除,服務本身不會監控過期,而是在訪問的時候查看key的時間戳,判斷是否過期。
j、memcache會對設定的內存進行分塊,再把塊分組,然后再提供服務。
如何實現集群中的session共享存儲?
Session是運行在一台服務器上的,所有的訪問都會到達我們的唯一服務器上,這樣我們可以根據客戶端傳來的sessionID,來獲取session,或在對應Session不存在的情況下(session 生命周期到了/用戶第一次登錄),創建一個新的Session;但是,如果我們在集群環境下,假設我們有兩台服務器A,B,用戶的請求會由Nginx服務器進行轉發(別的方案也是同理),用戶登錄時,Nginx將請求轉發至服務器A上,A創建了新的session,並將SessionID返回給客戶端,用戶在瀏覽其他頁面時,客戶端驗證登錄狀態,Nginx將請求轉發至服務器B,由於B上並沒有對應客戶端發來sessionId的session,所以會重新創建一個新的session,並且再將這個新的sessionID返回給客戶端,這樣,我們可以想象一下,用戶每一次操作都有1/2的概率進行再次的登錄,這樣不僅對用戶體驗特別差,還會讓服務器上的session激增,加大服務器的運行壓力。
為了解決集群環境下的seesion共享問題,共有4種解決方案:
1.粘性session
粘性session是指Ngnix每次都將同一用戶的所有請求轉發至同一台服務器上,即將用戶與服務器綁定。
2.服務器session復制
即每次session發生變化時,創建或者修改,就廣播給所有集群中的服務器,使所有的服務器上的session相同。
3.session共享
緩存session,使用redis, memcached。
4.session持久化
將session存儲至數據庫中,像操作數據一樣才做session。
memcached與redis的區別?
1、Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。而memcache只支持簡單數據類型,需要客戶端自己處理復雜對象
2、Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用(PS:持久化在rdb、aof)。
3、由於Memcache沒有持久化機制,因此宕機所有緩存數據失效。Redis配置為持久化,宕機重啟后,將自動加載宕機時刻的數據到緩存系統中。具有更好的災備機制。
4、Memcache可以使用Magent在客戶端進行一致性hash做分布式。Redis支持在服務器端做分布式(PS:Twemproxy/Codis/Redis-cluster多種分布式實現方式)
5、Memcached的簡單限制就是鍵(key)和Value的限制。最大鍵長為250個字符。可以接受的儲存數據不能超過1MB(可修改配置文件變大),因為這是典型slab 的最大值,不適合虛擬機使用。而Redis的Key長度支持到512k。
6、Redis使用的是單線程模型,保證了數據按順序提交。Memcache需要使用cas保證數據一致性。CAS(Check and Set)是一個確保並發一致性的機制,屬於“樂觀鎖”范疇;原理很簡單:拿版本號,操作,對比版本號,如果一致就操作,不一致就放棄任何操作
cpu利用。由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更 高。而在100k以上的數據中,Memcached性能要高於Redis 。
7、memcache內存管理:使用Slab Allocation。原理相當簡單,預先分配一系列大小固定的組,然后根據數據大小選擇最合適的塊存儲。避免了內存碎片。(缺點:不能變長,浪費了一定空間)memcached默認情況下下一個slab的最大值為前一個的1.25倍。
8、redis內存管理: Redis通過定義一個數組來記錄所有的內存分配情況, Redis采用的是包裝的malloc/free,相較於Memcached的內存 管理方法來說,要簡單很多。由於malloc 首先以鏈表的方式搜索已管理的內存中可用的空間分配,導致內存碎片比較多