springBoot集成redis


       Redis作為一個Java后端面試中的一個常問考點,並且在項目中越來越常用,所以自己動手搭建了一個基於springboot集成redis做為數據緩存的demo(springboot集成mybatis、redis,並具有增刪改查詢接口)。關注微信公眾號【菜鳥阿都】並回復:redis,可獲得源碼。后面也會繼續深入研究redis相關知識,期待與大家一起學習交流。

redis簡介

       基於鍵值對的開源內存數據庫,支持5種數據類型:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。spring對redis的支持是通過spring Data Redis來實現的,Spring Data Redis 提供了RedisTemplate和StringRedisTemplate兩個模板來進行數據操作,StringRedisTemplate只針對鍵值都是字符型的數據進行操作,StringRedisTemplate繼承於RedisTemplate,並采用StringRedisSerializer對鍵值序列化。

StringRedisTemplate 實現源碼

public class StringRedisTemplate extends RedisTemplate<String, String>{
    public StringRedisTemplate() {
    this.setKeySerializer(RedisSerializer.string());
    this.setValueSerializer(RedisSerializer.string());
    this.setHashKeySerializer(RedisSerializer.string());
    this.setHashValueSerializer(RedisSerializer.string());
    }
}
public interface RedisSerializer<T> {
    static RedisSerializer<String> string() {
    return StringRedisSerializer.UTF_8;
    }
}

RedisTemplate提供的數據訪問方法

方法

說明

opsForValue()

操作只有簡單屬性的數據

opsForList()

操作含有list的數據

opsForSet()

操作含有set的數據

opsForZSet()

操作含有ZSet(有序的set)的數據

opsForHash()

操作含有hash的數據

1. 添加reids依賴

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <version>2.4.1</version>
</dependency>

2. 封裝redis工具類

將redis的操作方法封裝為工具類,方便使用

/**
 * Redis操作工具類
 */
@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    // 存入數據到緩存
    public void setValue(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // 通過key獲得數據
    public Object getValue(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // 存入數據到緩存並設置過期時間(單位為秒)
    public void setValueAndExpire(String key, Object value, long time){
        redisTemplate.opsForValue().set(key, value,time,TimeUnit.SECONDS);
    }

    // 刪除緩存
    public void delete(String key){
        redisTemplate.delete(key);
    }
}

3. redis使用

       查詢數據時先查詢緩存中是否存在,存在時,返回內存中的數據,緩存中不存在時,再查詢數據庫並存入緩存,然后返回查詢出的數據

// 根據id查詢記錄
@Override
public User find(int id) {
    //根據key查詢緩存
    User user=(User) redisUtil.getValue("userKey"+id);
    //判斷是否為空
    if(user==null){
        // 緩存為空,查詢數據庫
        user=userMapper.find(id);
        System.out.println("緩存為空,查詢數據庫");
        // 插入緩存,並設置過期時間(單位為秒)
        redisUtil.setValueAndExpire("userKey"+id,user,30);
        System.out.println("插入緩存");
    }else{
        System.out.println("緩存不為空");
    }
    return user;
}

4. 自定義緩存序列化方式

      RedisTemplate默認采用JdkSerializaationRedisSerializer方式序列化,以二進制數據存放,使用redis客戶端工具查看數據時不直觀,並且需要對實體類進行序列化(實現Serializable接口)。所以編寫redis的配置類修改RedisTemplate的序列化方式,將JdkSerializaationRedisSerializer序列化方式修改為Jackson2JsonRedisSerialize,以json格式對數據進行保存。StringRedisTemplate默認使用的是StringRedisSerializer。

 @Configuration
public class RedisConfig   {
    // 使用Jackson2JsonRedisSerialize替換默認JDK序列化
    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // hash的hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }    
}

默認序列化(通過redisClient客戶端查看)

圖片

使用自定義序列化后,存入緩存中的數據(通過redisClient客戶端查看)

圖片

5.結果分析

       第一次訪問時,緩存為空,查詢數據庫並插入緩存中,總共用時2941毫秒,第二次查詢時,直接從緩存中獲取,用時僅僅25毫秒。

緩存為空,查詢數據庫
插入緩存
總用時:2941
緩存不為空
總用時:25

關注微信公眾號【菜鳥阿都】並回復:redis,可獲得源碼

資源獲取

回復關鍵字(關注微信公眾號) 描述
redis 獲得springboot集成redis.,mybatis增刪改查示例源碼
easymock 獲得免費easymock接口服務
springboot 獲得springboot集成swagger,mybatis增刪改查示例源碼
redis客戶端 獲得redis數據庫管理軟件redisClient
java資源 獲得java多線程,springboot,sql優化,java面試視頻資源
開發手冊 阿里巴巴java開發手冊(嵩山版)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM