【问题标题】:Spring boot application with Redis cache and Mysql带有 Redis 缓存和 Mysql 的 Spring Boot 应用程序
【发布时间】:2019-01-09 14:22:43
【问题描述】:

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

@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);
    }

}

帮我解决问题

【问题讨论】:

    标签: mysql spring-boot redis


    【解决方案1】:

    如果我没记错的话,使用更新时,方法必须 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);
    }
    

    【讨论】:

    • 当我执行删除操作时,它只会从数据库中删除,而不是从缓存中删除。
    • 尝试删除方法中的选项:allEntries = true
    • 我试过了,还是不行。我认为这个问题是由 jedis 版本引起的。
    【解决方案2】:

    我遇到了类似的问题,结果证明当在具有多个输入参数的方法上使用 CachePut 时(如您的情况下的 id 和 user)。然后,默认密钥生成器使用这两个参数来生成密钥。即使您指定 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 2022-08-20
      • 1970-01-01
      • 2020-09-24
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2021-07-04
      相关资源
      最近更新 更多