Redis學習知識點

1.Redis的應用場景?

	1.Token令牌的生成
	2.短信驗證碼的code
	3.可以實現緩存查詢數據 a. 減輕我們的數據庫的訪問壓力 Redis與mysql數據庫不同步的問題
	4.Redis幫助實現計數器
	5.分佈式鎖
	6.延遲操作  分佈式消息中間件

注意:Redis官方是沒有windows版本的,只有linux,這時候因爲 在nio中epoll只有linux操作系統獨有

2.Redis線程模型?

	Redis的採用NIO的IO多路複用原則,也就是一個線程維護多個不同的Redis客戶端連接,從而提高處理
併發效率和保證線程安全問題.底層採用linux操作系統的epoll技術避免空輪詢.

3.Redis數據結構?

String類型、Hsh類型、List類型、Set類型 、Sorted-Sets
String: 存儲 set key value ; 獲取 get key
Hsh: 存儲 hmset key  zhang 28  li 27  liu 23;  獲取  hget key zhang/li/liu
list: 存儲 lpush key  xiaomi xiaojun xiaoqiang ;獲取 lrange key 0(開始位置) 3(結束)
			移出第一個元素並獲得: lpop key 
set: 存儲 sadd key xiao1 xiao2 xiao3 xiao3(不能重複,無序) 存儲3個元素
			獲取 smembers key
sortset:存儲 zadd key 1 zhang  zadd key 2 li  zadd key 3 zhang
			(序號 值 ;有序的,值不能重複,重複存入,序號會覆蓋之前序號,取值按照序號排序)
			獲取 zrange key 0 10 withscores(帶上此參數,取值包含序號)

4.SpringBoot整合redis使用注意事項:

1.使用對象必須序列化 implements Serializable
2. private RedisTemplate<String ,Object> redisTemplate;使用@Resource注入,
		不能使用@Autowired,因爲按照類型找的autoWired找不到這種泛型類

5.Mysql和Redis的數據不同步的問題如何解決?

方式一 直接清理Redis的緩存,重新查詢數據庫即可.
方式二 直接採用MQ訂閱mysql binlog日誌文件增量同步到redis中.
方式三 使用alibaba的canal框架

6.Redis的持久化機制?

大部分的緩存框架都會有基本功能淘汰策略,持久機制.
Redis的持久化的機制有兩種: 
	AOF(增量):基於數據日誌操作實現的持久化. 開啓方式:redis.conf中 appendonly改爲 yes
	AOF的三種同步方式:
		appendfsync always 每次有數據修改發生時都會寫入AOF文件,能夠數據不丟失,
		                   但是效率非常低.例1S1000個請求,就會顯得低效
		appendfsync everysec 每秒鐘同步一次,該策略爲AOF的缺省(默認)策略(缺點:1秒內數據可能丟失)
		appendfsync no    從不同步,高效但是數據不會被持久化
	    建議最好使用everysec既能夠保證數據的同步,效率還可以.
	RDB(默認,全量):採用定時持久化機制,但是服務器因爲某種原因宕機可能會數據丟失.
	全量同步和增量同步區別:
	   全量:就是每天定時(避開高峯期)或者是採用一種週期的實現將數據拷貝另外一個地方.頻率不是很大,但是可能會造     	
	       成數據的丟失.
	   增量:增量同步採用行爲操作對數據的實現同步,頻率非常高,對服務器同步的壓力非常大,能保證數據不丟失.

7.RDB和AOF同步的區別?

1.RDB屬於全量同步(定時同步)
  優點:同步效率非常高  缺點:數據可能會丟失
2.AOF屬於增量同步 有點偏向實時
  優點:同步效率稍稍有些低,最多隻會丟失1s中的數據
  平衡點:既要求效率高,數據不丟失,肯定使用AOFd everysec

8.Redis六種淘汰策略? 設置Redis 內存大小的限制,我們可以設置maxmemory 比如:maxmemory 300mb

noeviction:當內存使用達到閾值的時候,執行命令直接報錯 
allkeys-lru:在所有的key中,優先移除最近未使用的key。(推薦)
volatile-lru:在設置了過期時間的鍵空間中,優先移除最近未使用的key。
allkeys-random:在所有的key中,隨機移除某個key。
volatile-random:在設置了過期時間的鍵空間中,隨機移除某個key。
volatile-ttl:在設置了過期時間的鍵空間中,具有更早過期時間的key優先移除。

9.Redis事務操作

1.Multi : 開啓事務
2.EXEC  : 提交事務
3.Watch : 可以監聽一個或者多個key,在提交事務之前是否有發生了變化,如果發生了變化就不會提交事務,
		  沒有發生變化纔可以提交事務.(版本號 ,樂觀鎖)
4.Discard : 取消提交事務 (注意:redis官方是沒有提供回滾方法,只提供了取消事務)
在Redis中使用multi對key開啓事務,其他的線程開始可以對該key執行set操作.
         (該key的value最終值爲最後一個提交事務對此key賦的值)
Watch監聽我們的key在提交事務之前是否有發生過變化,如果有發生過變化時無法提交數據的.

10.取消事務和回滾有什麼區別呢?

1.mysql中開啓事務,對該行數據上行鎖  commit提交事務
      回滾:對事物取消和行鎖都會撤銷
  redis沒有回滾,單純取消事務(不提交事務) 不上鎖

11.什麼是分佈式鎖?

