【快學SpringBoot】Spring Cache+Redis實現高可用緩存解決方案


前言

之前已經寫過一篇文章介紹SpringBoot整合Spring Cache,SpringBoot默認使用的是ConcurrentMapCacheManager,在實際項目中,我們需要一個高可用的、分布式的緩存解決方案,使用默認的這種緩存方式,只是在當前進程里緩存了而已。Spring Cache整合Redis來實現緩存,其實也不是一件復雜的事情,下面就開始吧。

關於Spring Cache的運用,請參考[快學SpringBoot]快速上手好用方便的Spring Cache緩存框架

新建一個SpringBoot項目

依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
</dependencies>

主要是最下面兩個依賴:spring-boot-starter-cache 和 spring-boot-starter-data-redis。

配置Redis

在application.properties中添加redis的配置

spring.redis.host=127.0.0.1
# spring.redis.password=
spring.redis.port=6379

這是最基礎的三個配置(其實默認值就是這樣,就算不寫也可以)。當然,還有空閑連接數,超時時間,最大連接數等參數,我這里都沒有設置,在生產項目中,根據實際情況設置。

RedisCacheConfig

新建RedisCacheConfig.class

@Configuration
@EnableCaching
public class RedisCacheConfig {

    /**
     * 緩存管理器
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        //初始化一個RedisCacheWriter
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
        //設置CacheManager的值序列化方式為json序列化
        RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
        RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
                .fromSerializer(jsonSerializer);
        RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(pair);
        return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
    }

}

如果要設置緩存管理器所管理的緩存名字,RedisCacheManager構造方法提供一個可變參數的構造器:

測試

新建一個MockService.java,代碼如下:

@Service
public class MockService {

    /**
     * value 緩存的名字,與cacheName是一個東西
     * key 需要緩存的鍵,如果為空,則會根據參數自動拼接
     * 寫法:SpEL 表達式
     */
    @Cacheable(value = "listUsers", key = "#username")
    public List<String> listUsers(String username) {
        System.out.println("執行了listUsers方法");
        return Arrays.asList("Happyjava", "Hello-SpringBoot", System.currentTimeMillis() + "");
    }

}

新建一個TestController.java,代碼如下:

@RestController
public class TestController {

    private final MockService mockService;

    public TestController(MockService mockService) {
        this.mockService = mockService;
    }

    @GetMapping(value = "/listUsers")
    public Object listUsers(String username) {
        return mockService.listUsers(username);
    }

}

請求接口:

Redis中的數據:

原創聲明

本文發布於掘金號【Happyjava】。Happy的掘金地址:https://juejin.im/user/5cc2895df265da03a630ddca,Happy的個人博客:http://blog.happyjava.cn。歡迎轉載,但須保留此段聲明。

關注公眾號領資料

搜索公眾號【Happyjava】,回復【電子書】和【視頻】,即可獲取大量優質電子書和大數據、kafka、nginx、MySQL等視頻資料

關注Happyjava公眾號


免責聲明!

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



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