-
redis 是什麼?都有哪些使用場景?
Redis是一個開源的 key—value型 單線程非關係型數據庫,支持string、list、set、zset和hash類型數據。
默認端口:6379
默認數據庫數量:16
適用場景:
1.數據高併發的讀寫
2.海量數據的讀寫
3.對擴展性要求高的數據 -
redis 有哪些功能?
1)、會話緩存(Session Cache)
2)、全頁緩存(FPC)
3)、隊列
4)、排行榜/計數器
5)、發佈/訂閱 -
redis 和 memecache 有什麼區別?
1、存儲方式:
memecache 把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小
redis有部份存在硬盤上,這樣能保證數據的持久性。
2、數據支持類型:
redis在數據支持上要比memecache多的多。
3、使用底層模型不同:
新版本的redis直接自己構建了VM 機制 ,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
4、運行環境不同:
redis目前官方只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話可以更好的把精力用於本系統 環境上的優化,雖然後來微軟有一個小組爲其寫了補丁。但是沒有放到主幹上 -
redis 爲什麼是單線程的?
因爲Redis是基於內存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器內存的大小或者網絡帶寬。既然單線程容易實現,而且CPU不會成爲瓶頸,那就順理成章地採用單線程的方案了。 -
什麼是緩存穿透?怎麼解決?
緩存穿透是指查詢一個一定不存在的數據,由於緩存是不命中時被動寫的,並且出於容錯考慮,如果從存儲層查不到數據則不寫入緩存,這將導致這個不存在的數據每次請求都要到存儲層去查詢,失去了緩存的意義。在流量大時,可能DB就掛掉了,要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。
解決:
1、在某些特定場景下(登錄),進行驗證碼,這種方法並不是很安全,因爲目前圖像識別技術在很大程度上能夠解決驗證碼的問題,所以僅供簡單使用。
2、布隆過濾器 -
redis 支持的數據類型有哪些?
1、string(字符串)
2、hash(哈希)
Redis hash 是一個鍵值(key=>value)對集合。
Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
3、list(列表)
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
4、set(集合)
Redis的Set是string類型的無序集合。
5、zset(sorted set:有序集合)Redis zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。 -
redis 支持的 java 客戶端都有哪些?
Redisson,Jedis,lettuce等等,官方推薦使用Redisson。 -
jedis 和 redisson 有哪些區別?
1.概況對比
Jedis是Redis的Java實現的客戶端,其API提供了比較全面的Redis命令的支持;Redisson實現了分佈式和可擴展的Java數據結構,和Jedis相比,功能較爲簡單,不支持字符串操作,不支持排序、事務、管道、分區等Redis特性。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業務邏輯上。
2.編程模型
Jedis中的方法調用是比較底層的暴露的Redis的API,也即Jedis中的Java方法基本和Redis的API保持着一致,瞭解Redis的API,也就能熟練的使用Jedis。而Redisson中的方法則是進行比較高的抽象,每個方法調用可能進行了一個或多個Redis方法調用。3. 可伸縮性
Jedis使用阻塞的I/O,且其方法調用都是同步的,程序流需要等到sockets處理完I/O才能執行,不支持異步。Jedis客戶端實例不是線程安全的,所以需要通過連接池來使用Jedis。Redisson使用非阻塞的I/O和基於Netty框架的事件驅動的通信層,其方法調用是異步的。Redisson的API是線程安全的,所以可以操作單個Redisson連接來完成各種操作。
4 . 數據結構
Jedis僅支持基本的數據類型如:String、Hash、List、Set、Sorted Set。Redisson不僅提供了一系列的分佈式Java常用對象,基本可以與Java的基本數據結構通用,還提供了許多分佈式服務,其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service)。在分佈式開發中,Redisson可提供更便捷的方法。
5 . 第三方框架整合
1)Redisson提供了和Spring框架的各項特性類似的,以Spring XML的命名空間的方式配置RedissonClient實例和它所支持的所有對象和服務;
2)Redisson完整的實現了Spring框架裏的緩存機制;
3 )Redisson在Redis的基礎上實現了Java緩存標準規範;
4) Redisson爲Apache Tomcat集羣提供了基於Redis的非黏性會話管理功能。該功能支持Apache Tomcat的6、7和8版。
5)Redisson還提供了Spring Session會話管理器的實現。 -
怎麼保證緩存和數據庫數據的一致性?
採用延時雙刪策略、異步更新緩存(基於訂閱binlog的同步機制) -
redis 持久化有幾種方式?
一種RDB持久化(原理是將Reids在內存中的數據庫記錄定時dump到磁盤上的RDB持久化),另外一種是AOF(append only file)持久化(原理是將Reids的操作日誌以追加的方式寫入文件) -
redis 怎麼實現分佈式鎖?
獲取鎖的時候,使用setnx加鎖,並使用expire命令爲鎖添加一個超時時間,超過該時間則自動釋放鎖,鎖的value值爲一個隨機生成的UUID,通過此在釋放鎖的時候進行判斷。
獲取鎖的時候還設置一個獲取的超時時間,若超過這個時間則放棄獲取鎖。
釋放鎖的時候,通過UUID判斷是不是該鎖,若是該鎖,則執行delete進行鎖釋放。 -
redis 分佈式鎖有什麼缺陷?
(一)緩存和數據庫雙寫一致性問題
(二)緩存雪崩問題
(三)緩存擊穿問題
(四)緩存的併發競爭問題 -
redis 如何做內存優化?
一. redisObject對象
二. 縮減鍵值對象
三. 共享對象池
四. 字符串優化
五. 編碼優化
六. 控制key的數量 -
redis 淘汰策略有哪些?
1)voltile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
2)volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
3)volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
4)allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
5)allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
6)no-enviction(驅逐):禁止驅逐數據 -
redis 常見的性能問題有哪些?該如何解決?
1.Master寫內存快照
save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照。
2.Master AOF持久化
如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啓的恢復速度。
3.Master調用BGREWRITEAOF
Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。
4.Redis主從複製的性能問題
第一次Slave向Master同步的實現是:Slave向Master發出同步請求,Master先dump出rdb文件,然後將rdb文件全量傳輸給slave,然後Master把緩存的命令轉發給Slave,初次同步完成。第二次以及以後的同步實現是:Master將變量的快照直接實時依次發送給各個Slave。不管什麼原因導致Slave和Master斷開重連都會重複以上過程。Redis的主從複製是建立在內存快照的持久化基礎上,只要有Slave就一定會有內存快照發生。雖然Redis宣稱主從複製無阻塞,但由於Redis使用單線程服務,如果Master快照文件比較大,那麼第一次全量傳輸會耗費比較長時間,且文件傳輸過程中Master可能無法提供服務,也就是說服務會中斷,對於關鍵服務,這個後果也是很可怕的。
5.單點故障問題
由於目前Redis的主從複製還不夠成熟,所以存在明顯的單點故障問題,這個目前只能自己做方案解決,如:主動複製,Proxy實現Slave對Master的替換等解決:
1.Master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啓用內存快照做持久化。
2.如果數據比較關鍵,某個Slave開啓AOF備份數據,策略爲每秒同步一次。
3.爲了主從複製的速度和連接的穩定性,Slave和Master最好在同一個局域網內。
4.儘量避免在壓力較大的主庫上增加從庫
5.爲了Master的穩定性,主從複製不要用圖狀結構,用單向鏈表結構更穩定,即主從關係爲:Master<–Slave1<–Slave2<–Slave3…,這樣的結構也方便解決單點故障問題,實現Slave對Master的替換,也即,如果Master掛了,可以立馬啓用Slave1做Master,其他不變。
java面試---Redis
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.