程式設計師:一步一步輕鬆實現SpringBoot整合Redis緩存,看了不後悔

2020-12-15 程序猿的內心獨白

前言

隨著技術的發展,程序框架也越來越多,非常考驗程序的學習能力,但是框架的產生在程式設計師開發過程中也提供很多便利,框架可以為程式設計師減少許多工作量,比如spring boot 、mybatis等都可以提高開發人員的工作效率,今天就來聊聊spring boot與redis 的整合。

一、基本概況

為什麼使用緩存

緩存是在內存中存儲的數據備份,當數據沒有發生本質變化時就可以直接從內存中查詢數據,而不用去資料庫查詢(在磁碟中)CPU讀取內存的速度要比讀取磁碟快,可以提高效率Redis緩存

Remote Dictionnary Server(遠程數據服務),是一款內存高速緩存資料庫。五種常用數據類型: String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)可持久化:一邊運行,一邊向硬碟備份一份,防止斷電等偶然情況,導致內存中數據丟失二、搭建Redis環境

1.下載Redis

平臺限制不能貼連結,自行去官網下載哈!

2.設置Redis開機自啟

在解壓好的文件夾下輸入cmd命令

window下安裝Redis服務

redis-server --service-install redis.windows.conf

檢查安裝是否成功

搜索服務

點擊設置為開機自啟

三、新建SpringBoot項目

新建好項目的童鞋可以自動跳過

添加web依賴

選擇資料庫依賴

選擇項目位置,點擊finish

四、使用StringRedisTemplate操作Redis

1.pom.xml文件引入坐標

<!--redis依賴包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>

2.在appliaction.properties配置redis資料庫連接信息

#redis配置#Redis伺服器地址spring.redis.host=127.0.0.1#Redis伺服器連接埠spring.redis.port=6379#Redis資料庫索引(默認為0)spring.redis.database=0

3.在SpringbootdemoApplicationTests中測試操作Redis

@SpringBootTestclass SpringbootdemoApplicationTests {@Autowired StringRedisTemplate stringRedisTemplate; //操作key-value都是字符串,最常用 @Test public void test01(){ //字符串操作 stringRedisTemplate.opsForValue().append("msg","coder"); //列表操作 stringRedisTemplate.opsForList().leftPush("mylist","1"); stringRedisTemplate.opsForList().leftPush("mylist","2"); }}

對於Redis的五大常用數據類型都提供了方法

String(字符串)、List(列表)、Set(集合)、Hash(散列)、ZSet(有序集合)stringRedisTemplate.opsForValue();[String(字符串)]stringRedisTemplate.opsForList();[List(列表)]stringRedisTemplate.opsForSet();[Set(集合)]stringRedisTemplate.opsForHash();[Hash(散列)]stringRedisTemplate.opsForZSet();[ZSet(有序集合)]

使用RedisDesktopManager可視化工具查看結果

StringTemplate類中方法存取的key-value值是String類型,RedisTemplate中key-value值是Object類型,RedisTemplate是StringTemplate父類

下面就用RedisTemplate實現從MySQL資料庫取出數據放到Redis緩存

五、使用RedisTemplate操作Redis

1.項目目錄結構

2.建立與資料庫相關的類

建表的sql腳本

application.properties配置文件

MySQL及Redis連接的相關配置

User類

採用ORM思想,屬性和資料庫欄位對應

package com.thinkcoder.bean;import java.io.Serializable;import java.util.Date;/*** @ClassName User * @Author Think-Coder * @Data 2020/5/27 10:35 * @Version 1.0 */public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; //getter和setter方法 public Integer getId() {return id;} public void setId(Integer id) {this.id = id;} public String getUsername() {return username;} public void setUsername(String username) {this.username = username;} public Date getBirthday() {return birthday;} public void setBirthday(Date birthday) {this.birthday = birthday;} public String getSex() {return sex;} public void setSex(String sex) {this.sex = sex;} public String getAddress() {return address;} public void setAddress(String address) {this.address = address;} //重寫toString方法 @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; }}

UserMapper類

使用註解方法操作資料庫

@Mapperpublic interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}") User findById(int id);}

3.MyRedisConfig

自定義序列化類,將存儲在Redis的對象序列化為json格式,不會產生亂碼

@Configuration@EnableAutoConfigurationpublic class MyRedisConfig {@Bean public RedisTemplate<Object, User> redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<Object, User> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<User> ser = new Jackson2JsonRedisSerializer<>(User.class); template.setDefaultSerializer(ser); return template; }}

4.工具類RedisUtil類

//工具類中使用Autowired註解需要加上Compoent@Componentpublic class RedisUtil {@Autowired RedisTemplate redisTemplate; //key-value是對象的 //判斷是否存在key public boolean hasKey(String key){ return redisTemplate.hasKey(key); } //從redis中獲取值 public Object get(String key){ return redisTemplate.opsForValue().get(key); } //向redis插入值 public boolean set(final String key,Object value){ boolean result = false; try{ redisTemplate.opsForValue().set(key,value); result = true; }catch (Exception e){ e.printStackTrace(); } return result; }}

