Redis相關知識
Redis 存儲的五種
字符串類型:string
散列類型: hash
列表類型: list
集合類型: set
有序集合類型: SortedSet
Redis與數據庫比較
mysql是持久化存儲,存放在磁盤裏面,檢索的話,會涉及到一定的IO,為了解決這個瓶頸,於是出現了緩存,比如現在用的最多的 memcached(簡稱mc)。首先,用戶訪問mc,如果未命中,就去訪問mysql,之後像內存和硬盤一樣,把數據復制到mc一部分。
redis和mc都是緩存,並且都是駐留在內存中運行的,這大大提升了高數據量web訪問的訪問速度。然而mc只是提供了簡單的數據結構,比如 string存儲;redis卻提供了大量的數據結構,比如string、list、set、hashset、sorted set這些,這使得用戶方便了好多,畢竟封裝了一層實用的功能,同時實現了同樣的效果,當然用redis而慢慢舍棄mc。
內存和硬盤的關系,硬盤放置主體數據用於持久化存儲,而內存則是當前運行的那部分數據,CPU訪問內存而不是磁盤,這大大提升了運行的速度,當然這是基於程序的局部化訪問原理。
推理到redis+mysql,它是內存+磁盤關系的一個映射,mysql放在磁盤,redis放在內存,這樣的話,web應用每次只訪問redis,如果沒有找到的數據,才去訪問Mysql。
然而redis+mysql和內存+磁盤的用法最好是不同的。
前者是內存數據庫,數據保存在內存中,當然速度快。
後者是關系型數據庫,功能強大,數據訪問也就慢。
像memcache,mongoDB,Redis,都屬於No sql系列。
訪問速度:redis把數據存放在內存中快,mysql把數據存放在硬盤中速度慢
訪問容量:mysql存放的數量大於redis,redis要做好容量預估
redis持久化不如mysql,重要的數據存在mysql中,那些讀寫頻繁的熱數據放在redis中
使用緩存框架的時候,我們需要關心的就是什麽時候創建緩存和緩存失效策略。
Memcache和redis對比:
1.性能上:
性能上都很出色,具體到細節,由於Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,但是比起 Memcached,還是稍有遜色。
2.內存空間和數據量大小:
MemCached可以修改最大內存,采用LRU算法。Redis增加了VM的特性,突破了物理內存的限制。
3.操作便利上:
MemCached數據結構單一,僅用來緩存數據,而Redis支持更加豐富的數據類型,也可以在服務器端直接對數據進行豐富的操作,這樣可以減少網絡IO次數和數據體積。
4.可靠性上:
MemCached不支持數據持久化,斷電或重啟後數據消失,但其穩定性是有保證的。Redis支持數據持久化和數據恢復,允許單點故障,但是同時也會付出性能的代價。
5.應用場景:
Memcached:動態系統中減輕數據庫負載,提升性能;做緩存,適合多讀少寫,大數據量的情況(如人人網大量查詢用戶信息、好友信息、文章信息等)。
Redis:適用於對讀寫效率要求都很高,數據處理業務復雜和對安全性要求較高的系統(如新浪微博的計數和微博發布部分系統,對數據安全性、讀寫要求都很高)。
redis 單線程還是多線程?
Redis采用的是基於內存的采用的是單進程單線程模型的KV數據庫,由C語言編寫。官方提供的數據是可以達到100000+的qps。這個數據不比采用單進程多線程的同樣基於內存的KV數據庫Memcached差。
- 多進程單線程模型:Nginx
- 單進程多線程模型:Memcached
Redis快的主要原因是:
- 完全基於內存
- 數據結構簡單,對數據操作也簡單
- 使用多路 I/O 復用模型
單進程單線程好處
- 代碼更清晰,處理邏輯更簡單
- 不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗
- 不存在多進程或者多線程導致的切換而消耗CPU
- 無法發揮多核CPU性能,不過可以通過在單機開多個Redis實例來完善;
單進程單線程弊端
- 無法發揮多核CPU性能,不過可以通過在單機開多個Redis實例來完善;
參考:https://www.cnblogs.com/syyong/p/6231326.html
Redis相關知識