前提

首先要搭建一个springboot项目并引入基础依赖,可以通过IDEA创建springboot项目也可以通过[spring官网搭建springboot项目连接](https://start.spring.io/)来构建项目。若果不会搭建请自行百度。

引入Redis依赖以及spring缓存依赖

下面是笔者引入的依赖,直接在pom文件中引入即可 。

<!-- spring-boot redis -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
<!--spring缓存-->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-cache</artifactId>
		</dependency>

配置yum(properties)文件

redis:
    # Redis数据库索引(默认为0)
    database: 0
    # Redis服务器地址
    host: redis地址IP
    # Redis服务器连接端口
    port: 6379
    pool:
      # 连接池最大连接数(使用负值表示没有限制)
      max-active: 8
      # 连接池最大阻塞等待时间(使用负值表示没有限制)
      max-wait: -1
      # 连接池中的最大空闲连接
      max-idle: 8
      # 连接池中的最小空闲连接
      min-idle: 0
    # 连接超时时间(毫秒)
    timeout: 0
    password: redis密码

注:笔者这里只配置了redis,代码也是伪代码,若果涉及数据库请自行添加orm框架依赖以及数据源

编写redis配置类

创建一个RedisConfig类来配置redis,配置文件继承CachingConfigurerSupport类,重写该类中的方法下面会详细解读重写方法。

缓存key生成策略重写

下面是具体代码。

// 自定义缓存key生成策略
	@Bean
	public KeyGenerator keyGenerator() {
		return new KeyGenerator() {
			@Override
			public Object generate(Object target, java.lang.reflect.Method method, Object... params) {
				//定义key值字符串
				StringBuffer sb = new StringBuffer();
				//将类的全限定名+代理模式+方法名+全部参数作为key值
				sb.append(target.getClass().getName());
				sb.append(method.getName());
				for (Object obj : params) {
					sb.append(obj.toString());
				}
				return sb.toString();
			}
		};
	}

注:重写该方法用于使用@Cacheable注解时没有声明key值的情景,如若注解声明key值则缓存中的key为声明的key

使用自定义key值策略在缓存中的key值形式为下图所示:

SpringBoot 覆盖Redis指定缓存 springboot redis缓存配置_redis

缓存管理器重写

// 缓存管理器
	@Bean
	public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
		RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
		// 设置缓存过期时间
		cacheManager.setDefaultExpiration(10000);
		return cacheManager;
	}
	@Bean
	public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
		StringRedisTemplate template = new StringRedisTemplate(factory);
		setSerializer(template);// 设置序列化工具
		template.afterPropertiesSet();
		return template;
	}

	private void setSerializer(StringRedisTemplate template) {
		@SuppressWarnings({ "rawtypes", "unchecked" })
		Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
		ObjectMapper om = new ObjectMapper();
		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		jackson2JsonRedisSerializer.setObjectMapper(om);
		template.setValueSerializer(jackson2JsonRedisSerializer);
	}

注:redis是要求对象进行序列化的,不进行序列化则会出现乱码形式
到此redis的配置文件全部结束,下面是使用阶段

代码演示

在service层写方法

package com.springboot.service;

import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;


@CacheConfig(cacheNames = "student")
public interface StudentService {
	
	/**
	 * 在缓存中取key为name值的键如若取不到将结果存储在缓存中,如果取到直接在缓存中获取不走接下来的代码块
	 * @param name
	 * @return
	 */
	@Cacheable(key = "#name")
	String getName(String name);
}

serviceImpl层实现service接口

package com.springboot.service.impl;

import com.springboot.service.StudentService;

@Service
public class StudentServiceImpl implements StudentService{


	/**
	 * 这里是伪代码并没有连接数据库,只是简单做一下测试
	 * @param name
	 * @return
	 */
	@Override
	public String getName(String name) {
		try {
		//这里将线程休眠5s可以通过相应时间直观的感受缓存
		//如果缓存中有对应的key不走代码块中的代码直接返回结果
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		return name;
	}
}

controller层编写接口

package com.springboot.controller;


import com.springboot.service.StudentService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @Author 张佳奇
 * @Description
 * @Date 2020-05-12 09:24
 */
@RestController
public class Controller {

    @Resource
    StudentService studentService;
    @RequestMapping("test")
    public String ngetname(String name){
        return studentService.getName(name);
    }
}

至此可以进行测试,启动springboot项目,在地址栏输入接口路径访问

SpringBoot 覆盖Redis指定缓存 springboot redis缓存配置_redis_02


由于线程休眠5秒,所以页面在加载5秒后出现结果如下图所示:

SpringBoot 覆盖Redis指定缓存 springboot redis缓存配置_缓存_03


可以在redis客户端看到缓存结果

SpringBoot 覆盖Redis指定缓存 springboot redis缓存配置_redis_04


SpringBoot 覆盖Redis指定缓存 springboot redis缓存配置_spring_05


然后再次访问该地址,页面直接刷新出结果,不用等待5秒,说明缓存起效,也可以在代码中加入输出语句,通过控制台测试。