Я кеширую CRUD-запросы в Spring Boot, используя аннотации @Cacheable. Я кеширую с помощью Redis. Кеширование выполнено успешно. Когда я вставляю новый элемент или обновляю существующий элемент, я хочу удалить или удалить несколько кешей из Redis. Для этого я использую тег @CacheEvict в Spring Boot, как показано ниже. Однако удаления кеша не происходит. В чем здесь проблема? (Я новичок в Spring Environment и Redis)
application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ExampleDB
spring.datasource.username=root
spring.datasource.password=#########
spring.datasource.tomcat.max-wait=20000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.max-idle=20
spring.datasource.tomcat.min-idle=15
spring.cache.type=redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.lettuce.pool.max-active=7
spring.redis.lettuce.pool.max-idle=7
spring.redis.lettuce.pool.min-idle=2
UserController.java
package com.springResearch.redisCaching;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import java.util.List;
@RestController(value = "/")
public class UserController {
@Autowired
JdbcTemplate jdbcTemplate;
private static final Logger logger = LogManager.getLogger("Log4J2AsyncLogger");
@Caching(evict = { @CacheEvict(value = "getallusers"), @CacheEvict(value = "userbyid", key = "#id"), @CacheEvict(value = "getuserbyname")})
@PostMapping(value = "/insertuser")
public String insertUser(@RequestParam int id, @RequestParam String name, @RequestParam String address){
jdbcTemplate.update("insert into user(userId, username, address) values(?, ?, ?)", id, name, address);
return "Success";
}
@Caching(evict = { @CacheEvict(value = "getallusers"), @CacheEvict(value = "getuserbyid", key = "#id"), @CacheEvict(value = "getuserbyname")})
@PutMapping(value = "/updateuserbyid")
public String updateUserByID(@RequestParam int id, @RequestParam String name){
jdbcTemplate.update(
"update user set username = ? where userId = ?", name, id
);
return "User succesfully updated";
}
@Cacheable(value = "getuserbyid", key = "#id")
@GetMapping(value = "/getuserbyid")
public List<Map<String, Object>> getUserById(@RequestParam int id){
logger.info("Data queried from database");
return this.jdbcTemplate.queryForList(
"SELECT userId, username, address FROM user WHERE userId = ?", id
);
}
@Cacheable(value = "getuserbyname")
@GetMapping(value = "/getuserbyname")
public List<Map<String, Object>> getUserByName(@RequestParam String name){
logger.info("Data queried from database");
return this.jdbcTemplate.queryForList(
"SELECT userId, username, address FROM user WHERE username = ?", name
);
}
@Cacheable(value = "getallusers")
@GetMapping(value = "/getallusers")
public List<Map<String, Object>> getAllUsers(){
List<Map<String, Object>> result = this.jdbcTemplate.queryForList(
"SELECT * FROM user"
);
logger.info("Table user was queried from database");
return result;
}
}
Перед вызовом updateUserByID кэш в redis
127.0.0.1: 6379> клавиши *
1) "getuserbyid::4"
2) "getuserbyname::sugan"
3) "getallusers::SimpleKey []"
После вызова updateUserByID кеш в redis
127.0.0.1: 6379> клавиши *
1) "getuserbyid::4"
2) "getuserbyname::sugan"
3) "getallusers::SimpleKey []"
Я хочу удалить указанные выше записи кэша при вызове insertUser или updateUserByID