springboot 搭配redis缓存

1.引入依赖

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<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>

		<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>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

2.application.properties

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

3.配置redisConfig

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean("oneKeyGenerator")
    public KeyGenerator getKeyGenerator (){
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        } ;
    }
}

4.测试接口

package com.example.cache.service;

import com.example.cache.domain.User;

public interface UserService {
    User addUser(User user);

    User updateUser(Integer id);

    User selectUser(Integer id);

    void deleteUser(Integer id);
}

5.实现类

@Service
public class UserServiceImpl implements UserService {

    // 生成redis中的key名字为userCache::
    @CachePut(value = "userCache",key = "#user.id")
    @Override
    public User addUser(User user) {
        return user;
    }

     // 生成redis中的key名字为userCache::1
    @Cacheable(cacheNames = "userCache",key = "#id",sync = true)
    @Override
    public User selectUser(Integer id) {
        User user = new User();
        user.setId(id);
        user.setName("cicada5mile");
        System.out.println("执行数据库查询");
        return user;
    }

    // 删除缓存中的key名字为userCache::1
    @CacheEvict(value = "userCache",key = "#id",beforeInvocation = true)
    @Override
    public void deleteUser(Integer id) {

    }
}

6.测试方法

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CacheApplication.class)
public class UserTest {

    @Resource
    UserService userService;

    @Test
    public void testAdd (){
        User user = new User() ;
        user.setId(1);
        user.setName("cicada");
        userService.addUser(user) ;
    }

    @Test
    public void testSelect (){
        userService.selectUser(1) ;
    }

    @Test
    public void testDelete (){
        userService.deleteUser(3) ;
    }
}

7.补充说明

@Cacheable
@CacheEvict
使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,
而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素
@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

8.redis样例

image

posted @ 2021-05-18 20:01  SpecialSpeculator  阅读(111)  评论(0编辑  收藏  举报