spring 如何选择性清除redis缓存?

pu3pd22g  于 2023-05-16  发布在  Spring
关注(0)|答案(1)|浏览(142)

我有一个Sping Boot 应用程序,它正在缓存一些值,例如<UserId,MyPojo.class>。
示例MyPojo字段:

  • 身份证
  • 代码

如果对MyPojo.code进行了更改,那么我希望为所有拥有该MyPojo.id的用户该高速缓存。
我已经看过带条件的@CacheEvict注解,但这似乎只是为了决定是否在某些条件下驱逐缓存,而不检查该高速缓存本身中存在什么。
另一种选择是遍历每个缓存条目,检查值并清除该键,但这似乎代价很高。
有什么建议吗?

yptwkmov

yptwkmov1#

切换键/值,你的生活会更轻松;)
当您对在该高速缓存中作为值存储的对象进行更改时,有两种方法可以仅清除相关的缓存对象:

  1. MyPojo有一个对所有“拥有”这个pojo的UserId的引用(不太可能)。然后,您只需获取UserId的列表,并为每个调用添加一个以UserId作为参数的@CacheEvict注解的方法。这将表明UserId是要从该高速缓存中逐出的键。
    1.使用cache.getNativeCache()获取本地缓存实现,然后循环遍历此缓存的条目,并检查<cached MyPojo's id> == <modified MyPojo's id>。如果是,则将其从缓存中逐出。这将取决于你的缓存实现,所以看看如何为Redis做到这一点。
    如果我是你,我会切换到使用MyPojo.id作为键,并存储一些List作为缓存值。然后,如果您对MyPojo进行更改,您可以简单地从该高速缓存中驱逐该id。

相关问题