【快学SpringBoot】Spring Cache+Redis实现高可用缓存解决方案

前言

以前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,咱们须要一个高可用的、分布式的缓存解决方案,使用默认的这种缓存方式,只是在当前进程里缓存了而已。Spring Cache整合Redis来实现缓存,其实也不是一件复杂的事情,下面就开始吧。html

关于Spring Cache的运用,请参考[快学SpringBoot]快速上手好用方便的Spring Cache缓存框架java

新建一个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。nginx

配置Redis

在application.properties中添加redis的配置web

spring.redis.host=127.0.0.1
# spring.redis.password=
spring.redis.port=6379
复制代码

这是最基础的三个配置(其实默认值就是这样,就算不写也能够)。固然,还有空闲链接数,超时时间,最大链接数等参数,我这里都没有设置,在生产项目中,根据实际状况设置。redis

RedisCacheConfig

新建RedisCacheConfig.classspring

@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构造方法提供一个可变参数的构造器:json

测试

新建一个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,代码以下:app

@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的掘金地址:juejin.im/user/5cc289…,Happy的我的博客:blog.happyjava.cn。欢迎转载,但须保留此段声明。

关注公众号领资料

搜索公众号【Happyjava】,回复【电子书】和【视频】,便可获取大量优质电子书和大数据、kafka、nginx、MySQL等视频资料

关注Happyjava公众号
相关文章
相关标签/搜索