91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

掌握之分布式-4.緩存

發布時間:2020-07-22 04:11:21 來源:網絡 閱讀:247 作者:學習Lr 欄目:編程語言

掌握高并發、高可用架構

第三章 分布式

本章介紹分布式架構的底層技術。主要說明面試過程中可能被問到的技術點。

第四節 緩存

緩存穿透 緩存學雪崩 Redis Memcached Guava

1. 緩存使用中的幾個問題
  • 緩存穿透:查詢緩存和數據庫中一定不存在的數據時,每次查詢都是直接到數據庫的,這種現象稱為緩存穿透

    此時,如果有大量的請求時,會對數據庫造成直接沖擊,甚至會導致崩潰

    1. 緩存空數據
    2. 使用BloomFilter(布隆過濾器),即緩存數據庫中所有存在的Key
  • 緩存雪崩:緩存服務器宕機了,那么所有查詢直接落在數據庫,對數據庫造成巨大壓力

    1. 使用緩存集群,增大可用性
    2. 本地緩存
    3. 使用Hystrix(熔斷器),它通過熔斷、降級、限流三個手段來降低雪崩造成的損失
    4. 持久化機制
  • 熱點數據集中失效:本身大批量數據同時失效對Redis服務器也會造成影響,可能會出現慢的情形;再者失效期間,所有的用戶請求都會落到數據庫上,也會對數據庫造成巨大的壓力

    1. 使用互斥鎖,當發現緩存失效后,第一個請求加鎖,然后去查詢數據庫,把數據存入緩存,這個操作只有一次,其他的請求都是阻塞的,查詢執行完成后釋放鎖,此時已經有了緩存數據,也不會對數據庫造成壓力了
    2. 對熱點數據設置不同的失效時間,加上時間戳
