使用@CacheEvict Sping Boot 从Redis缓存中删除多个值

omhiaaxx  于 2023-03-07  发布在  Redis
关注(0)|答案(1)|浏览(311)

第一次使用Redis时(为了缓存),我使用该高速缓存来获取所有值并更新它们,但删除时除外,因为我希望允许用户一次删除多个值,而不是一次删除一个值(用户可以选择多个记录,然后删除所有这些记录,或者如果选择了一个值,则只删除该值)
现在,当我删除一条Single记录时,当我检查时,它将该高速缓存中删除,但是当我尝试删除多条记录时,这些值仍然保留在缓存中。

删除终结点

// In the request, a list of Ids can be passed or even just a single Id, and then those records will be deleted appropriately
    @CacheEvict(value="Post", key="#postId")
    @DeleteMapping("/posts/{postId}")
    public ResponseEntity<?> deletePosts(@PathVariable List<Long> postId, Principal principal) {
        postService.deleteMultiplePosts(postId, principal.getName());
        // When a record is deleted, just return all the remaining records as a response 
        return new ResponseEntity<>(createMapForPageContents(postService.findAllActivePostsByPostCreator(principal.getName(), PageRequest.of(0, 5))), HttpStatus.OK);
    }

服务方式

public void deleteMultiplePosts(List<Long> postIdList, String emailAddress) {
        List<Post> posts = new ArrayList<>();
        for (int i = 0; i < postIdList.size(); i++) {
            posts.add(findPostById(postIdList.get(i), emailAddress));
        }
        postRepository.deleteAll(posts);
    }

删除操作有效并反映在MySQL中,但不反映该高速缓存中(仅当尝试从缓存中删除多个值时,而不是一个值)
我在用 Postman 测试请求

dced5bon

dced5bon1#

您应该在@CacheEvict(value="Post", key="#postId")中添加allEntries = false,这样您应该

@CacheEvict(value="Post",allEntries = false , key="#postId")

相关问题