redis +aop+註解優雅的寫代碼,挑戰百萬年薪

2020-12-21 怡子科技

在我們以前寫代碼 ,會把緩存代碼和業務代碼寫在一個方法裡。

帥傑是我們公司的一個高級開發人員,我交給他的活他都按時完成,但是他有一個毛病,就是槓精。

「我就這麼寫了,怎麼了。

我不給你抬槓,你那麼寫我不會說你錯。」 帥傑原話。

在程序設計的過程中,最頭疼的不是業務代碼的編寫,也不是邏輯代碼的處理,更不是算法的設計。最難的就是能夠寫出一套容易擴展,易維護的產品代碼。

話不多說,先上帥傑寫的代碼

分析下這段代碼。

帥傑想的是前端想要我的一塊數據,我先從緩存裡取,如果緩存裡沒有,我就去資料庫裡查詢。這段代碼沒有問題,而且寫的還可以。

但為什麼我要說呢。原因當然是不夠優雅呀。我們系統那麼多查詢方法,我們每個方法都向帥傑這麼寫,那還不亂了套了。

得改。

然後我想到的就是結合springaop 和註解的形式幫助帥傑把代碼解耦下。

定義註解類:

定義redis切面類

業務代碼改造

帥傑當時就抬槓,你這也沒有省代碼,怎麼代碼還比以前更多了呢。

那我們來看我們整個系統省了多少代碼,我們有上萬個查詢接口,每個接口省10行代碼,我們省了多少行?省了多少內存空間?

帥傑明白了。

那麼這些底層是怎麼實現的呢

Aop參照我寫的其他文章,這裡不做解答,

註解的底層:

從反編譯的信息來看,註解繼承了java.lang.annotation.Annotation

這個類是被動的元數據,永遠不會有主動行為,調用者可以通過反射獲得這個元數據根據它採取行動。實際就是一些鍵值對,通過解析取出這些鍵值對。

那麼redis redis底層是什麼樣的?

看過redis源碼的人知道redis是用c語言寫的,(5.0之前)是一個單線程I/o寫入,io返回的,基於內存的nosql資料庫。這篇是寫Java的,想要讓我帶你看源碼的可以關注本公眾號,後期會有相關文章帶你走進redis源碼

如果關機,內存數據會沒有,但是你重啟之後,redis的數據還會存在,這個就是redis數據的持久化。

Rdb:首先redis進來的是rdb,剛安裝就有rdb機制。定時把內存當中的數據寫入磁碟。生成持久化文件,開機再把磁碟文件恢復到內存。原理是什麼呢?

Redis會單獨創建一個與當前進程程一模一樣的子進程進行持久化

這個子進程的所有數據(環境變量,程序計數器,變量等)都和原進程一模一樣。會先講一個數據寫入到一個臨時文件,待持久化結束了,在用這個臨時文件替換上一次的持久化的文件,整個過程中,主進程不進行一次io操作。性能是不是很高?Shutdown後,如果沒有開啟aof 會觸發配置文件中默認的快照配置。

當你執行命令save或bgsave,save只管保存,其他不管,全部阻塞,bgsave,redis會在後臺異步進行快照操作,同時可以響應客戶端的請求。使用主進程持久化,客戶端不會得到即時數據。

打開redis安裝路徑,找到redis.conf

我們shutdown一下

發現在這個路徑下確實多了一個dump.rdb

文件,說明redis在關的時候進行了一次持久化操作。

試著寫入幾個key set下。我們換個地方啟動下,發現這幾條數據是沒有的?原因是redis在不同目錄啟動會有不同的工作空間,類似你的eclipse。所以我們會把redis配置文件的dir寫死。

我們的配置文件中寫道。

Save 900 1

Save 300 100

Save 60 10000

900秒內有一次更改觸發一次rdb操作

300秒 100次更改,60秒,一萬次更改都會觸發rdb操作

