天天看點

Redis日常總結

  1. Redis的優點和缺點? redis有哪些類型?

    Redis的優點

    性能極高 – Redis能支援超過 100K+ 每秒的讀寫頻率。

    豐富的資料類型 – Redis支援 String, List, Hash, Set 及 sorted set 資料類型。

    原子 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全并後的原子性執行。

    豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。

    Redis的缺點

    是資料庫容量受到實體記憶體的限制,不能用作海量資料的高性能讀寫,是以Redis适合的場景主要局限在較小資料量的高性能操作和運算上。

    Redis五大資料類型 String, List, Hash, Set 及 sorted set 資料類型

  2. redis String類型有哪些常用指令?列舉4個

    指派文法:

    SET KEY_NAME VALUE: (說明:多次設定name會覆寫) (Redis SET 指令用于設定給定 key 的值。如果 key 已經存儲值, SET 就覆寫舊值,且無視類型)

    指令:

    SETNX key1 value:(not exist) 如果key1不存在,則設值 并傳回1。如果key1存在,則不設值并傳回0;(解決分布式鎖 方案之一,隻有在 key 不存在時設定 key 的值。Setnx(SET if Not eXists) 指令在指定的 key 不存在時,為 key 設定指定的值)

    SETEX key1 10 lx :(expired) 設定key1的值為lx,過期時間為10秒,10秒後key1清除(key也清除)

    SETRANGE string range value: 替換字元串

    取值文法:

    GET KEY_NAME :Redis GET指令用于擷取指定 key 的值。如果 key 不存在,傳回 nil 。如果key 儲存的值不是字元串類型,傳回一個錯誤。

    GETRANGE key start end :用于擷取存儲在指定 key 中字元串的子字元串。字元串的截取範圍由 start 和 end 兩個偏移量決定(包括 start 和 end 在内)

    GETBIT key offset :對 key 所儲存的字元串值,擷取指定偏移量上的位(bit)

    GETSET文法: GETSET KEY_NAME VALUE :Getset 指令用于設定指定 key 的值,并傳回 key 的舊值,當 key 不存在時,傳回 nil

    STRLEN key :傳回 key 所儲存的字元串值的長度

    删值文法:

    DEL KEY_Name :删除指定的KEY,如果存在,傳回值數字類型。

  3. redis String類型有哪些應用場景?列舉4個

    1、驗證碼:

    2、緩存功能:String字元串是最常用的資料類型,不僅僅是redis,各個語言都是最基本類型,是以,利用redis作為緩存,配合其它資料庫作為存儲層,利用redis支援高并發的特點,可以大大加快系統的讀寫速度、以及降低後端資料庫的壓力。

    3、計數器:許多系統都會使用redis作為系統的實時計數器,可以快速實作計數和查詢的功能。而且最終的資料結果可以按照特定的時間落地到資料庫或者其它存儲媒體當中進行永久儲存。

    4、bitmap位圖:可廣泛用于,簽到、活躍、打卡等場景統計。

    5、分布式鎖

  4. redis Hash類型有哪些常用指令?列舉4個

    指派文法:

    HSET KEY FIELD VALUE :為指定的KEY,設定FILD/VALUE

    HMSET KEY FIELD VALUE [FIELD1,VALUE1]…… :同時将多個 field-value (域-值)對設定到哈希表 key 中。

    取值文法:

    HGET KEY FIELD :擷取存儲在HASH中的值,根據FIELD得到VALUE

    HMGET KEY field[field1] :擷取key所有給定字段的值

    HGETALL KEY :傳回HASH表中所有的字段和值

    HKEYS KEY :擷取所有哈希表中的字段

    HLEN KEY :擷取哈希表中字段的數量

    删除文法:

    HDEL KEY field1[field2] :删除一個或多個HASH表字段

  5. redis Hash類型有哪些應用場景?列舉2個

    1. 購物車:以使用者id為key,商品id為field,商品數量為value,恰好構成了購物車的3個要素
    2. 存儲對象:hash類型的(key, field, value)的結構與對象的(對象id, 屬性, 值)的結構相似,也可以用來存儲對象
  6. 描述什麼是緩存穿透及解決方案

    緩存穿透是指查詢一個一定不存在的資料,由于緩存是不命中時需要從資料庫查詢,查不到資料則不寫入緩存,這将導緻這個不存在的資料每次請求都要到資料庫去查詢,造成緩存穿透。

    持久層查詢不到就緩存空結果,查詢時先判斷緩存中是否exists(key) ,如果有直接傳回空,沒有則查詢後傳回,

    注意insert時需清除查詢的key,否則即便DB中有值也查詢不到(當然也可以設定空緩存的過期時間)

    ​ 1、不管資料實際上存不存在,我們都把這個鍵存到緩存中(有效期設定的短一些,比如一分鐘到三分鐘),然後值設定為一個特定值,業務中如果擷取到的結果是這個特定值,則報錯傳回。

    ​ 2、是使用 redis 的布隆過濾器(Bloom Filter),将所有可能存在的資料哈希到一個足夠大的bitmap中,一個一定不存在的資料會被 這個bitmap攔截掉,進而避免了對底層存儲系統的查詢壓力。

  7. 描述什麼是緩存雪崩及解決方案

    雪崩:緩存大量失效的時候,發生大量的緩存穿透, 引發大量查詢資料庫。

    解決辦法:

    緩存預熱(手動走一遍)
    用鎖/分布式鎖或者隊列串行通路
    緩存失效時間均勻分布
               
  8. 描述什麼是熱點key及解決方案

    緩存擊穿是指一個Key非常熱點,在不停的扛着大并發,大并發集中對這一個點進行通路,當這個Key在失效的瞬間,持續的大并發就穿破緩存,直接請求到資料庫,這時,大并發量可能直接将資料庫給挂掉。

    熱點key:某個key通路非常頻繁,當key失效的時候有大量線程來建構緩存,導緻負載增加,系統崩潰

    1 監控告警平台

    2 使用鎖,單機用synchronized,lock等,分布式用分布式鎖。

    3 緩存過期時間不設定,而是設定在key對應的value裡。如果檢測到存的時間超過過期時間則異步更新緩存。

    4 在value設定一個比過期時間t0小的過期時間值t1,當t1過期的時候,延長t1并做更新緩存操作。

    5 設定标簽緩存,标簽緩存設定過期時間,标簽緩存過期後,需異步地更新實際緩存

  9. 描述下Redis叢集的特點、容錯性解決方案

    1、所有的redis節點彼此互聯(PING-PONG機制),内部使用二進制協定優化傳輸速度和帶寬。

    2、節點的fail是通過叢集中超過半數的節點檢測失效時才生效。

    3、用戶端與redis節點直連,不需要中間proxy層.用戶端不需要連接配接叢集所有節點,連接配接叢集中任何一個可用節點即可。

    4、redis-cluster把所有的實體節點映射到[0-16383]slot上(不一定是平均配置設定),cluster 負責維護

    5、Redis叢集預分好16384個哈希槽,當需要在 Redis 叢集中放置一個 key-value 時, redis 先對key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編号在 0-16383 之間的哈希槽,redis 會根據節點數量大緻均等的将哈希槽映射到不同的節

    什麼時候判斷master不可用?

    ​ 投票機制。投票過程是叢集中所有master參與,如果半數以上master節點與master節點通信逾時(cluster-node-timeout),認為目前master節點挂掉.

  10. 什麼情況下Redis整個叢集會不可用

    如果叢集任意master挂掉,且目前master沒有slave.叢集進入fail狀态,也可以了解成叢集的slot映射[0-16383]不完整時進入fail狀态. 如果叢集超過半數以上master挂掉,無論是否有slave,叢集進入fail狀态.