SpringBoot配置并使用Redis緩存服務

概述

Redis是一款高性能key-value數(shù)據(jù)庫,有豐富的數(shù)據(jù)類型string爬骤、list趴久、hash、set塘辅、zset绝页。

常用的應用場景

緩存荠商、消息隊列、session共享续誉、分布式ID莱没、分布式鎖、關注/點贊酷鸦、排行榜等等,我們這篇主要來講緩存的應用

開始在SpringBoot項目中實踐

  • redis的安裝本篇不做闡述,后續(xù)可以補充
  • redis可視化工具可以自行選擇安裝,這里使用Redis Desktop Manager,也可以選擇RedisStudio
  • 本篇在之前JPA的項目基礎上,我們加以改造,加入redis緩存操作
  1. 現(xiàn)在pom.xml中加入redis依賴
        <!-- redis 緩存操作 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
  1. 在yml配置文件中加入redis配置信息
spring:
  redis:
    database: 0  # Redis數(shù)據(jù)庫索引(默認為0)
    host: localhost # Redis服務器地址
    port: 6379  # Redis服務器連接端口
    password:   # Redis服務器連接密碼(默認為空)
    lettuce:
      pool:
        max-active: 8  # 連接池最大連接數(shù)(使用負值表示沒有限制) 默認 8
        max-wait: -1   # 連接池最大阻塞等待時間(使用負值表示沒有限制) 默認 -1
        max-idle: 8    # 連接池中的最大空閑連接 默認 8
        min-idle: 0    # 連接池中的最小空閑連接 默認 0
  cache:
    type: redis

在SpringBoot2.X,redis默認使用lettuce,基于Netty性能高于以前的jedis饰躲。

  1. 創(chuàng)建RedisConfig.java配置類
package com.zhlab.demo.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @ClassName RedisConfig
 * @Description //Redis緩存配置類
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/11/3 0003 下午 2:15
 **/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();

        // 配置連接工廠
        template.setConnectionFactory(factory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        // 指定要序列化的域牙咏,field,get和set,以及修飾符范圍,ANY是都有包括private和public
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化輸入的類型嘹裂,類必須是非final修飾的妄壶,final修飾的類,比如String,Integer等會跑出異常
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(mapper);

        // 值采用json序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // 使用StringRedisSerializer來序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        // 設置hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

}

  1. DAO層不變,按之前的SysAdminUserRepository.java
public interface SysAdminUserRepository extends JpaRepository<SysAdminUser,Long>, Serializable {
    // 就這么簡單?
    // 對,就這么簡單,什么都不用寫,這是Spring Data JPA 默認幫我們實現(xiàn)了基本的數(shù)據(jù)庫操作
    // 如果需要擴展,可以自定義符合Spring Data JPA規(guī)則的查詢方法寄狼,由框架將其自動解析為SQL
}
  1. Service層中加入緩存注解@CacheConfig丁寄、@Cacheable、@CachePut泊愧、@CacheEvict,SysAdminUserService.java,
package com.zhlab.demo.service;

import com.zhlab.demo.dao.SysAdminUserRepository;
import com.zhlab.demo.model.SysAdminUser;
import com.zhlab.demo.utils.PageVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @ClassName SysAdminUserService
 * @Description //SysAdminUserService
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/10/31 0031 上午 9:45
 **/
@CacheConfig(cacheNames = "users")
@Service
public class SysAdminUserService {

    @Autowired
    SysAdminUserRepository sysAdminUserRepository;

    @Cacheable(key="'user_'+#userId")
    public SysAdminUser findUser(Long userId){
        return sysAdminUserRepository.findById(userId).orElse(null);
    }

    @CachePut(key="'user_'+#result.adminUserId")
    public SysAdminUser save(SysAdminUser user){
        return sysAdminUserRepository.save(user);
    }

    @CacheEvict(key="'user_'+#userId")
    public void deleteUser(Long userId) {
        sysAdminUserRepository.findById(userId).ifPresent(sysAdminUserRepository::delete);
    }
}

  1. 接口層,UserController.java 加入增伊磺、刪、查來測試一下
package com.zhlab.demo.controller;

import com.zhlab.demo.model.SysAdminUser;
import com.zhlab.demo.service.SysAdminUserService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassName UserController
 * @Description //用戶接口層
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/10/31 0031 上午 9:43
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    SysAdminUserService sysAdminUserService;

    

    @ApiOperation(value = "方法名:用戶信息", notes = "獲取用戶信息")
    @GetMapping("/{userId}")
    public SysAdminUser findUser(@PathVariable Long userId){
        return sysAdminUserService.findUser(userId);
    }

    @ApiOperation(value = "方法名:新增用戶", notes = "新增用戶")
    @PostMapping("/add")
    public SysAdminUser addUser(@RequestBody SysAdminUser user){
        return sysAdminUserService.save(user);
    }

    @ApiOperation(value = "方法名:刪除用戶信息", notes = "刪除用戶信息")
    @GetMapping("/delete/{userId}")
    public void deleteUser(@PathVariable Long userId){
        sysAdminUserService.deleteUser(userId);
    }

}

  1. 啟動項目,打開http://localhost:8080/swagger-ui.html來調試接口