你用flushall 命令 也會rdb操作,但是你會清空原來的rdb文件,類似linux rm-rf/*

意外宕機不觸發rdb機制。

Rdb單機環境可以關閉,集群環境關不了。

把rdb文件刪了,會不會再次觸發rdb操作?

只要正常save 或者重啟redis rdb會自動生成。

但隨著線上業務增加,redis的數據會越來越大,在用這種方法會出現錯誤,不能把內存中的數據保存到rdb文件中,這時需要只要做以下幾步,就可以恢復rdb文件了:

進入到redis埠,info查看配置信息

進入redis埠 執行 config set dir /data/redis/

執行 save

Aof

是將redis的操作日誌以追加的方式寫入文件,讀操作是不做記錄的。

觸發機制,根據配置文件的 no always everysec

分別代表等作業系統進行緩存數據同步到磁碟。Awlays同步持久化,每次發生數據變化後,立即記錄到磁碟。

Everysec 每秒同步一次 可能會丟失數據

Aof重寫機制:當aof 文件增加到一定大小後,redis會調用bgrewriteaof 對日誌進行重寫,還有就是aof文件大小的增長率大於改配置的時候自動開啟重寫。

redis用途:首先第一個就是緩存,redis解決冪等,生成分布式系統唯一主鍵,實現分布式隊列,點讚,統計網站訪問量等。

Redis集群搭建以及要注意什麼問題,會在以後的文章更新。

好的,本篇先寫到這裡。我們下篇見。

相關焦點

  • Caffeine 和 Redis 居然可以這麼搭,想不到吧!
    實戰多級緩存的用法以下演示項目的代碼在公眾號【Garnett的Java之路】後臺回復【多級緩存】可以自取哦!Goods goodsInfo(@RequestParam(value="goodsid",required = true,defaultValue = "0")Long goodsId) { Goods goods = goodsService.getOneGoodsById(goodsId);return goods; }注意使用Cacheable這個註解來使本地緩存生效
  • Spring常用註解類
    Java5.0過後開始支持註解,Spring作為java中的領軍框架,在Spring2.5過後也開始放棄xml配置文件了,更多的推薦註解來使用Spring框架。Spring中那麼多的註解,其中很多可能在工作中很少能遇見,也就用不上。下面就給大家總結一些常用的註解。
  • Springboot-Redis分布式鎖
    作者:Mr---Dmy.oschina.net/dengfuwei/blog/1600681溫馨提示:文中代碼看不全可左右滑動
  • Spring boot 基於註解方式配置datasource
    -- 讀取參數配置 --><list><value>classpath:dbconfig.properties</value><value>classpath:redis.properties
  • 我們已經不用AOP做操作日誌了!
    基於資料庫Binlog優點:解除了數據新舊變化的耦合,支持批量操作,方便多表關聯拓展,不依賴開發語言;缺點:資料庫表設計需要統一的約定;方案實現細節一、基於AOP切面+註解的傳統方案傳統的做法就是切面+註解的方式,這種對代碼的侵入性不強,通常記錄ip、業務模塊、操作帳號、操作場景、操作來源等等,一般在註解+攔截器裡這些值都拿得到,如下圖所示:這種常見的我們在通用方法都可以處理,但是在數據變更方面,一直沒有較好的實現方式,比如數據在變更前是多少,變更後是多少。
  • 閱讀了redis的源碼,我終於明白為什麼說redis是單線程!
    本文對標的 redis 版本是 5.x。正文redis 涉及的知識點有很多,展開來講能聊到作業系統,因此為了方便理解,文中做了很多抽象描述。文件事件處理器redis 內部使用了一個叫 文件事件處理器( file event handler)的東西,這個文件事件處理器是 單線程的,所以才有了 redis 是單線程的這一說法。
  • 程式設計師:一步一步輕鬆實現SpringBoot整合Redis緩存,看了不後悔
    </artifactId> </dependency>2.在appliaction.properties配置redis資料庫連接信息#redis配置#Redis伺服器地址
  • 一個Spring AOP的坑!很多人都犯過
    問題最初我定義了一個註解,希望可以方便統一的對一些資料庫操作做緩存。於是就有了以下代碼:首先,定義一個註解:然後自定義一個切面,對所有使用了該註解的方法進行切面處理:@Aspect@Componentpublic class StrategyCacheAspect { private static final Logger LOGGER = LoggerFactory.getLogger
  • Java 第一大框架:Spring 的 IoC 跟 AOP 雛形如何實現?
    就是得把日誌記錄和數據校驗等可重用的功能模塊分離出來,然後在程序的執行的合適的地方動態地植入這些代碼並執行。這樣就簡化了代碼的書寫,業務邏輯代碼中沒有參和通用邏輯的代碼,業務模塊更簡潔,只包含核心業務代碼。實現了業務邏輯和通用邏輯的代碼分離,便於維護和升級,降低了業務邏輯和通用邏輯的耦合。有人會想到把這些通用的功能整合到一個方法中,去調用,這樣也是避免不了重複調用,並且在業務邏輯中添加額外的代碼。
  • Spring Boot+Redis+攔截器+自定義Annotation實現接口自動冪等
    redis實現自動冪等的原理圖:一:搭建redis的服務Api1:首先是搭建redis伺服器。2:引入springboot中到的redis的stater,或者Spring封裝的jedis也可以,後面主要用到的api就是它的set方法和exists方法,這裡我們使用springboot的封裝好的redisTemplate/*** redis工具類 */
  • Python 操作 Redis 必備神器:redis-py 源碼閱讀
    redis協議規範redis-py概述redis-py基礎使用pipelineLuaScriptlockredis協議規範RESP(Redis Serialization Protocol)是Redis客戶端和服務端的通訊協議。
  • 所謂年薪百萬,絕不是年薪20萬的活兒幹5份
    1268 期分享作者 l 格總  編輯 | 易小颯來源 l 格總在人間(ID:I-Gargamel)分享 l 粥左羅(ID:fangdushe520)難,非常難,作為一個傳統行業的資深打工人,我認識的年薪超過
  • 帶你研究Redis分布式鎖,源碼走起
    它不僅提供了一系列的分布式的Java常用對象,還實現了可重入鎖(Reentrant Lock)、公平鎖(Fair Lock、聯鎖(MultiLock)、 紅鎖(RedLock)、 讀寫鎖(ReadWriteLock)等,還提供了許多分布式服務。Redisson提供了使用Redis的最簡單和最便捷的方法。
  • 華為百萬年薪招攬「天才少女」,姚婷回應:百萬年薪不代表成功
    執筆:安野風編輯:安野風定稿:歐陽比文面對百萬年薪,姚婷做出回應:不代表成功8月5日對於記者提出的,對於自己的百萬年薪有什麼規劃,姚婷很坦然的做出了正面的回應。說自己還沒有想過,如果可以的話,想要讓家人生活的更好一些。對於網友們對她百萬年薪的羨慕,姚婷的態度就很平常心。
  • 通往百萬年薪之路
    職場&認知洞察丨 作者 / findyi 最近有不少讀者問洋哥:「洋哥我怎麼樣才能年薪百萬」、「洋哥,年薪百萬生活是不是就無憂無慮了」。
  • 騰訊員工平均年薪福利84萬,比上一年漲7萬;研發寫1行代碼賺19塊
    員工平均年薪84萬,還比去年漲了7萬截至2019年底,騰訊一共有62885名員工,比前一年多了8576人。而2019年發出去的工資福利就有531.23億,平均每人年薪+福利約84.48萬。相比去年的77.62萬,騰訊員工平均每人漲薪大約7萬。
  • 想挑戰百萬年薪,先看看這些專業,有你喜歡的嗎?
    年薪百萬是多少人夢寐以求的,但真正能實現這個夢想的真是少之又少。特別是對於剛畢業的大學生來說,能找到一份說得過去的工作都已實屬不易。不過也有那麼一些專業,比較容易實現年薪百萬的夢想,到底是哪些專業呢?1.金融專業很多人以為學了金融或者經濟,最好的工作是銀行,工作穩定待遇又好,但這個的收入遠遠達不到百萬這麼高。實際上你還可以進行各種證券、投資、理財機構以及四大會計事務所,年薪百萬比比皆是,甚至像一些理財顧問,有的投資理財顧問客戶託管的資金總額都超幾個億,一年的佣金抽成可不止百萬了。