java源代碼保存在擴展名為,看完跪了

正文

在實際的工作項目中, 緩存成為高并發、高性能架構的關鍵組件 ,那么Redis為什么可以作為緩存使用呢?首先可以作為緩存的兩個主要特征:

  • 在分層系統中處于內存/CPU具有訪問性能良好,
  • 緩存數據飽和,有良好的數據淘汰機制

由于Redis 天然就具有這兩個特征,Redis基于內存操作的,且其具有完善的數據淘汰機制,十分適合作為緩存組件。

其中,基于內存操作,容量可以為32-96GB,且操作時間平均為100ns,操作效率高。而且數據淘汰機制眾多,在Redis 4.0 后就有8種了促使Redis作為緩存可以適用很多場景。

那Redis緩存為什么需要數據淘汰機制呢?有哪8種數據淘汰機制呢?

數據淘汰機制

Redis緩存基于內存實現的,則其緩存其容量是有限的,當出現緩存被寫滿的情況,那么這時Redis該如何處理呢?

Redis對于緩存被寫滿的情況,Redis就需要緩存數據淘汰機制,通過一定淘汰規則將一些數據刷選出來刪除,讓緩存服務可再使用。那么Redis使用哪些淘汰策略進行刷選刪除數據?

在Redis 4.0 之后,Redis 緩存淘汰策略6+2種,包括分成三大類:

  • 不淘汰數據

    • noeviction ,不進行數據淘汰,當緩存被寫滿后,Redis不提供服務直接返回錯誤。
  • 在設置過期時間的鍵值對中,

    • volatile-random ,在設置過期時間的鍵值對中隨機刪除
    • volatile-ttl ,在設置過期時間的鍵值對,基于過期時間的先后進行刪除,越早過期的越先被刪除。
    • volatile-lru , 基于LRU(Least Recently Used) 算法篩選設置了過期時間的鍵值對, 最近最少使用的原則來篩選數據
    • volatile-lfu ,使用 LFU( Least Frequently Used ) 算法選擇設置了過期時間的鍵值對, 使用頻率最少的鍵值對,來篩選數據。
  • 在所有的鍵值對中,

    • allkeys-random, 從所有鍵值對中隨機選擇并刪除數據
    • allkeys-lru, 使用 LRU 算法在所有數據中進行篩選
    • allkeys-lfu, 使用 LFU 算法在所有數據中進行篩選

Note: LRU( 最近最少使用,Least Recently Used)算法, LRU維護一個雙向鏈表 ,鏈表的頭和尾分別表示 MRU 端和 LRU 端,分別代表最近最常使用的數據和最近最不常用的數據。

LRU 算法在實際實現時,需要用鏈表管理所有的緩存數據,這會帶來額外的空間開銷。而且,當有數據被訪問時,需要在鏈表上把該數據移動到 MRU 端,如果有大量數據被訪問,就會帶來很多鏈表移動操作,會很耗時,進而會降低 Redis 緩存性能。

其中,LRU和LFU 基于Redis的對象結構redisObject的lru和refcount屬性實現的:

typedef struct redisObject {unsigned type:4;unsigned encoding:4;// 對象最后一次被訪問的時間unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or* LFU data (least significant 8 bits frequency// 引用計數                        * and most significant 16 bits access time). */int refcount;void *ptr;
} robj;

Redis的LRU會使用redisObject的lru記錄最近一次被訪問的時間,隨機選取參數maxmemory-samples 配置的數量作為候選集合,在其中選擇 lru 屬性值最小的數據淘汰出去。

在實際項目中,那么該如何選擇數據淘汰機制呢?

  • 優先選擇 allkeys-lru算法,將最近最常訪問的數據留在緩存中,提升應用的訪問性能。
  • 有頂置數據使用 volatile-lru算法 ,頂置數據不設置緩存過期時間,其他數據設置過期時間,基于LRU 規則進行篩選 。

在理解了Redis緩存淘汰機制后,來看看Redis作為緩存其有多少種模式呢?

Redis緩存模式

Redis緩存模式基于是否接收寫請求,可以分成只讀緩存和讀寫緩存:

只讀緩存:只處理讀操作,所有的更新操作都在數據庫中,這樣數據不會有丟失的風險。

  • Cache Aside模式

