具有Redis缓存和Mysql的Spring Boot应用程序

时间:2019-01-09 14:22:43

标签: mysql spring-boot redis

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

@RestController

@RequestMapping(value =“ users /”)

公共类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);
}

}

帮我解决问题

2 个答案:

答案 0 :(得分:0)

如果我没记错的话,使用更新时,方法必须按PUT或PATCH。为什么使用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);
}

答案 1 :(得分:0)

我有一个类似的问题,事实证明,在具有多个输入参数(如您的情况下的id和user)的方法上使用CachePut时。然后,默认密钥生成器使用这两个参数来生成密钥。即使指定key =“#user.id”,它也无法选择该值。解决方法是在键周围使用大括号。在您的情况下,密钥=“ {#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);
}