redis採用的是基於記憶體的採用的是單程序單執行緒模型的kv資料庫,由c語言編寫。官方提供的資料是可以達到100000+的qps。這個資料不比採用單程序多執行緒的同樣基於記憶體的kv資料庫memcached差。
redis快的主要原因是:
完全基於記憶體
資料結構簡單,對資料操作也簡單
使用多路 i/o 復用模型
redis 的單程序單執行緒的,利用佇列技術,將併發訪問變為序列訪問,消除了傳統資料庫在序列控制的開銷。
redis關於執行緒安全問題
redis實際上是採用了執行緒封閉的觀念,把任務封閉在乙個執行緒,自然避免了執行緒安全問題,不過對於需要依賴多個redis操作的復合操作來說,依然需要鎖,而且有可能是分布式鎖。
(1)速度快,因為資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o(1)
(2)支援豐富資料型別,支援string,list,set,sorted set,hash
(3)支援事務,操作都是原子性,所謂的原子性就是對資料的更改要麼全部執行,要麼全部不執行
(4)豐富的特性:可用於快取,訊息,按key設定過期時間,過期後將會自動刪除
(1) memcached所有的值均是簡單的字串,redis作為其替代者,支援更為豐富的資料型別
(2) redis的速度比memcached快很多
(3) redis可以持久化其資料,
詳細了解 ,這篇手記
儲存方式memecache把所有資料存放在記憶體,斷電資料會丟失,資料不能大於記憶體容量。
redis部分資料在磁碟,資料永續性。
資料支援型別memecache支援相對簡單資料型別
redis支援五大資料型別,string,hash,list,set,storeset,
使用底層模型不同它們之間底層實現方式 以及與客戶端之間通訊的應用協議不一樣。
redis直接自己構建了vm 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求。
value大小memcache只有1mb
redis最大可以達到1gb
redis 記憶體資料集大小上公升到一定大小的時候,就會施行資料淘汰策略。redis 提供 6種資料淘汰策略
voltile-lru
從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰
volitile-ttl
從已設定過期時間的資料集(server.db[i].expires)中挑選即將過期的資料淘汰
volatile-random
從已設定過期時間的資料集(server.db[i].expires)中隨機挑選資料淘汰
allkeys-lru
從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰
allkeys-random
從資料集server.db[i].dict)中挑選任意資料進行淘汰
no-enviction(驅逐)
禁止驅逐資料
redis官網 :
1. string
常用命令: set,get,decr,incr,mget 等。
string資料結構是簡單的key-value型別,value其實不僅可以是string,也可以是數字。
常規key-value快取應用;
常規計數:微博數,粉絲數等。
2.hash
常用命令: hget,hset,hgetall 等。
hash是乙個string型別的filed和value的對映表,適合儲存物件。可以用hash結構來儲存使用者資訊,商品資訊等等。
hash鍵意義何在,為什麼有string型別還要hasn呢?
hash鍵可以將資訊凝聚在一起,而不是直接分散的儲存在整個reis中,方便資料管理,還可以盡量避免一些誤操作。比如,儲存使用者資訊,商品資訊等等
避免鍵名衝突;hash 用的是二維結構, key - field -value ;鍵名(key - field)
減少記憶體占用;string 的key可以設定定時過期時間,redis會自動掃瞄所有的key,但是hash的key不會。
不適合用hash鍵的情況,對比string
過期功能的使用,過期功能只能設定在string key上;
二進位制操作命令,如:setbit、getbit、bitop
需要考慮資料量分布的問題;redis cluster採用虛擬槽分割槽,所有的鍵根據雜湊函式對映到0~16383個整數槽內,每個節點負責維護一部分槽以及槽所印對映的鍵值資料。如果,key都要表名(商品資訊表+欄位+value的形式儲存),則經過雜湊哈數後,資料就會落到同乙個資料槽。
3.list
常用命令: lpush,rpush,lpop,rpop,lrange等
list就是鍊錶,redis list很多場景用到,比如:微博的關注列表,粉絲列表,最新訊息排行功能。
redis list 的實現就是乙個雙向鍊錶,支援正反向查詢,遍歷,方便操作,不會帶來額外記憶體的開銷。
4.set
常用命令: sadd,spop,smembers,sunion 等
set對外提供的功能與list類似是乙個列表的功能,特殊之處在於set是可以自動排重的。
當你需要儲存乙個列表資料,又不希望出現重複資料時,set是乙個很好的選擇,並且set提供了判斷某個成員是否在乙個set集合內的重要介面,這個也是list所不能提供的。
在微博應用中,可以將乙個使用者所有的關注人存在乙個集合中,將其所有粉絲存在乙個集合。redis可以非常方便的實現如共同關注、共同喜好、二度好友等功能。
5.sorted set
常用命令: zadd,zrange,zrem,zcard等
和set相比,sorted set增加了乙個權重引數score,使得集合中的元素能夠按score進行有序排列。
key小value大
使用vm的效果會比較好.因為這樣節約的記憶體比較大
key大
可以考慮使用一些非常方法將很大的key變成更大的value。比如可以考慮將key,value組合成乙個新的value.
vm-max-threads這個引數,可以設定訪問swap檔案的執行緒數,設定最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是序列的.可能會造成比較長時間的延遲,但是對資料完整性有很好的保證.
redis的n種妙用,不僅僅是快取
redis的n種妙用,不僅僅是快取
redis是鍵值對的資料庫,常用的五種資料型別為字串型別(string),雜湊型別(hash),列表型別(list),集合型別(set),有序集合型別(zset)
《美團在redis上踩過的一些坑-5.redis cluster遇到的一些問》::主要介紹了redis集群的兩個常見問題,然後分享了 一些關於redis集群不錯的文章。
Redis 面試常見問題
redis常見問題 為什麼使用redis 效能和併發 分布式鎖還有其他中介軟體可以代替 使用redis有什麼缺點 單執行緒的redis問什麼這麼快 redis的資料型別,以及每種資料型別的使用場景 redis 的過期策略以及記憶體淘汰機制 redis 採用定期刪除 惰性刪除策略 採用定期刪除 惰性刪...
redis面試常見問題
系統哪些場景用到了快取?商品的資訊,其實變動不大,一般一天更新一次,但是訪問量又比較大 加快取後,利用快取提高了效能 如果後續資料變化後,系統修改了資料庫的同時,更新下快取就ok了 快取如何實現高併發 先查快取,如果快取有資料,查快取,沒有快取查資料庫,這樣可能可以將每秒4000個 請求的高併發 降...
面試求職 IT面試常見問題總結
在面試之前多了解一些常見問題對面試的成功起到了很重要的作用,我把一些常見問題總結如下,希望對還在求職中的it人員有所幫助 面試之前請做好準備 1,簡單介紹一下您的情況?2,您怎樣描述自己?3,您為何要選擇我公司?4,您為了這次面試做了哪些準備工作?5,我們為什麼要僱傭您?6,為什麼您要應聘這個職位?...