redis與memcached區(qū)別?
長弓張(memcached):
1伍派、我的系統(tǒng)業(yè)務以純kv的緩存為主,數(shù)據(jù)量剩胁、并發(fā)業(yè)務量大诉植,memcache較為合適。
2昵观、memcache將所有數(shù)據(jù)存儲在物理內(nèi)存中晾腔。redis則有自己的VM機制,當數(shù)據(jù)超量時啊犬,會引發(fā)swap(交換分區(qū))灼擂,影響我的性能。
3觉至、memcache使用多線程的模式(主線程監(jiān)聽剔应,work子線程工作),而redis使用單線程,難以充分利用目前的多核cpu峻贮。
子木李(redis):
1席怪、redis在數(shù)據(jù)持久化提供了兩種方式RDB、AOF月洛,雖然不是那么完美何恶,但是系統(tǒng)發(fā)生崩潰時有這一層聊勝于無孽锥,對不對嚼黔。
2、redis天然高可用惜辑,官方提供了sentinel集群管理工具唬涧,釋放了大量的工作內(nèi)容。
3盛撑、redis能存儲的內(nèi)容較memcached的1M要大多了碎节。
4、redis青出于藍而勝于藍抵卫,代碼質(zhì)量比memcached好多了狮荔。
5、我的系統(tǒng)不僅僅只用了KV介粘,我需要用到redis豐富的數(shù)據(jù)結(jié)構及相關功能函數(shù)殖氏,memcached不適合我的系統(tǒng)。
redis常用的數(shù)據(jù)結(jié)構
字符串鍵
1姻采、結(jié)構類型如下圖:
? ? ?Bits:二進制資源雅采,可以存放文件、圖片類型等
2慨亲、常見操作SET婚瓜、SETNX區(qū)別:SET設置鍵值,SETNX設置一個不存在的鍵值才會生效
3刑棵、使用場景
? ? ? 3.1 字符串鍵-分布式鎖
? ? ? ? ? ?//設置鎖字符串鍵巴刻,若存在則設置失敗
? ? ? ? ? ?SETNX("order",'lock')==1 //成功獲取鎖
? ? ? ? ? ?SETNX(orderKey,'lock')==0 //有人占用資源獲取鎖失敗
? ? ? ? ? ? //業(yè)務處理完畢釋放分布式鎖
? ? ? ? ? ?DEL(orderKey);
? ? ? ? ? ?//設置鎖字符串鍵的失效時間,防止宕機蛉签,系統(tǒng)運行意外冈涧,導致無法釋放鎖
? ? ? ? ? ?PEXPIRE(orderKey,lockMilliSeconds)
? ? ?3.2 字符串鍵-計數(shù)器(帖子閱讀量)
? ? ? ? ? ?// INCR? readcount::{帖子ID}? 每閱讀一次 + 1
? ? ? ? ? ?INCR key? ? ?
? ? ? ? ? ?// GET readcount::{帖子ID}?獲取閱讀量
? ? ? ? ? ?GET key
? ? ? ? ? ?說明:該操作是原子性操作,且redis是單線程操作不存在多線程時安全性問題正蛙,該設計適用于分布式系統(tǒng)
? ? ?3.3 字符串鍵-分布式全局系列
Hash鍵
?1督弓、結(jié)構類型如下圖
?2、Hash鍵意義
? ? ? ? ? ? ?1乒验、Hash鍵可以將信息凝聚在一起愚隧,而不是直接分散的儲存在整個Redis中,這不僅方便了數(shù)據(jù)管理,還可以盡量避免一定的誤操作狂塘;
?????????????2录煤、避免鍵名沖突;
? ? ? ? ? ? ?3荞胡、最主要的意義:減少內(nèi)存占用妈踊;
3、不適合Hash鍵的情況
? ? ? ? ? ? ?1泪漂、過期功能的使用廊营,過期功能只能用在key上;
? ? ? ? ? ? ?2萝勤、二進制操作命令如:SETBIT露筒、GETBIT、BITOP敌卓;
? ? ? ? ? ? ?3慎式、需要考慮數(shù)據(jù)量分布的問題(redis的分布用預Hash巢/虛擬節(jié)點 方式實現(xiàn)如下圖);
列表(List)鍵
?1趟径、結(jié)構類型如下圖
2瘪吏、常見操作
? ? ? lpush key string 在 key 對應 list 頭部添加字符串元素
? ? ? rpush key string 在 key 對應 list 尾部添加字符串元素
? ? ? rpop key 從 list 尾部刪除元素 并返回刪除的元素
? ? ? lpop key 從 list 頭部刪除元素 并返回刪除的元素
? ? ? llen key 返回 key 對應 list 的長度 key 不存在 返回 0 如果key對應的類型不是 list 返回錯誤
? ? ? lrange key start end 返回指定區(qū)間內(nèi)的元素 從下標 0 開始
? ? ? ltrin key start end 截取list 保留指定區(qū)間的元素
3、應用場景
????3.1 基于列表(list)鍵蜗巧,實現(xiàn)阻塞消息隊列
3.2 基于列表(list)鍵掌眠,實現(xiàn)新浪\推特用戶消息列表
集合(SET)鍵
1、結(jié)構類型如下圖
? ? ?結(jié)合鍵結(jié)構具有如下特點:1惧蛹、無序扇救,2、不可重復
2香嗓、常見操作
sadd:將指定的元素添加到集合迅腔。如果集合中存在該元素,則忽略靠娱。 如果集合不存在沧烈,會先創(chuàng)建一個集合然后在添加元素。
srem:移除一個或者多個元素像云,并返回移除的數(shù)量锌雀。
sismember:檢查某個元素是否存在某個集合里面。
scard:返回集合里面元素的數(shù)量迅诬。
smembers:返回集合里面所有的元素腋逆。
srandmember:從集合里面隨機返回一個或者多個元素。
spop:隨機移除一個元素侈贷,返回隨機移除的元素惩歉。
smove:smove source-key dest-key item 如果集合source-key包含元素item,那么從集合source-key里面移除元素item,并添加到集合dest-key里面撑蚌,如果移除成功移除上遥,那么命令返回1,否則返回0争涌。
sdiff:sdiff key-name [key-name …] 返回那些存在于第一個集合粉楚,但不存在其他集合當中的元素(相當于差集運算)。
sdiffstore:sdiffstore store-key key1 [key… ] 將存在于第一個集合亮垫,但不存在其他集合當中的元素(相當于差集運算)找出來模软,并且存到dest-key里面,區(qū)別于上一步就是多了一個保存包警。
sinter:交集運算撵摆。
sinterstore:交集運算并存儲底靠。
sunion:并集運算害晦。
sunionstore:并集運算并存儲。
3暑中、應用場景
? ? ?3.1 集合鍵-直播刷禮物壹瘟、轉(zhuǎn)發(fā)微博等抽獎活動
? ? ? //刷禮物、轉(zhuǎn)發(fā)微博加入到集合中
? ? ? SADD key{userID}
? ? ? //獲取所有用戶鳄逾,大輪盤轉(zhuǎn)起來
? ? ? SMEMBERS key
? ? ? //抽取count名中獎者
? ? ? SPOP key[count] / SRANDMEMBER key[count]
? ? ? 3.2?集合鍵-點贊稻轨、簽到、like等功能
點贊--> SADD like::8001 1001
取消點贊--> SREM? like::8001 1001
檢查用戶是否點過贊-->? SISMEMBER like::8001?1001
獲取點贊的用戶列表-->??SISMEMBER like::8001
獲取點贊用戶數(shù)--> SCARD like::8001
3.3 集合鍵-集合運算
? ?SDIFF:計算差集時以第一個為主
查看共同關注的人模型
seven關注的人: sevenSubKey -->{'qing','mic','james'}
qing關注的人:qingSubKey-->{'seven','jack','mic','james'}
mic關注的人:micSubKey-->{'seven','james','qing','jack','tom'}
我和qing共同關注的人:SINTER?sevenSubKey??qingSubKey -->{'mic','james'}
我關注的人也關注他:SISMEMBER?micSubKey?qing 雕凹、SISMEMBER?micSubKey qing
我可能認識的人:SDIFFSTORE sevenMayKnow qingSubKey?sevenSubKey -->{'seven','jack'}
3.4?集合鍵-集合運算-電商商品刪選
每個商品入庫時建立他的靜態(tài)標簽列表如:品牌殴俱、尺寸、處理器枚抵、內(nèi)存...
錄入:
SADD brand::lenovo 拯救者y7000P-001 ThinkPad-T480
SADD screenSize::15.6 ?拯救者y7000P-001 機械革命Z2AIR
SADD processor::i7??拯救者y7000P-001?機械革命X8TIPlus
SADD memory::8G?拯救者y7000P-001?ThinkPad-T480?機械革命Z2AIR?機械革命X8TIPlus
查找:
SINTER?brand::lenovo?screenSize::15.6??processor::i7??memory::8G -->?拯救者y7000P-001
3.5??集合鍵-集合運算-支付系統(tǒng)對賬
通過兩個交集計算出有問題的訂單
有序集合(Zset)鍵
1线欲、結(jié)構類型如下圖
2、常見操作
2.1 設定/修改命令
zadd key score member [[score member] [score member] ...]
? ? 將一個或多個member元素及其score值加入到key當中
? ? score值可以是整數(shù)值或雙精度浮點數(shù)
? ? 如果某個member已經(jīng)是有序集合的成員汽摹,那么更新這個member的score值
? ? 如果key不存在李丰,創(chuàng)建一個空的有序集并執(zhí)行zadd操作
? ? 返回被成功添加的新成員的數(shù)量,不包括那些被更新的逼泣、已經(jīng)存在的成員
zincrby key increment member
? ? 為key的成員member的score值加上增量increment(可以為負數(shù))
? ? key不存在時創(chuàng)建一個空的有序集并執(zhí)行zincrby操作
? ? member成員不存在時趴泌,創(chuàng)建該成員并設置其score值為0并執(zhí)行zincrby操作
? ? 返回member成員的新score值(字符串形式)
2.2 移除命令
zrem key member [member ...]:移除key中一個或多個成員,不存在的成員將被忽略拉庶。返回被成功移除的成員數(shù)量(不包括被忽略的成員)
zremrangebyrank key start stop:移除key中指定下標區(qū)間內(nèi)(包含start和stop)的所有成員嗜憔。返回移除成員的數(shù)量
zremrangebyscore key min max:
? ? 移除key中score值在min和max之間(包括mi和max)的成員
? ? 可以給參數(shù)min和max前增加"("括號來使結(jié)果不包含
? ? 返回移除成員的數(shù)量
2.3 獲取命令
zrange key start stop [withscores]
? ? 返回key中指定下標(可以為負數(shù))區(qū)間內(nèi)的成員并按score值遞增(從小到大)來排序的列表
? ? 具有相同score值的成員按字典序(lexicographical order)來排列
? ? start大于最大下標或者start>stop,返回空列表
? ? stop大于最大下標將stop當作最大下標來處理
? ? withscores選項讓成員和它的score值一并返回氏仗,返回列表以value1,score1, ..., valueN,scoreN的格式表示
zrevrange key start stop [withscores]:返回key中逆序排序(按score值從大到小)后指定下標(可以為負數(shù))區(qū)間內(nèi)的成員列表
zrangebyscore key min max [withscores] [limit offset count]
? ? 返回key中score值介于min和max之間(包括min和max)的成員
? ? min和max可以是-inf(無限大)和+inf(無限小)吉捶,這樣可以在不知道最低和最高score的情況下使用zrangebyscore這類命令
? ? 可選的limit參數(shù)指定返回結(jié)果的數(shù)量及區(qū)間
? ? withscores選項讓成員和它的score值一并返回
? ? 默認情況下,包括score值等于min和max的成員,可以給參數(shù)min和max前增加"("括號來使結(jié)果不包含帚稠,如:
? ? zrangebyscore zset (1 5:返回所有1<score<=5的成員
? ? zrangebyscore zset (5 (10:返回所有5<score<10的成員
? ? 返回指定區(qū)間內(nèi)的有序集成員的列表
zrevrangebyscore key min max [withscores] [limit offset count]:返回key中score值介于min和max之間(包括min和max)的成員并把這些成員逆序排序(按score值從大到小)
zscore key member:返回key成員member的score值(字符串形式)谣旁,如果member元素不是key的成員或key不存在返回null
2.4 交集并集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
? ? 計算給定的一個或多個有序集的和集(并集)并將該并集(結(jié)果集)儲存到destination
? ? numkeys為給定key的數(shù)量
? ? weights選項為每個對應的key分別指定一個乘法因子,對應的key所有成員的score值在傳遞給聚合函數(shù)(aggregate)之前都要先乘以該因子滋早,默認為1
? ? aggregat選項指定和集(并集)的結(jié)果集中score值的聚合方式
? ? ? ? 默認為sum榄审,將所有集合中某個相同成員的score值之和作為結(jié)果集中該成員的score值;
? ? ? ? min將所有集合中某個相同成員中最小的score值作為結(jié)果集中該成員的score值杆麸;
? ? ? ? max將所有集合中某個相同成員最大的score值作為結(jié)果集中該成員的score值
? ? 返回保存到 destination 的結(jié)果集的基數(shù)搁进。
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
? ? 計算給定的一個或多個有序集的交集并將該交集(結(jié)果集)儲存到destination
? ? 參數(shù)的用法和zunionstore相同
3、ZSet運算模型(可用于報表統(tǒng)計)
4昔头、應用場景
4.1 ZSet集-自動補齊功能
用戶首次進入搜索abc進行查詢
?//對abc進行分詞 a:key饼问,1:sorce(說明當用戶2也進行abc搜索時對應的key+1,實現(xiàn)熱度排序)揭斧,abc:member
ZINCRBY a 1 abc? ?
ZINCRBY ab 1 abc? ?
ZINCRBY abc 1 abc? ?
用戶在輸入abd進行查詢
ZINCRBY a 1 abd
ZINCRBY ab 1 abd
ZINCRBY abd 1 abd
用戶進行搜索時 輸入 a莱革,后臺執(zhí)行 ZREVRANGE a 0 -1 -->{abc,abd}?
4.1 ZSet集-單日排行榜
//點擊第一條“馬蓉怒斥王寶強?”,設置為熱詞
ZADD hotNews::{11-11} 1??
//給對應熱詞+1
ZINCRBY hotNews::{11-11} 1?
//倒敘取10條
ZREVRANGE?hotNews::{11-11}? 0 10 WITHSCORES
4.1?ZSet集-周讹开、月盅视、年排行榜
//并集計算 11.19號-11.25號
ZUNIONSTORE hotNews{11.19-11.25}?hotNews{11.19}??hotNews{11.19-11.20} ...hotNews{11.25}?
//取11.19-11.25倒敘的前十
ZREVRANGE?hotNews{11.19-11.25} 0 10?WITHSCORES