讀寫緩存,讀寫操作都在緩存中執行,出現宕機故障,會導致數據丟失。緩存回寫數據到數據庫有分成兩種同步和異步:

  • 同步:訪問性能偏低,其更加側重于保證數據可靠性

    • Read-Throug模式
    • Write-Through模式
  • 異步:有數據丟失風險,其側重于提供低延遲訪問

    • Write-Behind模式

Cache Aside模式

查詢數據先從緩存讀取數據,如果緩存中不存在,則再到數據庫中讀取數據,獲取到數據之后更新到緩存Cache中,但更新數據操作,會先去更新數據庫種的數據,然后將緩存種的數據失效。

而且Cache Aside模式會存在并發風險:執行讀操作未命中緩存,然后查詢數據庫中取數據,數據已經查詢到還沒放入緩存,同時一個更新寫操作讓緩存失效,然后讀操作再把查詢到數據加載緩存,導致緩存的臟數據。

Read/Write-Throug模式

查詢數據和更新數據都直接訪問緩存服務,緩存服務同步方式地將數據更新到數據庫。出現臟數據的概率較低,但是就強依賴緩存,對緩存服務的穩定性有較大要求,但同步更新會導致其性能不好。

Write Behind模式

查詢數據和更新數據都直接訪問緩存服務,但緩存服務使用異步方式地將數據更新到數據庫(通過異步任務)?速度快,效率會非常高,但是數據的一致性比較差,還可能會有數據的丟失情況,實現邏輯也較為復雜。

在實際項目開發中根據實際的業務場景需求來進行選擇緩存模式。那了解上述后,我們的應用中為什么需要使用到redis緩存呢?

在應用使用Redis緩存可以提高系統性能和并發,主要體現在

  • 高性能:基于內存查詢,KV結構,簡單邏輯運算
  • 高并發: Mysql 每秒只能支持2000左右的請求,Redis輕松每秒1W以上。讓80%以上查詢走緩存,20%以下查詢走數據庫,能讓系統吞吐量有很大的提高

雖然使用Redis緩存可以大大提升系統的性能,但是使用了緩存,會出現一些問題,比如,緩存與數據庫雙向不一致、緩存雪崩等,對于出現的這些問題該怎么解決呢?

使用緩存常見的問題

使用了緩存,會出現一些問題,主要體現在:

  • 緩存與數據庫雙寫不一致
  • 緩存雪崩: Redis 緩存無法處理大量的應用請求,轉移到數據庫層導致數據庫層的壓力激增;
  • 緩存穿透:訪問數據不存在在Redis緩存中和數據庫中,導致大量訪問穿透緩存直接轉移到數據庫導致數據庫層的壓力激增;
  • 緩存擊穿:緩存無法處理高頻熱點數據,導致直接高頻訪問數據庫導致數據庫層的壓力激增;

緩存與數據庫數據不一致

只讀緩存(Cache Aside模式)

對于只讀緩存(Cache Aside模式), 讀操作都發生在緩存中,數據不一致只會發生在刪改操作上(新增操作不會,因為新增只會在數據庫處理),當發生刪改操作時,緩存將數據中標志為無效和更新數據庫 。因此在更新數據庫和刪除緩存值的過程中,無論這兩個操作的執行順序誰先誰后,只要有一個操作失敗了就會出現數據不一致的情況。

Spring全套教學資料

Spring是Java程序員的《葵花寶典》,其中提供的各種大招,能簡化我們的開發,大大提升開發效率!目前99%的公司使用了Spring,大家可以去各大招聘網站看一下,Spring算是必備技能,所以一定要掌握。

資料領取方式:點擊這里前往藍色傳送門

目錄:

部分內容:

Spring源碼

  • 第一部分 Spring 概述
  • 第二部分 核心思想
  • 第三部分 手寫實現 IoC 和 AOP(自定義Spring框架)
  • 第四部分 Spring IOC 高級應用
    基礎特性
    高級特性
  • 第五部分 Spring IOC源碼深度剖析
    設計優雅
    設計模式
    注意:原則、方法和技巧
  • 第六部分 Spring AOP 應用
    聲明事務控制
  • 第七部分 Spring AOP源碼深度剖析
    必要的筆記、必要的圖、通俗易懂的語言化解知識難點

腳手框架:SpringBoot技術

它的目標是簡化Spring應用和服務的創建、開發與部署,簡化了配置文件,使用嵌入式web服務器,含有諸多開箱即用的微服務功能,可以和spring cloud聯合部署。

Spring Boot的核心思想是約定大于配置,應用只需要很少的配置即可,簡化了應用開發模式。

  • SpringBoot入門
  • 配置文件
  • 日志
  • Web開發
  • Docker
  • SpringBoot與數據訪問
  • 啟動配置原理
  • 自定義starter

微服務架構:Spring Cloud Alibaba

同 Spring Cloud 一樣,Spring Cloud Alibaba 也是一套微服務解決方案,包含開發分布式應用微服務的必需組件,方便開發者通過 Spring Cloud 編程模型輕松使用這些組件來開發分布式應用服務。

  • 微服務架構介紹
  • Spring Cloud Alibaba介紹
  • 微服務環境搭建
  • 服務治理
  • 服務容錯
  • 服務網關
  • 鏈路追蹤
  • ZipKin集成及數據持久化
  • 消息驅動
  • 短信服務
  • Nacos Confifig—服務配置
  • Seata—分布式事務
  • Dubbo—rpc通信

Spring MVC

目錄:

部分內容:

…(img-fZvUVvw6-1624780270225)]

[外鏈圖片轉存中…(img-q9kNYJVX-1624780270225)]

[外鏈圖片轉存中…(img-b7mAsXDg-1624780270226)]

部分內容:

[外鏈圖片轉存中…(img-HNjUgWlq-1624780270226)]

[外鏈圖片轉存中…(img-hrT4FAFv-1624780270227)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385863.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385863.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385863.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java源碼文件丟恢復需要多少錢,上岸螞蟻金服!

京東Java研發崗一面(基礎面,約1小時) 自我介紹,主要講講做了什么和擅長什么 springmvc和spring-boot區別 Autowired的實現原理 Bean的默認作用范圍是什么?其他的作用范圍? 索引是什么概念有什么作用&am…

php 靜態方法特點,淺析php靜態方法與非靜態方法的用法區別

在php編程中,static關鍵字聲明一個屬性或方法是和類相關的,而不是和類的某個特定的實例相關,因此,這類屬性或方法也稱為“類屬性”或“類方法”如果訪問控制權限允許,可不必創建該類對象而直接使用類名加兩個冒號“::”…

java特性多態,90%的人看完都說好

01.第一份資料是圖解網絡 根據讀者閱讀偏好不同,共出了兩個版本風格的 PDF,分別是亮白版本和暗黑版本。 02.第二份資料是計算機的相關知識 看完能讓你對計算機有一個基礎的了解和入門,是培養你 內核 的基礎,我們看下目錄大綱 基…

php session 釋放,php中刪除Session和銷毀Session的方法

刪除某個session值可以使用PHP的unset函數,刪除后就會從全局變量$_SESSION中去除,無法訪問。session_start();$_SESSION[name] jobs;unset($_SESSION[name]);echo $_SESSION[name]; //提示name不存在如果要刪除所有的session,可以使用sessio…

java環境變量怎么配置,詳解系列文章

Git是什么 在回憶Git是什么的話,我們先來復習這幾個概念哈~ 什么是版本控制? 百度百科定義是醬紫的~ 版本控制是指對軟件開發過程中各種程序代碼、配置文件及說明文檔等文件變更的管理,是軟件配置管理的核心思想之一。 那些年,…

php數據接口api安全,API接口數據安全之授權碼sign

**API接口數據安全之授權碼sign**>[success] 1. ASE加密方式加密~~~class Aes{private $key null;/***param String $key 密鑰*return String*/public funciton __construct(){//配置文件中的asekey 服務端及客戶端必須保持一致 且加密key必須為16 、32、64位$this->key…

java環境變量的配置與詳解,這些知識你必須拿下

1.三重心智模型 先給大家科普一個概念,“三重心智模型”。 認知科學家斯坦諾維奇,將人的心智模式,分成了三個部分。 第一層是自主心智,自主心智是我們通過進化與內隱學習獲得。比如,我們看到蛇就會害怕,情…

centos php安裝redis擴展,Centos7編譯安裝redis、php安裝phpredis擴展

解壓 進入 make:# tar zxvf redis-4.0.9.tar.gz# cd redis-4.0.9/# make# cd src# make install為了方便管理,將Redis文件中的配置文件和常用命令移動到統一文件中:# mkdir –p /usr/local/redis/bin# mkdir –p /usr/local/redis/etc# cp /t…

java環境變量的配置步驟,實現原理分析

1.筆試常見的問題? 面試常見的問題上面給的面試題鏈接基本都有。我只提幾點: 寫SQL:寫SQL很常考察group by、內連接和外連接。手寫代碼:手寫代碼一般考單例、排序、線程、消費者生產者。我建議排序算法除了冒泡排序,…

php 方法參數傳遞,在PHP中將實例方法作為參數傳遞

我想創建一個Listener類class Listener {var $listeners array();public function add(callable $function) {$this->listeners[] $function;}public function fire() {foreach($this->listeners as $function) {call_user_func($function);}}}class Foo {public funct…

java環境安裝包出現覆蓋,請查收

正文 先問小伙伴們一個問題,登錄難嗎?“登錄有什么難得?輸入用戶名和密碼,后臺檢索出來,校驗一下不就行了。”凡是這樣回答的小伙伴,你明顯就是產品思維,登錄看似簡單,用戶名和密碼…

java生成json字符串,威力加強版

策略 1——停止挖掘 Law of Holes 是說當自己進洞就應該停止挖掘。對于單體式應用不可管理時這是最佳建議。換句話說,應該停止讓單體式應用繼續變大,也就是說當開發新功能時不應該為舊單體應用添加新代碼,最佳方法應該是將新功能開發成獨立微…

MATLAB小波軟硬閾值去噪代碼,matlab編程小波變換進行圖像去噪處理,包括各種軟硬閾值的選取函數...

內容:matlab編程小波變換進行圖像去噪處理,包括各種軟硬閾值的選取函數,%小波閾值去噪clear allclc;fimread(graylena.bmp);fdouble(f);ssize(f);rimnoise2(gaussian,s(1),s(2),0,20);%填加高斯白噪聲fnoisyfr;%對圖像進行三層小波分解[c,s]w…

java生成二維碼讀取二維碼,面試真題解析

拼多多一面 首先自我介紹 參加過哪些項目 并發編程三要素? 實現可見性的方法有哪些? 多線程的價值? 創建線程的三種方式的對比? 畫出線程的狀態流轉圖 常用的并發工具類有哪些? CyclicBarrier 和 CountDownLatch 的區…

iis 7.5 php 防止跨站,iis安全---防范XSS跨站式腳本攻擊

iis安全---防范XSS跨站式腳本攻擊網站要怎么防范常見的XSS跨站式腳本攻擊呢,我們先從XSS跨站式腳本攻擊的原理來說起。網站遭受XSS跨站式腳本攻擊的基本原理1.本地利用漏洞,這種漏洞存在于頁面中客戶端腳本自身。其攻擊過程如下所示:A給B發送…

Java春招實習面試經驗匯總,面試篇

Part1 SpringIOC 學習Spring最重要的無非是Spring IOC以及Spring AOP,首先咱們把Spring IOC吃透,以下內容將截圖展示。 Spring IOC主要學習內容分為以下7點: ①Spring框架 ②Spring lOC容器Bean對象實例化模擬實現 ③Spring IOC容器Bean對象…

Java最新大廠面試真題總結,瞬間高大上了!

什么是分布式鎖?在回答這個問題之前,我們先回答一下什么是鎖。 普通的鎖,即在單機多線程環境下,當多個線程需要訪問同一個變量或代碼片段時,被訪問的變量或代碼片段叫做臨界區域,我們需要控制線程一個一個…

php列表框怎么用,PHP+Mysql+jQuery查詢和列表框選擇操作實例講解

這篇文章主要介紹了PHPMysqljQuery查詢和列表框選擇操作實現過程,需要的朋友可以參考下本文講解如何通過ajax查詢mysql數據,并將返回的數據顯示在待選列表中,再通過選擇最終將選項加入到已選區,可以用在許多后臺管理系統中。本文列…

Java未來路在何方?圖文詳解!

Spring Security觀后感——手繪思維腦(供參考) Spring Security手繪思維腦圖 手繪的思維導圖,是我自己根據自身的情況讀完這套阿里出品的Spring Security王者晉級文檔之后所繪的,相當于是一個知識的總結與梳理,我將其分為***“核心組件”與“…

matlab怎讓3d旋轉,如何在MATLAB中平滑旋轉3D繪圖?

我會說這是你正在繪制的大量積分導致經濟放緩.一個選項是縮減采樣..也可以使用較低級別的功能進行繪制(檢查this related post以獲得plot3 / scatter3 / line性能的比較).考慮以下針對速度優化的動畫:[X Y Z] sphere(64);X X(:); Y Y(:); Z Z(:);%# set-up figu…