2. Redis的數據結構
  • string

    Redis的最基本的數據結構,可以包含任意數據。一個key對應一個string的value。string類型是二進制安全的。每個string的value最大可以512M
    支持的方法:set、get、mset、mget、setex、setnx

  • list

    列表,一個簡單的字符串列表,按照插入的順序排序,可以向頭部(左邊)或尾部(右邊)添加數據,底層是鏈表
    支持的方法:lpush、lpushx、lpop、lrange、lset、lindex、llen、rpush、rpop

  • set

    string的無序集合
    支持的方法:sadd、scard、sdiff、sinter、sunion、sismember、smembers

  • zset(sorted set)

    sorted set有序集合,也是string的集合,但是有序的
    支持的方法:zadd、zcard

  • hash

    hash是一個鍵值對集合,是一個string類型的key(這里叫做field)和value的映射表,key相當于hash的名字,類似于Java中的Map<String, Map<String, String>>
    支持的方法:hset、hget、hdel、hexists、hkeys、hlen、hgetall

    3. Redis適合的場景
    • 會話緩存(Session Cache)
    • 全頁緩存(FPC)
    • 隊列,利用list數據結構
    • 排行榜/計時器,利用zset
    • 發布/訂閱系統
    4. Redis處理并發競爭問題

    Redis采用單進程單線程模式,本身沒有鎖的概念,其對于多個客戶端訪問不存在并發的問題

    通過jedis客戶端進行并發訪問時會出現連接超時、數據轉換錯誤、阻塞等,通過以下方式解決:

    • 客戶端與Redis通信時,可以對連接進行池化,每個對Redis的讀寫操作均采用synchronized
    • 服務器端可以使用setnx
    5. Redis設置過期時間
    • 在set key的時候,可以指定expire time,也就是過期時間
    • Jedis有單獨的expire方法

    redis通過定期刪除惰性刪除來刪除過期的key

    • 定期刪除,Redis每隔100ms就隨機抽取一些設置了過期時間的key,檢查其是否過期,如果過期就刪除。因為數據量巨大,遍歷全部key不現實,太耗CPU,所以是隨機的
    • 惰性刪除,發起查看key時,會查看key是否過期,如果過期則刪除

    只靠這兩種機制還是刪除不完全的,此時就需要內存淘汰機制了

    6. Redis內存淘汰機制(如何保證熱點)
    • volatile-lru:從已設置過期時間的數據集合(server.db[i].expires)挑選最近最少使用的數據淘汰
    • volatile-ttl:從已設置過期時間的數據集合中挑選將要過期的數據淘汰
    • volatile-random:從已設置過期時間的數據集合中隨機挑選數據刪除
    • allkeys-lru:在鍵空間中挑選最少使用的數據淘汰(這種策略最常用)
    • allkeys-random:從數據集(server.db[i].dict)中隨機淘汰
    • no-eviction:禁止淘汰數據,當寫入數據時報錯處理

    4.0新增

    • volatile-lfu:從已設置過期時間的集合中挑選最不常用的數據淘汰
    • allkeys-lfu:在鍵空間中挑選最不常用的數據淘汰
    7. Redis的持久化策略

    支持兩種持久化策略:一種是快照(snapshotting,RDB),另一種是只追加文件(append-only file,AOF)

    • 快照持久化(RDB),通過創建快照來存儲在內存里的數據在某個時間點的副本;創建快照之后,可以對快照進行備份,可以將快照復制到其他服務器,還可以留在本地

    是默認的持久化方式。在redis.conf中有以下配置

    save 900 1 #在900秒(15分鐘)之后,如果至少有1個key發生變化,就會觸發BFSAVE創建快照
    save 300 10 #在300秒(5分鐘)之后,如果至少有10個key發生變化,就會觸發BFSAVE創建快照
    save 60 10000 #在60秒(1分鐘)之后,如果至少有10000個key發生變化,就會觸發BFSAVE創建快照
    • AOF(append-only file),AOF的實時性更好,默認沒有開啟,通過以下設置進行開啟
    appendonly yes

    開啟AOF后,每執行一條更改數據的命令,Redis就將該命令寫入硬盤中的AOF文件

    在redis.conf中有三種不同的AOF配置

    appendfsync always #每次更改數據都會寫入AOF文件,這會嚴重降低Redis的性能
    appendfsync everysec #每秒同步一次,將多個命令同步到磁盤
    appendfsync no #由操作系統決定何時同步
    8. Redis事務

    通過MULTIEXECWATCH等命令來實現事務功能

    9. Redis的分布式鎖

    通過setnx實現

    10. Redis與Memcached的區別
    • Redis支持豐富的數據結構,Memcached僅支持字符串
    • Redis支持持久化,Memcached不支持
    • Redis支持主從、哨兵、Cluster的集群模式,Memcached沒有
    • Redis是單線程多路IO復用模型,Memcached是多線程非阻塞IO復用模型
    11. Redis的集群
    • 主從模式

    主數據庫(master)和從數據庫(slave)

    • 主數據庫進行讀寫操作,當數據發生變化時會自動同步到從數據庫
    • 從數據庫是只讀的
    • 一個master對應多個slave,一個slave只能有一個master

    • 哨兵模式

    哨兵的作用是監控Redis系統的運行情況

    • 監控主從是否正常運行
    • master出現故障時,自動將slave轉換為master
    • 多哨兵之間也會互相監控
    • 多個哨兵監控一個master

    • 集群模式

    只要將每個節點的cluster-enable配置打開即可,每個集群最少三個節點

Memecached

選擇Memcached的理由:簡單

本地緩存:Ehcache、Guava
Redis和Memcached的區別
  1. Redis支持的數據結構更豐富
  2. Redis支持持久化,Memcached不支持
  3. Memcached沒有原生的集群模式,而Redis有主從、哨兵、集群
  4. Memcached是多線程、非阻塞IO復用的網絡模型,Redis是單線程多路IO復用的網絡模型
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

温泉县| 东莞市| 邯郸市| 乐业县| 古浪县| 长子县| 灯塔市| 永城市| 正定县| 土默特左旗| 古交市| 乌鲁木齐县| 元氏县| 绥江县| 新乡县| 新乡市| 南投县| 浦城县| 巨野县| 旬阳县| 芦溪县| 托克托县| 金华市| 枣阳市| 建始县| 常山县| 海宁市| 壤塘县| 康乐县| 库车县| 大同县| 磴口县| 襄垣县| 威信县| 同仁县| 余庆县| 广元市| 梁山县| 宿州市| 和田市| 公安县|