1.本地鎖:在多個線程中,保證只有一個線程執行(線程安全的問題)
2.分佈式鎖:在分佈式中,保證只有一個jvm執行(多個jvm線程安全問題)
如果我們服務器是集羣的時候,定時任務可能會重複執行,可以採用分佈式鎖解決.

12.分佈式鎖實現方案:

1.基於數據庫方式實現(low不用)
2.基於ZK方式實現,採用臨時節點+事件通知
3.基於Redis方式實現, setNX方式

13.解決分佈式鎖核心思路?

1.獲取鎖: 多個不同的jvm同時創建一個相同的標記(全局唯一的(Setnx命令,redis的key必須保證是唯一的))
		  ,只要誰能夠創建成功,誰就能獲取鎖.
2.釋放鎖: (對我們的redis的key設置一個有效期,或者主動刪除key),可以靈活自動釋放該全局唯一的標記,
		  其他jvm重新進入到獲取鎖資源.
3.超時鎖, 等待獲取鎖的超時時間  ,已經獲取到鎖,設置鎖的有效期

14.redis主從複製原理過程?

1.需要在從redis服務器上配置slaveof 指向主redis服務器ip地址和端口號和密碼.
2.從redis服務器和主redis服務器建立Socket長連接
3.採用全量和增量形式將數據同步給從Redis服務器
    全量:從Redis首次啓動的時候(二進制執行dump文件) rdb
	增量:主Redis每次有新的set請求時候aof日誌文件

15.redis主從複製有哪些缺陷?

如果主的節點宕機之後,可能會導致整個redis服務不能夠實現寫操作,需要我們人爲重新修改新的主的操作.

16.什麼是哨兵機制?

就是解決我們在主從複製中,選舉問題.

17.Redis哨兵底層原理?

1.哨兵機制每隔10秒時間,只需要配置監聽我們的主(Master)的Redis服務器,就可以採用遞歸的形式獲取到
	  整個redis集羣服務列表,原理就是info replication 
2.哨兵不建議單臺,哨兵的集羣數量建議和Redis服務數量一致.	
3.Redis哨兵機制底層是如何實現一個羣體呢?多個哨兵都會同時執行監聽到同一個master節點,訂閱相同
	  通道(主題),有新的哨兵加入的時候都會將自己服務器的信息發送到主題中,隨後相互實現建立長連接.
4.master節點如果宕機時候 ,如何實現選舉策略?
	單個哨兵會向主master節點發送ping的命令,如果這時候master節點沒有及時的響應的話,這時候單個哨兵
	會認爲該master主觀不可用狀態;這時候單個哨兵會通知其他的哨兵去確認該master節點是否是宕機狀態,
	如果有超過>=配置文件配置  認爲宕機狀態,就開始實現重新選舉新的領導.

18.Redis安全相關內容

緩存穿透:緩存穿透是指使用指定key(不存在的key),頻繁的高併發查詢,導致緩存無法命中;
        每次的查詢都會一直查詢數據庫 ,那麼這時候對我們的數據庫壓力是非常大的.
	(例:根據id查信息,使用一個無效的id不停的高併發查詢.就會繞過緩存,且數據庫查不到數據也無法保存到redis)
	解決方案:1.接口實現api的限流 , 防禦ddos攻擊.接口頻率限制 (網關實現黑名單)
		    2.從數據庫和redis如果都查詢不到數據情況下,將數據庫的空值寫入到緩存中,
			     加上短時間的有效期(只適合單個key)
			3.布隆過濾器

緩存擊穿:
	熱點key:經常使用到key
	在高併發的情況下.當一個熱點key過期時,因爲訪問該key請求過多,多個請求同時發現改緩存key過期,
	這時候同時查詢數據庫,同時將數據庫內容放入到我們的redis緩存中,對我們數據庫壓力非常大.
	解決方案: 1.使用分佈式鎖技術:多個請求同時只要誰能夠獲取到鎖,誰就能夠去查詢數據庫查詢,
	              將數據查詢的結果放入redis中,沒有獲取到鎖的請求先等待;獲取到鎖的請求將數據寫入
	              成功到redis中,通知沒有獲取鎖的請求直接從redis獲取數據即可.(適合服務器集羣)
			  2.本地鎖與分佈式鎖一樣的;
			  3.軟過期 ,對熱點key設置無限有效期或者異步延長時間

緩存雪崩:
	緩存雪崩指的就是我們的redis服務器重啓(沒有持久化)或者是大量的key集中失效,
	   突然對我們的數據庫壓力非常大
	解決思路:過期時間隨機或者是設置不一樣的過期時間;	

19.傳統的哨兵集羣方式存在哪些缺陷?

1.redis的哨兵集羣方式,每個節點都保存相同的同步數據,可能會存在冗餘的數據;
  其次只能允許有一個主的節點;屬於中心化集羣;

20.Redis Cluster 從3.0開始是Redis官方推出一種去中心化的集羣方式.採用hash槽分片的將數據存放到多個

不同的Redis中,從而可以去減少冗餘的數據.	
核心原理:
   採用hash槽,預先分配16384個卡槽,並且將卡槽分配到具體Redis的節點,通過key進行crc16(key)%16384=卡槽
	可以根據卡槽存到具體Redis節點,注意一個卡槽可以存放多個不同的key.只有主的節點纔會分配卡槽,
	從節點沒有卡槽.
卡槽作用:
決定key存放具體的服務器位置,從而實現均攤存放數據.類似我們的數據庫中具體的分表, 優點:動態實現擴容和縮容;		
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章