色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何說服技術老大用Redis?

OSC開源社區 ? 來源:OSC開源社區 ? 2023-05-18 10:38 ? 次閱讀
bcf2147a-f4d8-11ed-90ce-dac502259ad0.png這個問題很微妙,可能這位同學內心深處,覺得 Redis 是所有應用緩存的標配。緩存的世界很廣闊,對于應用系統來講,我們經常將緩存劃分為本地緩存分布式緩存。本地緩存:應用中的緩存組件,緩存組件和應用在同一進程中,緩存的讀寫非???,沒有網絡開銷。但各應用或集群的各節點都需要維護自己的單獨緩存,無法共享緩存。分布式緩存:和應用分離的緩存組件或服務,與本地應用隔離,多個應用可直接共享緩存。

1 緩存的本質

我們常常會講:“加了緩存,我們的系統就會更快” 。所謂的 “更快”,本質上做到了如下兩點:
  • 減小 CPU 消耗

    將原來需要實時計算的內容提前算好、把一些公用的數據進行復用,這可以減少 CPU 消耗,從而提升響應性能。

  • 減小 I/O 消耗

    將原來對網絡、磁盤等較慢介質的讀寫訪問變為對內存等較快介質的訪問,從而提升響應性能。

假如可以通過增強 CPU、I/O 本身的性能來滿足需求的話,升級硬件往往是更好的解決方案,即使需要一些額外的投入成本,也通常要優于引入緩存后可能帶來的風險。從開發角度來說,引入緩存會提高系統復雜度,因為你要考慮緩存的失效、更新、一致性等問題。從運維角度來說,緩存會掩蓋掉一些缺陷,讓問題在更久的時間以后,出現在距離發生現場更遠的位置上。從安全角度來說,緩存可能泄漏某些保密數據,也是容易受到攻擊的薄弱點。因此,緩存是把雙刃劍。

2 本地緩存 JDK Map

JDK Map 經常用于緩存實現:
  • HashMap

    HashMap 是一種基于哈希表的集合類,它提供了快速的插入、查找和刪除操作。可以將鍵值對作為緩存項的存儲方式,將鍵作為緩存項的唯一標識符,值作為緩存項的內容。

  • ConcurrentHashMap

    ConcurrentHashMap 是線程安全的 HashMap,它在多線程環境下可以保證高效的并發讀寫操作。

  • LinkedHashMap

    LinkedHashMap 是一種有序的 HashMap ,它保留了元素插入的順序,可以按照插入順序或者訪問順序進行遍歷。

  • TreeMap

    TreeMap 是一種基于紅黑樹的有序 Map,它可以按照鍵的順序進行遍歷。

筆者曾經負責藝龍紅包系統,紅包活動就是存儲在ConcurrentHashMap中 ,通過定時任務刷新緩存。bd058c3a-f4d8-11ed-90ce-dac502259ad0.png核心流程:1、紅包系統啟動后,初始化一個 ConcurrentHashMap 作為紅包活動緩存 ;2、數據庫查詢所有的紅包活動,并將活動信息存儲在 Map 中;3、定時任務每隔 30 秒 ,執行緩存加載方法,刷新緩存。為什么紅包系統會將紅包活動信息存儲在本地內存 ConcurrentHashMap 呢 ?
  • 紅包系統是高并發應用,快速將請求結果響應給前端,大大提升用戶體驗;

  • 紅包活動數量并不多,就算全部放入到 Map 里也不會產生內存溢出的問題;

  • 定時任務刷新緩存并不會影響紅包系統的業務。

筆者見過很多單體應用都使用這種方案,該方案的特點是簡潔易用,工程實現也容易 。

3 本地緩存框架

雖然使用 JDK Map 能快捷構建緩存,但緩存的功能還是比較孱弱的。因為現實場景里,我們可能需要給緩存添加緩存統計、過期失效、淘汰策略等功能。于是,本地緩存框架應運而生。流行的 Java 緩存框架包括:Ehcache , Google Guava , Caffine Cache 。bd1b4a52-f4d8-11ed-90ce-dac502259ad0.png下圖展示了 Caffine 框架的使用示例。bd2b5a8c-f4d8-11ed-90ce-dac502259ad0.png雖然本地緩存框架的功能很強大,但是本地緩存的缺陷依然明顯。1、高并發的場景,應用重啟之后,本地緩存就失效了,系統的負載就比較大,需要花較長的時間才能恢復;2、每個應用節點都會維護自己的單獨緩存,緩存同步比較頭疼。

