今天我們來講一講快取
目前,memcache 和 redis 是網際網路分層架構中,最常用的 key/value 快取。
那麼如何選擇呢 ?
下面來看一下兩種快取的比較
redis
mecache
吞吐量十萬左右 qps
達到幾十萬 qps
資料結構
支援多種資料結構,如雜湊,列表,集合,有序集合這類複雜的資料結構
只支援簡單的 key/value 資料結構
持久化1.redis 的定期快照不能保證資料不丟失
2.redis 的 aof 會降低效率,並且不能支援太大的資料量
mecache 無法滿足持久化的需求
高可用redis 天然支援集群功能,可以實現主動複製,讀寫分離
memcache,要想要實現高可用,需要進行二次開發
能儲存的內容大小
儲存的內容比較大,最大為 1m
較小併發量
使用單核
可以使用多核
記憶體分配
redis 是臨時申請空間,可能導致碎片
memcache 使用預分配記憶體池的方式管理記憶體,能夠省去記憶體分配時間
網路模型
非阻塞 io 復用模型,但由於redis還提供一些非kv儲存之外的排序,聚合功能,在執行這些功能時,複雜的cpu計算,會阻塞整個 io 排程
非阻塞 io 復用模型
底層模型
有自己的 vm 機制,理論上能夠儲存比物理記憶體更多的資料,當資料超量時,會引發 swap ,把冷資料刷到磁碟上,會浪費一定的時間去移動和請求
memcache 把所有的資料儲存在物理記憶體裡
總結一下,有持久化需求或者對資料結構和處理有高階要求的應用,選擇redis,其他簡單的 key/value 儲存,選擇 memcache
接下來,我會著重講一下 redis
首先,我們來想一想,redis 為什麼效率這麼高?
簡單概括一下,有下面幾點
1)純記憶體操作,記憶體響應時常大約 100 nm
2)核心是基於非阻塞的 io 多路復用機制,加上reids自身的事件處理模型將 epoll 的連線,讀寫,關閉都轉換為事件。不在網路 io 上浪費時間。
3)單執行緒反而避免了多執行緒的頻繁上下文切換問題
4)c 語言的執行速度更快
那他能用於哪些場景呢?
1.快取,這是最常見的,對於經常需要讀取的資料,可以新增快取
2.排行榜系統, list 和 sortset
4.社交網路,
5訊息佇列系統
6共享 session
7限制訪問
那我們該怎麼使用它呢?
第二步:啟動並連線,進入安裝的資料夾後,在命令欄輸入 bin/redis-server 便可啟動 redis 服務端,輸入 bin/redis-cli 便可進入客戶端,如果你連的是遠端伺服器,需要指定位址。bin/redis-cli -h host -p port -a password, 如:redis-cli -h 127.0.0.1 -p 6379 -a "mypass",-h, -p, -a, 分別是主機,埠,密碼
那麼現在就可以盡情使用 redis 了。
使用前我先來說一下,redis 它到底能存些什麼東西
1.字串
redis 中的字串是乙個位元組序列。redis 中的字串是二進位制安全的,這意味著它們的長度不由任何特殊的終止字元決定。因此,可以在乙個字串中儲存高達512
兆位元組的任何內容
示例命令
127.0.0.1:6379> set key "hello redis"
ok 127.0.0.1:6379> get key
"hello redis"
2. 雜湊
redis 雜湊/雜湊 (hashes) 是鍵值對的集合。redis 雜湊/雜湊是字串欄位和字串值之間的對映。因此,它們用於表示物件。每個雜湊/雜湊可以儲存多達2^32-1
個健-值對
示例命令
ok127.0.0.1:6379> hmget key123 name
3.列表
redis 列表只是字串列表,按插入順序排序。您可以向 redis 列表的頭部或尾部新增元素。列表的最大長度為2^32-1
個元素
示例命令
(integer) 3
127.0.0.1:6379> lrange namelist 0 4
1) "oringer"
2) "pear"
4 集合
redis 集合是字串的無序集合。在 redis 中,您可以新增,刪除和測試成員存在的時間 o(1) 複雜性
127.0.0.1:6379> sadd nameset "aa" "bb" "cc" "dd"
(integer) 4
127.0.0.1:6379> smembers nameset
1) "bb"
2) "dd"
3) "cc"
4) "aa"
5 排序集合
redis 可排序集合類似於 redis 集合,是不重複的字元集合。 不同之處在於,排序集合的每個成員都與分數相關聯,這個分數用於按最小分數到最大分數來排序的排序集合。雖然成員是唯一的,但分數值可以重複
示例命令
127.0.0.1:6379> zadd namezset 1 "aaa"
(integer) 1
127.0.0.1:6379> zadd namezset 2 "bbb"
(integer) 1
127.0.0.1:6379> zadd namezset 2 "bbb"
(integer) 0
127.0.0.1:6379> zadd namezset 2 "bbcb"
(integer) 1
127.0.0.1:6379> zadd namezset 3 "ccc"
(integer) 1
127.0.0.1:6379> zrangebyscore namezset 1 3
1) "aaa"
2) "bbb"
3) "bbcb"
4) "ccc"
127.0.0.1:6379> zrangebyscore namezset 1 2
1) "aaa"
2) "bbb"
3) "bbcb"
這次先到這裡,相信大家對redis已經有乙個初步的認識
初探Redis 基礎篇
作為向web而生的redis,現已經使用得十分廣泛了。依靠其高效能 簡潔設計等深受開發者們喜歡。對redis從基礎學起,抱著知其然到知其所以然的想法,先學會怎麼用,再去深入了解內部運轉。redis官網 redis英文全稱為remote dictionary server,採用c語言開發的開源,基於記...
redis基礎篇 效能問題
零 一 觀察指標 1 cpu 效能監控圖 關注 user 和system的使用率 2 network 效能監控圖 出口流量1 可能存在大key或者高併發查詢 get 2 可能存在rdb快照 增量命令傳輸 新搭建的從庫或者主從切換導致 進口流量 1 代表可能存在高併發寫入 set 3 iops 效能監...
redis基礎篇 redis的基本命令
redis cli p 5566 a password 登入 redis cli a password shutdown 關閉redis redis init script stop 關閉redis auth pwd 輸入密碼 redis cli a password ping 檢視是否存活 sel...