接口

redisManager中,可以看到現(xiàn)在redis里現(xiàn)在還沒數(shù)據(jù)


redisManager
  1. 調試一下查詢userId=1的用戶信息


    返回結果

    此時查看一下redis中的數(shù)據(jù),已經(jīng)新增了一條緩存數(shù)據(jù)


    redis

    之后查詢這用戶,數(shù)據(jù)會從緩存中獲取删咱。
    新增屑埋、刪除調試方法類同。

9.接下來再增加另一種,通過redisTemplate來操作緩存數(shù)據(jù),修改之前的UserController.java痰滋,

package com.zhlab.demo.controller;

import com.zhlab.demo.model.SysAdminUser;
import com.zhlab.demo.service.SysAdminUserService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.TimeUnit;

/**
 * @ClassName UserController
 * @Description //用戶接口層
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/10/31 0031 上午 9:43
 **/
@RestController
@RequestMapping("/user")
public class UserController {

    private static final int expireTime = 30;

    @Autowired
    SysAdminUserService sysAdminUserService;

    @Autowired
    RedisTemplate redisTemplate;


    @ApiOperation(value = "方法名:用戶信息", notes = "獲取用戶信息")
    @GetMapping("/{userId}")
    public SysAdminUser findUser(@PathVariable Long userId){

        //從緩存獲取有無這個用戶信息
        SysAdminUser userInfo = getCacheObject("users::user_"+userId);
        if(userInfo == null){
            //沒有,則從數(shù)據(jù)庫查詢
            userInfo =sysAdminUserService.findUser(userId);

            //設置緩存
            setCacheObject("users::user_"+userId,userInfo,expireTime,TimeUnit.MINUTES);
        }
        return sysAdminUserService.findUser(userId);
    }

    @ApiOperation(value = "方法名:新增用戶", notes = "新增用戶")
    @PostMapping("/add")
    public SysAdminUser addUser(@RequestBody SysAdminUser user){
        return sysAdminUserService.save(user);
    }

    @ApiOperation(value = "方法名:刪除用戶信息", notes = "刪除用戶信息")
    @GetMapping("/delete/{userId}")
    public void deleteUser(@PathVariable Long userId){

        sysAdminUserService.deleteUser(userId);
    }


    /**
     * 獲取緩存
     * */
    private <T> T getCacheObject(String key){
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        return operation.get(key);
    }

    /**
     * 設置緩存
     * */
    private <T> ValueOperations<String, T> setCacheObject(String key, T value, Integer timeout, TimeUnit timeUnit) {
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        operation.set(key, value, timeout, timeUnit);
        return operation;
    }
}

  1. 繼續(xù)來調試/user/{userId}這個接口


    接口調試

查看結果


redis

總結

SpringBoot中使用redis緩存的方法就介紹到這兒,需要熟練掌握,因為大型項目中緩存的應用非常廣泛雀彼。

項目地址

https://gitee.com/kaixinshow/springboot-note

返回【Spring Boot學習】目錄

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市即寡,隨后出現(xiàn)的幾起案子徊哑,更是在濱河造成了極大的恐慌,老刑警劉巖聪富,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莺丑,死亡現(xiàn)場離奇詭異,居然都是意外死亡墩蔓,警方通過查閱死者的電腦和手機梢莽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奸披,“玉大人昏名,你說我怎么就攤上這事≌竺妫” “怎么了轻局?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長样刷。 經(jīng)常有香客問我仑扑,道長,這世上最難降的妖魔是什么置鼻? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任镇饮,我火速辦了婚禮,結果婚禮上箕母,老公的妹妹穿的比我還像新娘储藐。我一直安慰自己俱济,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布钙勃。 她就那樣靜靜地躺著蛛碌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肺缕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天授帕,我揣著相機與錄音同木,去河邊找鬼。 笑死跛十,一個胖子當著我的面吹牛彤路,可吹牛的內容都是我干的。 我是一名探鬼主播芥映,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼洲尊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奈偏?” 一聲冷哼從身側響起坞嘀,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惊来,沒想到半個月后丽涩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡裁蚁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年矢渊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枉证。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡矮男,死狀恐怖,靈堂內的尸體忽然破棺而出室谚,到底是詐尸還是另有隱情毡鉴,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布秒赤,位于F島的核電站眨补,受9級特大地震影響,放射性物質發(fā)生泄漏倒脓。R本人自食惡果不足惜撑螺,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崎弃。 院中可真熱鬧甘晤,春花似錦含潘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至塞弊,卻和暖如春漱逸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背游沿。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工饰抒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诀黍。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓袋坑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眯勾。 傳聞我的和親對象是個殘疾皇子枣宫,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348