摘要:所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些面試和學(xué)習(xí)中你必須掌握的問題。在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。
昨天寫了一篇自己搭建redis集群并在自己項(xiàng)目中使用的文章,今天早上看別人寫的面經(jīng)發(fā)現(xiàn)redis在面試中還是比較常問的(筆主主Java方向)。所以查閱官方文檔以及他人造好的輪子,總結(jié)了一些redis面試和學(xué)習(xí)中你必須掌握的問題。事無巨細(xì),不可能囊括到所有內(nèi)容,盡量把比較常見的寫出來。歡迎關(guān)注我的微信公眾號(hào):“Java面試通關(guān)手冊(cè)”,也可以加我微信:“bwcx9393”與我學(xué)習(xí)交流。
什么是Redis?Redis 是一個(gè)使用 C 語言寫成的,開源的 key-value 數(shù)據(jù)庫。。和Memcached類似,它支持存儲(chǔ)的value類型相對(duì)更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。目前,Vmware在資助著redis項(xiàng)目的開發(fā)和維護(hù)。Redis與Memcached的區(qū)別與比較
1 、Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。memcache支持簡單的數(shù)據(jù)類型,String。
2 、Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。
3 、Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用,而Memecache把數(shù)據(jù)全部存在內(nèi)存之中
4、 redis的速度比memcached快很多
5、Memcached是多線程,非阻塞IO復(fù)用的網(wǎng)絡(luò)模型;Redis使用單線程的IO復(fù)用模型。
如果想要更詳細(xì)了解的話,可以查看慕課網(wǎng)上的這篇手記(非常推薦) :《腳踏兩只船的困惑 - Memcached與Redis》:https://www.imooc.com/article/23549
Redis與Memcached的選擇終極策略: 使用Redis的String類型做的事,都可以用Memcached替換,以此換取更好的性能提升; 除此以外,優(yōu)先考慮Redis;
使用redis有哪些好處?(1) 速度快,因?yàn)閿?shù)據(jù)存在內(nèi)存中,類似于HashMap,HashMap的優(yōu)勢就是查找和操作的時(shí)間復(fù)雜度都是O(1)
(2)支持豐富數(shù)據(jù)類型,支持string,list,set,sorted set,hash
(3) 支持事務(wù),操作都是原子性,所謂的原子性就是對(duì)數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行
(4) 豐富的特性:可用于緩存,消息,按key設(shè)置過期時(shí)間,過期后將會(huì)自動(dòng)刪除
Redis常見數(shù)據(jù)結(jié)構(gòu)使用場景 1. String常用命令: set,get,decr,incr,mget 等。
String數(shù)據(jù)結(jié)構(gòu)是簡單的key-value類型,value其實(shí)不僅可以是String,也可以是數(shù)字。
常規(guī)key-value緩存應(yīng)用;
常規(guī)計(jì)數(shù):微博數(shù),粉絲數(shù)等。
常用命令: hget,hset,hgetall 等。
Hash是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲(chǔ)對(duì)象。 比如我們可以Hash數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)用戶信息,商品信息等等。
舉個(gè)例子: 最近做的一個(gè)電商網(wǎng)站項(xiàng)目的首頁就使用了redis的hash數(shù)據(jù)結(jié)構(gòu)進(jìn)行緩存,因?yàn)橐粋€(gè)網(wǎng)站的首頁訪問量是最大的,所以通常網(wǎng)站的首頁可以通過redis緩存來提高性能和并發(fā)量。我用jedis客戶端來連接和操作我搭建的redis集群或者單機(jī)redis,利用jedis可以很容易的對(duì)redis進(jìn)行相關(guān)操作,總的來說從搭一個(gè)簡單的集群到實(shí)現(xiàn)redis作為緩存的整個(gè)步驟不難。感興趣的可以看我昨天寫的這篇文章:
《一文輕松搞懂redis集群原理及搭建與使用》: https://juejin.im/post/5ad54d76f265da23970759d3
3.List常用命令: lpush,rpush,lpop,rpop,lrange等
list就是鏈表,Redis list的應(yīng)用場景非常多,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如微博的關(guān)注列表,粉絲列表,最新消息排行等功能都可以用Redis的list結(jié)構(gòu)來實(shí)現(xiàn)。
Redis list的實(shí)現(xiàn)為一個(gè)雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內(nèi)存開銷。
4.Set常用命令:
sadd,spop,smembers,sunion 等
set對(duì)外提供的功能與list類似是一個(gè)列表的功能,特殊之處在于set是可以自動(dòng)排重的。
當(dāng)你需要存儲(chǔ)一個(gè)列表數(shù)據(jù),又不希望出現(xiàn)重復(fù)數(shù)據(jù)時(shí),set是一個(gè)很好的選擇,并且set提供了判斷某個(gè)成員是否在一個(gè)set集合內(nèi)的重要接口,這個(gè)也是list所不能提供的。
在微博應(yīng)用中,可以將一個(gè)用戶所有的關(guān)注人存在一個(gè)集合中,將其所有粉絲存在一個(gè)集合。Redis可以非常方便的實(shí)現(xiàn)如共同關(guān)注、共同喜好、二度好友等功能。
5.Sorted Set常用命令: zadd,zrange,zrem,zcard等
和set相比,sorted set增加了一個(gè)權(quán)重參數(shù)score,使得集合中的元素能夠按score進(jìn)行有序排列。
舉例: 在直播系統(tǒng)中,實(shí)時(shí)排行信息包含直播間在線用戶列表,各種禮物排行榜,彈幕消息(可以理解為按消息維度的消息排行榜)等信息,適合使用Redis中的SortedSet結(jié)構(gòu)進(jìn)行存儲(chǔ)。
MySQL里有2000w數(shù)據(jù),Redis中只存20w的數(shù)據(jù),如何保證Redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)(redis有哪些數(shù)據(jù)淘汰策略???)相關(guān)知識(shí):redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候,就會(huì)施行數(shù)據(jù)淘汰策略(回收策略)。redis 提供 6種數(shù)據(jù)淘汰策略:
volatile-lru:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰
allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
Redis的并發(fā)競爭問題如何解決?Redis為單進(jìn)程單線程模式,采用隊(duì)列模式將并發(fā)訪問變?yōu)榇性L問。Redis本身沒有鎖的概念,Redis對(duì)于多個(gè)客戶端連接并不存在競爭,但是在Jedis客戶端對(duì)Redis進(jìn)行并發(fā)訪問時(shí)會(huì)發(fā)生連接超時(shí)、數(shù)據(jù)轉(zhuǎn)換錯(cuò)誤、阻塞、客戶端關(guān)閉連接等問題,這些問題均是由于客戶端連接混亂造成。對(duì)此有2種解決方法:
1.客戶端角度,為保證每個(gè)客戶端間正常有序與Redis進(jìn)行通信,對(duì)連接進(jìn)行池化,同時(shí)對(duì)客戶端讀寫Redis操作采用內(nèi)部鎖synchronized。
2.服務(wù)器角度,利用setnx實(shí)現(xiàn)鎖。
注:對(duì)于第一種,需要應(yīng)用程序自己處理資源的同步,可以使用的方法比較通俗,可以使用synchronized也可以使用lock;第二種需要用到Redis的setnx命令,但是需要注意一些問題。
Redis回收進(jìn)程如何工作的? Redis回收使用的是什么算法?Redis內(nèi)存回收:LRU算法(寫的很不錯(cuò),推薦):https://www.cnblogs.com/WJ5888/p/4371647.html
Redis 大量數(shù)據(jù)插入官方文檔給的解釋:http://www.redis.cn/topics/mass-insert.html
Redis 分區(qū)的優(yōu)勢、不足以及分區(qū)類型官方文檔提供的講解:http://www.redis.net.cn/tutorial/3524.html
Redis持久化數(shù)據(jù)和緩存怎么做擴(kuò)容?《redis的持久化和緩存機(jī)制》 :https://blog.csdn.net/tr1912/article/details/70197085?foxhandler=RssReadRenderProcessHandler
擴(kuò)容的話可以通過redis集群實(shí)現(xiàn),之前做項(xiàng)目的時(shí)候用過自己搭的redis集群
然后寫了一篇關(guān)于redis集群的文章:《一文輕松搞懂redis集群原理及搭建與使用》:https://juejin.im/post/5ad54d76f265da23970759d3
Master最好不要做任何持久化工作,如RDB內(nèi)存快照和AOF日志文件
如果數(shù)據(jù)比較重要,某個(gè)Slave開啟AOF備份數(shù)據(jù),策略設(shè)置為每秒同步一次
為了主從復(fù)制的速度和連接的穩(wěn)定性,Master和Slave最好在同一個(gè)局域網(wǎng)內(nèi)
盡量避免在壓力很大的主庫上增加從庫
Redis與消息隊(duì)列作者:翁偉
鏈接:https://www.zhihu.com/questio...
不要使用redis去做消息隊(duì)列,這不是redis的設(shè)計(jì)目標(biāo)。但實(shí)在太多人使用redis去做去消息隊(duì)列,redis的作者看不下去,另外基于redis的核心代碼,另外實(shí)現(xiàn)了一個(gè)消息隊(duì)列disque: antirez/disque:https://github.com/antirez/disque部署、協(xié)議等方面都跟redis非常類似,并且支持集群,延遲消息等等。
我在做網(wǎng)站過程接觸比較多的還是使用redis做緩存,比如秒殺系統(tǒng),首頁緩存等等。
好文Mark非常非常推薦下面幾篇文章。。。
《Redis深入之道:原理解析、場景使用以及視頻解讀》:https://zhuanlan.zhihu.com/p/28073983:
主要介紹了:Redis集群開源的方案、Redis協(xié)議簡介及持久化Aof文件解析、Redis短連接性能優(yōu)化等等內(nèi)容,文章干貨太大,容量很大,建議時(shí)間充??梢钥纯?。另外文章里面還提供了視頻講解,可以說是非常非常用心了。
《阿里云Redis混合存儲(chǔ)典型場景:如何輕松搭建視頻直播間系統(tǒng)》:https://yq.aliyun.com/articles/582487?utm_content=m_46529:
主要介紹視頻直播間系統(tǒng),以及如何使用阿里云Redis混合存儲(chǔ)實(shí)例方便快捷的構(gòu)建大數(shù)據(jù)量,低延遲的視頻直播間服務(wù)。還介紹到了我們之前提高過的redis的數(shù)據(jù)結(jié)構(gòu)的使用場景
《美團(tuán)在Redis上踩過的一些坑-5.redis cluster遇到的一些問》:http://carlosfu.iteye.com/blog/2254573:主要介紹了redis集群的兩個(gè)常見問題,然后分享了 一些關(guān)于redis集群不錯(cuò)的文章。
參考:
https://www.cnblogs.com/Survi...
http://www.redis.net.cn/tutor...
https://redis.io/
歡迎關(guān)注我的微信公眾號(hào):"Java面試通關(guān)手冊(cè)"(堅(jiān)持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源,面試題,以及企業(yè)級(jí)Java實(shí)戰(zhàn)項(xiàng)目回復(fù)關(guān)鍵字免費(fèi)領(lǐng)?。?/strong>。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/69138.html
摘要:手動(dòng)創(chuàng)建執(zhí)行線程存在以上問題,而線程池就是用來解決這些問題的。線程池詳解上面我們已經(jīng)知道了線程池的作用,而對(duì)于這樣一個(gè)好用,重要的工具,當(dāng)然已經(jīng)為我們提供了實(shí)現(xiàn),這也是本篇文章的重點(diǎn)。,線程池一旦空閑超過時(shí)間,線程都將被回收。 showImg(https://segmentfault.com/img/remote/1460000018476903); 本文原創(chuàng)地址,我的博客:https...
摘要:注解在類上為類提供一個(gè)全參的構(gòu)造方法,加了這個(gè)注解后,類中不提供默認(rèn)構(gòu)造方法了。這個(gè)注解用在類上,使用類中所有帶有注解的或者帶有修飾的成員變量生成對(duì)應(yīng)的構(gòu)造方法。 轉(zhuǎn)載請(qǐng)注明原創(chuàng)地址:http://www.54tianzhisheng.cn/2018/01/07/lombok/ showImg(http://ohfk1r827.bkt.clouddn.com/blog/180107/7...
閱讀 2996·2021-09-01 10:30
閱讀 1760·2019-08-30 15:52
閱讀 1060·2019-08-29 18:40
閱讀 1235·2019-08-28 18:30
閱讀 2484·2019-08-23 17:19
閱讀 1496·2019-08-23 16:25
閱讀 2845·2019-08-23 16:18
閱讀 3078·2019-08-23 13:53