5.sevice包代碼

IUserService

@Servicepublic interface IUserService {//根據id查用戶信息 User findById(int id);}

UserService實現類

@Servicepublic class UserServiceImpl implements IUserService {User user; @Autowired UserMapper userMapper; @Autowired private RedisUtil redisUtil; @Override public User findById(int id) { String key = "user"+id; if(redisUtil.hasKey(key)) { user = (User)redisUtil.get(key); System.out.println("查詢的是緩存"); }else{ user = userMapper.findById(id); System.out.println("查詢的是資料庫"); System.out.println(redisUtil.set(key,user) ? "插入成功" : "插入失敗"); } return user; }}

6.UserController類

@RestControllerpublic class UserController {@Autowired IUserService userService; @GetMapping("/user/{id}") public User findById(@PathVariable("id") Integer id){ User user = userService.findById(id); return user; }}

7.測試

打開瀏覽器輸入下方url

查看控制臺輸出

Redis Desktop Manager顯示結果

六、總結

整體來說,操作Redis是兩個類,RedisTemplate類和StringTemplate類,為父子關係,提供的方法正好對應操作Redis數據類型的指令,所以要把數據類型及常用的指令練熟。

相關焦點

  • Redis緩存與NodeJS的初學教程
    您可以實現FIDO(先入先出)隊列或創建延遲隊列,以將任務實現延遲到預定的時間。緩存節點和Redis現在,讓我們從本教程的主要重點開始:在NodeJS應用程式中使用Redis進行緩存。緩存Redis的過程相當簡單。
  • Spring Boot+Redis+攔截器+自定義Annotation實現接口自動冪等
    redis實現自動冪等的原理圖:一:搭建redis的服務Api1:首先是搭建redis伺服器。2:引入springboot中到的redis的stater,或者Spring封裝的jedis也可以,後面主要用到的api就是它的set方法和exists方法,這裡我們使用springboot的封裝好的redisTemplate/*** redis工具類 */
  • 黑馬程式設計師:SpringBoot教程,SpringBoot高級之原理分析
    導入Jedis坐標後,加載該Bean,沒導入,則不加載。2. 將類的判斷定義為動態的。判斷哪個字節碼文件存在可以動態指定。第四步:實現Condition新建一個ClassCondition類,實現Condition接口裡的matches方法來控制類的加載新建一個類實現Condition接口public
  • Springboot-Redis分布式鎖
    使用 Redis 實現鎖,主要是將資源放到 Redis 當中,利用其原子性,當其他線程訪問時,如果 Redis 中已經存在這個資源,就不允許之後的一些操作。spring boot使用 Redis 的操作主要是通過 RedisTemplate 來實現,一般步驟如下:1.將鎖資源放入 Redis (注意是當key不存在時才能放成功,所以使用 setIfAbsent 方法):redisTemplate.opsForValue().setIfAbsent("key", "value");2.設置過期時間
  • 程式設計師必備|面試中常被問到的redis持久化的問題
    「年輕人,看你愁眉苦臉,一定是剛面試被懟了吧?」老人笑著說道「老頭,你以為你是算命的嗎?」少年不服氣的說道「這樣吧,你我有緣,我看你骨骼驚奇,這本《redis七十二絕技》免費送你,你拿回去讀一讀,照著練習,假以時日你定能稱霸職場」老人笑完便收攤走了。
  • 記錄一下使用redis緩存導致WordPress無法登錄後臺的情況
    放置於香港的雲伺服器上,環境為centos6.8 64bit,伺服器軟體為lnmp1.5之前啟用了全站https 即SSL加密發現對SEO有很大影響,並且部分地區用戶由於牆的作用無法訪問https網站故打算去除https並做了伺服器遷移,在過渡期同時保留了https和http同時,將對象緩存軟體由
  • 使用Caffeine和springboot的多級緩存配置
    #使用Caffeine和springboot的多級緩存配置因此,在許多應用程式中,包括普通的Spring和Spring Boot,您都可以@Cacheable在任何方法上使用它,並且其結果將被緩存,以便下次調用該方法時,將返回緩存的結果。
  • Redis是如何實現點讚、取消點讚的?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫redis相關文章:分布式系統關注點——先寫DB還是「緩存」?一個牛逼的多級緩存實現方案基於redis分布式鎖實現「秒殺」(含代碼)百億數據量下,掌握這些Redis技巧你就能Hold全場9個提升逼格的redis命令
  • 新入職的妹子問我Redis是如何實現點讚、取消點讚的?
    點讚功能在很多系統中都有,但別看功能小,想要做好需要考慮的東西還挺多的。點讚、取消點讚是高頻次的操作,若每次都讀寫資料庫,大量的操作會影響資料庫性能,所以需要做緩存。至於多久從 Redis 取一次數據存到資料庫中,根據項目的實際情況定吧,我是暫時設了兩個小時。項目需求需要查看都誰點讚了,所以要存儲每個點讚的點讚人、被點讚人,不能簡單地做計數。
  • Springboot+MybatisPlus高效實現增刪改查
    的依賴:提供了使用springboot的能力。好了,這樣你就可以使用順利使用Mybatis-Plus的代碼操作資料庫了,接下去看下Mybatis-Plus的使用示例。四、CURD示例生成的代碼結構上面已經解釋了,我們這裡主要看下service層的類,這裡包含了幾乎所有的新增改查方法。
  • Caffeine 和 Redis 居然可以這麼搭,想不到吧!
    Caffeine 來做緩存,那麼肯定會有人問,我用了 redis 已經很快了,為什麼還要結合使用其他的緩存呢,緩存最大的作用確實是提高效率,但是隨著業務需求的發展,業務體量的增大,多級緩存的作用就凸顯了出來,接下來讓我們盯緊了哦!
  • redis +aop+註解優雅的寫代碼,挑戰百萬年薪
    在我們以前寫代碼 ,會把緩存代碼和業務代碼寫在一個方法裡。帥傑是我們公司的一個高級開發人員,我交給他的活他都按時完成,但是他有一個毛病,就是槓精。「我就這麼寫了,怎麼了。我不給你抬槓,你那麼寫我不會說你錯。」 帥傑原話。
  • Springboot學習二:Springboot手動搭建第一個web工程
    下一步下一步完成pom中打包類型是pom,pom中繼承springboot資源。創建子工程,繼承自定義父工程(默認也繼承了springboot) 由於父工程繼承了springboot,子工程也具備開發springboot能力,由springboot傳遞過來的各種資源屬性。在pom文件中(子工程)依賴一個開發web應用的資源。
  • 看完這部緩存進化史,還不懂緩存,請給我差評
    先簡單介紹一下愛奇藝的java緩存道路的發展吧。可以看見圖中分為幾個階段:通過消息隊列進行數據同步至redis,然後Java應用直接去取緩存 這個階段優點是:由於是使用的分布式緩存,所以數據更新快。缺點也比較明顯:依賴Redis的穩定性,一旦redis掛了,整個緩存系統不可用,造成緩存雪崩,所有請求打到DB。
  • 如何在Ubuntu 18.04上安裝和配置Redis
    Redis的典型用法是:  緩存–其增強的數據持久存儲到磁碟的能力使其成為傳統緩存解決方案的一個更好的選擇  隊列– Redis可用於在後臺對作業進行排隊。  數器-Redis允許簡單地創建和實現計數器,而無需讀取數據或更新資料庫的方案。
  • Java教程:Mybatis二級緩存的實現
    三,如何實現在 SqlMapCong.xml 文件開啟二級緩存<settings><!全局開啟二級緩存(可以省略, 因為默認就是true)><settingname="cacheEnabled"value="true"/></settings>因為 cacheEnabled 的取值默認就為 true,所以這一步可以省略不配置。
  • 連redis這些概念都不知道,誰敢相信您曾搞過軟體開發?
    另外,需要通過時間範圍查找的最新列表,list類型也實現不了,也需要通過有序集合sorted set類型實現,如以成交時間範圍,作為條件來查詢的訂單列表。原因是sorted set類型佔用的內存容量是list類型的數倍之多,對於列表數量不多的情況,可以用sorted set類型來實現,比如上文中舉例的打擂金曲排行榜,每天全國只有一份,兩種數據類型的內存容量差距可以忽略不計,但是如果要實現某首歌曲的翻唱作品地區排行榜
  • 程式設計師面試,3個讓你加薪的小技巧!
    今天就給小夥伴們梳理了3條關於程式設計師面試小技巧,奔波秋招千萬不要踩雷哦~ 01 面試的本質不是考試 比如: 面試官提問在實際項目中你們是怎麼樣使用緩存的?
  • springboot+springsecurity實現前後端分離簡單實現!
    講的例子不那麼通俗易懂,不利於新手的學習。代碼本身有bug,或者就沒有我想要實現的效果。 實在不行我又跑去github上找開源項目學習,github由於是外國網站,國內訪問速度有點慢!!那就用國內的gitee吧,gitee上的開源項目都是結合實戰項目的,代碼邏輯也比較複雜,我對項目的業務邏輯沒什麼了解,感覺不適合我。我這一次選擇比較反人性的方式去學習,就是手撕源碼和看官方文檔。老實講,剛開始看源碼和官方文檔特別難受,並且看不進去,那些springsecurity的類還有接口名字又臭又長,這時我就下載源碼,源碼的注釋多的就像一本書,非常詳細且權威。