使用Redis缓存和Mysql的Spring boot应用程序

使用Redis缓存和Mysql的Spring boot应用程序,mysql,spring-boot,redis,Mysql,Spring Boot,Redis,我一直在尝试开发一个SpringBoot应用程序,使用RedisCache进行缓存。我的应用程序适用于除update方法之外的所有方法。这是我写的代码 @RestController @RequestMapping(value = "users/") public class UserController { @Autowired UserService userService; @Autowired UserRepository userReposito

我一直在尝试开发一个SpringBoot应用程序,使用RedisCache进行缓存。我的应用程序适用于除update方法之外的所有方法。这是我写的代码

@RestController

@RequestMapping(value = "users/")

public class UserController {

    @Autowired
    UserService userService;

    @Autowired
    UserRepository userRepository;

    private static final Logger log = LoggerFactory.getLogger(UserController.class);

    @RequestMapping(value = "add/", method = RequestMethod.POST)
    public void saveUser(@RequestBody User user){

        log.info("Saving User information to the database...");
        userService.saveUser(user);
    }

    @Cacheable(value = "user-get" , key = "#id")
    @RequestMapping(value = "get/{id}/", method = RequestMethod.GET)
    public User getUserById(@PathVariable Long id){

      return userService.getUserById(id);
    }

    @Cacheable(value = "user-get-all")
    @RequestMapping(value = "get/all/", method = RequestMethod.GET)
    public List<User> getAllUser(){

        return userService.getAllUsers();
    }

    @CacheEvict(value = "user-delete", key = "#id")
    @RequestMapping(value = "delete/{id}", method = RequestMethod.DELETE)
    public void deleteUser(@PathVariable Long id){

        userService.deleteUser(id);
    }

    @CachePut(value = "user-update", key = "#user.id")
    @RequestMapping(value = "update/{id}/", method = RequestMethod.POST)
    public User updateUser(@PathVariable Long id, @RequestBody User user){

        User newuser = new User();
        newuser = userRepository.findById(id).get();
        newuser.setUserName(user.getUserName());
        newuser.setAge(user.getAge());
        return userService.saveUser(newuser);
    }

}

请帮助我解决问题

如果我记得正确,在使用update时,方法必须放置或修补。你为什么用POST

@CachePut(value = "user-update", key = "#user.id")
@RequestMapping(value = "update/{id}/", method = RequestMethod.PUT)
public User updateUser(@PathVariable Long id, @RequestBody User user){

    User newuser = new User();
    newuser = userRepository.findById(id).get();
    newuser.setUserName(user.getUserName());
    newuser.setAge(user.getAge());
    return userService.saveUser(newuser);
}

我遇到了一个类似的问题,在您的例子中,当在一个具有多个输入参数(如id和user)的方法上使用CachePut时。然后,默认密钥生成器使用这两个参数生成密钥。即使指定key=user.id,也无法选择该值。解决方法是在键周围使用花括号。在您的例子中,key={user.id}。这是因为,如果您有两个以上的参数,并且希望使用其中一些参数生成密钥,则可以在括号内用逗号分隔指定它们,就像初始化数组{param1.foo2、param4.bar1、param6.foo1时一样 }等等

试试这个:

    @CachePut(value = "user-update", key = "{#user.id}")
    @RequestMapping(value = "update/{id}/", method = RequestMethod.POST)
    public User updateUser(@PathVariable Long id, @RequestBody User user){

    User newuser = new User();
    newuser = userRepository.findById(id).get();
    newuser.setUserName(user.getUserName());
    newuser.setAge(user.getAge());
    return userService.saveUser(newuser);
}

当我执行删除操作时,它只从数据库中删除,而不是从缓存中删除。请使用方法delete中的选项重试:allEntries=trueI我尝试了它,但仍然不起作用。我认为这个问题是由绝地版本引起的。