4 分布式緩存

分布式緩存是指將緩存數據分布在多臺機器上,以提高緩存容量和并發讀寫能力的緩存系統。分布式緩存通常由多臺機器組成一個集群,每臺機器上都運行著相同的緩存服務進程,緩存數據被均勻地分布在集群中的各個節點上。Redis 是分布式緩存的首選,甚至我們一提到緩存,很多后端工程師首先想到的就它。下圖是神州專車訂單的 Redis 集群架構 。將 Redis 集群拆分成四個分片,每個分片包含一主一從,主從可以切換。應用 A 根據不同的緩存 key 訪問不同的分片。bd851ffe-f4d8-11ed-90ce-dac502259ad0.png與本地緩存相比,分布式緩存具有以下優點:1、容量和性能可擴展通過增加集群中的機器數量,可以擴展緩存的容量和并發讀寫能力。同時,緩存數據對于應用來講都是共享的。2、高可用性由于數據被分布在多臺機器上,即使其中一臺機器故障,緩存服務也能繼續提供服務。但是分布式緩存的缺點同樣不容忽視。1、網絡延遲分布式緩存通常需要通過網絡通信來進行數據讀寫,可能會出現網絡延遲等問題,相對于本地緩存而言,響應時間更長。2、復雜性分布式緩存需要考慮序列化、數據分片、緩存大小等問題,相對于本地緩存而言更加復雜。筆者曾經也認為無腦上緩存 ,系統就一定更快,但直到一次事故,對于分布式緩存的觀念才徹底改變。2014 年,同事開發了比分直播的系統,所有的請求都是從分布式緩存 Memcached 中獲取后直接響應。常規情況下,從緩存中查詢數據非常快,但在線用戶稍微多一點,整個系統就會特別卡。通過 jstat 命令發現 GC 頻率極高,幾次請求就將新生代占滿了,而且 CPU 的消耗都在 GC 線程上。初步判斷是緩存值過大導致的,果不其然,緩存大小在 300k 到 500k 左右。解決過程還比較波折,分為兩個步驟:
  1. 修改新生代大小,從原來的 2G 修改成 4G,并精簡緩存數據大小 (從平均 300k 左右降為 80k 左右);

  2. 緩存拆成兩個部分,第一部分是全量數據,第二部分是增量數據(數據量很?。?。頁面第一次請求拉取全量數據,當比分有變化的時候,通過 websocket 推送增量數據。

經過這次優化,筆者理解到:緩存雖然可以提升整體速度,但是在高并發場景下,緩存對象大小依然是需要關注的點,稍不留神就會產生事故。另外我們也需要合理地控制讀取策略,最大程度減少 GC 的頻率,從而提升整體性能。

5 多級緩存

開源中國網站最開始完全是用本地緩存框架 Ehcache 。后來隨著訪問量的激增,出現了一個可怕的問題:“因為 Java 程序更新很頻繁,每次更新的時候都要重啟。一旦重啟后,整個 Ehcache 緩存里的數據都被清掉。重啟后若大量訪問進來的話,開源中國的數據庫基本上很快就會崩掉”。于是,開源中國開發了多級緩存框架J2Cache,使用了多級緩存Ehcache + Redis。多級緩存有如下優勢:
  1. 離用戶越近,速度越快;

  2. 減少分布式緩存查詢頻率,降低序列化和反序列化的 CPU 消耗;

  3. 大幅度減少網絡 IO 以及帶寬消耗。

本地緩存做為一級緩存,分布式緩存做為二級緩存,首先從一級緩存中查詢,若能查詢到數據則直接返回,否則從二級緩存中查詢,若二級緩存中可以查詢到數據,則回填到一級緩存中,并返回數據。若二級緩存也查詢不到,則從數據源中查詢,將結果分別回填到一級緩存,二級緩存中。bda46134-f4d8-11ed-90ce-dac502259ad0.png2018 年,筆者服務的一家電商公司需要進行 app 首頁接口的性能優化。筆者花了大概兩天的時間完成了整個方案,采取的是兩級緩存模式,同時利用了 Guava 的惰性加載機制,整體架構如下圖所示:bdb3db64-f4d8-11ed-90ce-dac502259ad0.png緩存讀取流程如下:1、業務網關剛啟動時,本地緩存沒有數據,讀取 Redis 緩存,如果 Redis 緩存也沒數據,則通過 RPC 調用導購服務讀取數據,然后再將數據寫入本地緩存和 Redis 中;若 Redis 緩存不為空,則將緩存數據寫入本地緩存中。2、由于步驟 1 已經對本地緩存預熱,后續請求直接讀取本地緩存,返回給用戶端。3、Guava 配置了 refresh 機制,每隔一段時間會調用自定義 LoadingCache 線程池(5 個最大線程,5 個核心線程)去導購服務同步數據到本地緩存和 Redis 中。優化后,性能表現很好,平均耗時在 5ms 左右。最開始我以為出現問題的幾率很小,可是有一天晚上,突然發現 app 端首頁顯示的數據時而相同,時而不同。也就是說:雖然 LoadingCache 線程一直在調用接口更新緩存信息,但是各個 服務器本地緩存中的數據并非完成一致。說明了兩個很重要的點:1、惰性加載仍然可能造成多臺機器的數據不一致2、LoadingCache 線程池數量配置的不太合理,導致了線程堆積最終,我們的解決方案是:1、惰性加載結合消息機制來更新緩存數據,也就是:當導購服務的配置發生變化時,通知業務網關重新拉取數據,更新緩存。2、適當調大 LoadigCache 的線程池參數,并在線程池埋點,監控線程池的使用情況,當線程繁忙時能發出告警,然后動態修改線程池參數。

6 沒有銀彈

沒有銀彈是 Fred Brooks 在 1987 年所發表的一篇關于軟件工程的經典論文。論文強調真正的銀彈并不存在,而所謂的銀彈則是指沒有任何一項技術或方法可以能讓軟件工程的生產力在十年內提高十倍。通俗來講:在技術領域中沒有一種通用的解決方案可以解決所有問題。技術本質上是為了解決問題而存在的,每個問題都有其獨特的環境和限制條件,沒有一種通用的技術或工具可以完美地解決所有問題。雖然技術不斷發展和進步,但是對于復雜的問題,仍需要結合多種技術和方法,進行系統性的思考和綜合性的解決方案設計,才能得到最優解決方案。回到文章開頭的問題 ,如何說服技術老大用 Redis ?假如應用就是一個單體應用,緩存可以不共享,通過定時任務刷新緩存對業務沒有影響,而且本地內存可以 Hold 住緩存的對象大小,那么你的技術老大的方案沒有問題。假如應用業務比較復雜,需要使用緩存提升系統的性能,同時分布式緩存共享的特性對于研發來講開發更加快捷,Redis 確實是個不錯的選擇,可以從研發成本、代碼維護、人力模型等多個角度和技術老大提出自己的觀點。總而言之,在技術領域中,沒有銀彈。我們需要不斷探索和研究新的技術,但同時也需要認識到技術的局限性,不盲目追求所謂的 “銀彈”,而是結合具體問題和需求,選擇最適合的解決方案。
審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    403

    瀏覽量

    17476
  • 磁盤
    +關注

    關注

    1

    文章

    375

    瀏覽量

    25201
  • Redis
    +關注

    關注

    0

    文章

    374

    瀏覽量

    10871
收藏 人收藏

    評論

    相關推薦

    如何使用Rust連接Redis

    Redis是一款快速、開源、鍵值存儲數據庫,被廣泛應用于緩存、發布/訂閱系統、定時任務等場景中。Rust提供了很多Redis的客戶端庫,本教程將會介紹如何使用Rust連接Redis,以及如何通過
    的頭像 發表于 09-19 16:22 ?2349次閱讀

    Redis Stream應用案例

    讀取結果,在APP或者web頁面上進行展示,從而整個系統形成一個閉環。作者簡介夏德軍,花名夏周,阿里云Redis技術專家,負責阿里云Redis內核開發和維護。活躍于開源社區,Redis
    發表于 06-26 17:15

    redis概述

    REmote DIctionary Server(Redis)是一個基于key-value鍵值對的持久化數據庫存儲系統。redis和大名鼎鼎的Memcached緩存服務軟件很像,但是redis支持
    發表于 07-17 07:38

    Redis使用總結

    Spring+SpringMVC+MyBatis+easyUI整合進階篇(十四)Redis緩存正確的使用姿勢
    發表于 09-05 08:31

    laravel使用redis

    laravel操作redis筆記!
    發表于 09-24 09:40

    啟動Redis的三種方法

    Redis筆記(1)——安裝、卸載、三種方法啟動Redis,Redis命令使用(干貨十足),Redis兩種方法設置密碼,時間復雜度(更完善哦~)
    發表于 06-08 16:09

    如何使得redis中的數據不再有

    嵌入式Linux系統重啟后如何使得redis中的數據不再有今天在工作中遇到一個問題:網頁展示redis中的數據,然而再Linux系統重啟后網頁還能展示redis中的數據,感覺很奇怪,到網上搜了下
    發表于 11-05 08:50

    labview讀寫操作REDIS

    本帖最后由 SevenLi8408 于 2022-9-15 08:07 編輯 分享一個好用的非關系型緩存數據庫的使用方法。REDIS桌面管理軟件https://github.com
    發表于 08-15 10:32

    什么是 Redis

    ? — ? 1 ?— 什么是 RedisRedis(REmote DIctionary Service)是一個開源的鍵值對數據庫服務器。 Redis 更準確的描述是一個數據結構服務器。Re
    的頭像 發表于 05-22 15:32 ?1106次閱讀
    什么是 <b class='flag-5'>Redis</b>

    Redis的主從、哨兵、Redis Cluster集群

    ? 前言 今天跟小伙伴們一起學習Redis的主從、哨兵、Redis Cluster集群。 Redis主從 Redis哨兵 Redis Clu
    的頭像 發表于 06-12 14:58 ?827次閱讀
    <b class='flag-5'>Redis</b>的主從、哨兵、<b class='flag-5'>Redis</b> Cluster集群

    Redis 的數據清理策略

    本文整理 Redis 的數據清理策略所有代碼來自 Redis version :5.0, 不同版本的 Redis 策略可能有調整
    發表于 09-19 14:24 ?375次閱讀
    <b class='flag-5'>Redis</b> 的數據清理策略

    如何用Springboot整合Redis

    本篇文件我們來介紹如何用Springboot整合Redis。 1、Docker 安裝 Redis 1.1 下載鏡像 docker pull redis: 6 . 2 . 6 1.2 創建配置文件
    的頭像 發表于 10-08 14:56 ?581次閱讀
    如何用Springboot整合<b class='flag-5'>Redis</b>

    Java redis鎖怎么實現

    在Java中實現Redis鎖涉及到以下幾個方面:Redis的安裝配置、Redis連接池的使用、Redis數據結構的選擇、實現分布式鎖的幾種方式等。 一、
    的頭像 發表于 12-04 10:47 ?1159次閱讀

    redis容器內怎么查看redis日志

    redis是一款流行的開源內存數據庫,常用于緩存、消息隊列、任務管理等場景。在使用redis時,了解如何查看redis日志對于排查問題、監控性能和分析應用程序行為非常重要。在本文中,我們將介紹在
    的頭像 發表于 12-05 10:10 ?3638次閱讀

    Redis開源版與Redis企業版,怎么選用?

    點擊“藍字”關注我們數以千計的企業和數以百萬計的開發人員Redis開源版來構建應用程序。但隨著用戶數量、數據量和地區性的增加,成本、可擴展性、運營和可用性等問題也隨之而來。Redis企業版
    的頭像 發表于 04-04 08:04 ?1052次閱讀
    <b class='flag-5'>Redis</b>開源版與<b class='flag-5'>Redis</b>企業版,怎么選用?
    主站蜘蛛池模板: 欧美高清video mr.sexo| 2019久久这里只精品热在线观看| 成人1000部免费观看视频| 國產日韓亞洲精品AV| 国产乱码卡二卡三卡4W| 青柠在线观看免费高清电视剧荣耀| 中字幕视频在线永久在线| 精品国产露脸久久AV麻豆| 亚洲成年男人的天堂网| 国产精品久久久久久精品...| 三级网站视频| 成人在免费视频手机观看网站| 欧美日韩亚洲中字二区| 97影院午夜午夜伦不卡| 久色视频网| 中文字幕在线永久| 久亚洲AV无码专区A片| 中文乱码35页在线观看| 久久久精品3d动漫一区二区三区| 亚洲野狼综合网站| 精品国产乱码久久久久久口爆| 亚洲欧美国产综合在线一区| 国产亚洲精品久久播放| 亚洲AV国产福利精品在现观看| 国产精品午夜小视频观看| 香蕉鱼视频观看在线视频下载| 国产精品久久久久久久AV下载| 私密按摩师在线观看 百度网盘 | 97se se| 久久无码av三级| 最新2017年韩国伦理片在线| 久久有码中文字幕| 4399日本电影完整版在线观看免费 | 亚洲a免费| 国产日韩欧美另类| 亚洲精品久久久午夜福利电影网| 国产最新进精品视频| 亚洲视频在线看| 麻豆Av国产在线播放| 99re6久久在热线视频| 欧美日韩亚洲中字二区|