一、 Redis特性
1.速度快
(1)所有數(shù)據(jù)都是存放在內(nèi)存中
(2)底層是用C語言編寫
(3)Redis使用了單線程架構(gòu)魄宏,預(yù)防了多線程可能產(chǎn)生的競(jìng)爭(zhēng)問題2.基于鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)服務(wù)器
Redis的全稱是Remote Dictionary Server,主要提供5種數(shù)據(jù)結(jié)構(gòu):String誊锭,List撩独,Set,ZSet胜卤,Hash疆导。
3.簡(jiǎn)單穩(wěn)定
Redis直接自己構(gòu)建了VM 機(jī)制 ,因?yàn)檎{(diào)用系統(tǒng)函數(shù)葛躏,會(huì)浪費(fèi)一定的時(shí)間去移動(dòng)和請(qǐng)求澈段。
4.客戶端語言多
5.持久化
兩種持久化方式: RDB和AOF。http://www.reibang.com/p/fb5627666ad3
6.主從復(fù)制 http://www.reibang.com/p/a7b0c8de83ae
7.高可用和分布式
二舰攒、Redis使用場(chǎng)景
1.緩存功能(String)
UserInfo getUserInfo(long id){
// 定義鍵
String userRedisKey = "user:info:" + id;
// 從Redis中獲取值
String value = redis.get(userRedisKey);
UserInfo userInfo;
if(value != null){
// 將值進(jìn)行反序列化為UserInfo并返回結(jié)果
userInfo = deserialize(value);
}else{
// 從mysql中獲取用戶信息
userInfo = mysql.get(id);
// 將userInfo序列化败富,并存入Redis,添加1小時(shí)過期時(shí)間
if(userInfo != null)
redis.setex(userRedisKey, 3600, serialize(userInfo));
}
return userInfo;
}
2.計(jì)數(shù)器應(yīng)用(String)
long incrVideoCounter(long id){
String key = "video:playCount:" + id;
return redis.incr(key);
}
3.共享Session(String)
4.限速(String)
很多應(yīng)用出于安全的考慮摩窃,會(huì)在每次進(jìn)行登陸操作時(shí)兽叮,讓用戶輸入手機(jī)驗(yàn)證碼,從而確定是否用戶本人猾愿。但是為了短信接口不被某個(gè)用頻繁訪問鹦聪,會(huì)限制用戶每分鐘獲取驗(yàn)證碼的頻率,例如一分鐘不能超過5次蒂秘,偽代碼如下:
String phoneNum = "130xxxxxxxx";
String key = "shortMsg:limit:" + phoneNum;
// SET key value EX 60 NX
String isExists = redis.set(key, 1, "EX 60", "NX");
if(isExists != null || redis.incr(key) <= 5){
// 通過
}else{
// 限速
}
5.分布式鎖(String)
由于Redis的單線程命令處理機(jī)制泽本,如果有多個(gè)客戶端同時(shí)執(zhí)行setnx key value,根據(jù)setnx的特性只有一個(gè)客戶端能設(shè)置成功姻僧,因此setnx可以作為分布式鎖的一種實(shí)現(xiàn)方案规丽。
(nx:鍵必須不存在蒲牧,才可以設(shè)置成功,用于添加)
(xx:鍵必須存在嘁捷,才可以設(shè)置成功造成,用于更新)
6.消息隊(duì)列(List)
Redis的lpush+brpop命令組合即可實(shí)現(xiàn)阻塞隊(duì)列,生產(chǎn)者客戶端使用lpush從列表左側(cè)插入元素雄嚣,多個(gè)消費(fèi)者客戶端使用brpop命名阻塞式的“搶”列表尾部的元素晒屎,多個(gè)客戶端保證了消費(fèi)的負(fù)載均衡和高可用性。
7.社交網(wǎng)絡(luò)(Set)
計(jì)算兩個(gè)用戶共同的愛好缓升,可以求兩個(gè)Set的交集申鱼。
8.排行榜系統(tǒng)(ZSet)
(1)添加用戶的點(diǎn)贊數(shù)
比如用戶duxin上傳一個(gè)視頻珊擂,獲得666個(gè)好友點(diǎn)贊,使用ZSet的zadd功能:
zadd user:ranking:2018_04_26 duxin 666
然后又獲得了一個(gè)點(diǎn)贊,使用ZSet的zincrby功能:
zincrby user:ranking:2018_04_26 duxin 1
(2)取消用戶的點(diǎn)贊數(shù)
zrem user:ranking:2018_04_26 duxin
(3)點(diǎn)贊數(shù)最多的前10個(gè)用戶
zrevrangebyrank user:ranking:2018_04_26 0 9