[请教]Spring Boot 使用 Redis,缓存集合数据的疑问

2022-08-11 10:12:35 +08:00
 fox0001

Spring Boot 集成 Redis ,使用 @Cacheable 等注解,以 ID 为 key ,可以方便地缓存数据。但是如果要缓存一个集合的数据,同时需要读取或更新其中某条数据的情况下,怎样做才是最近实践?

比如国家和地区数据,有 ID 、国家和地区名称等,最多 200 多条。这种数据变化频率极低,更新缓存可以忽略。只是有时需要获取所有数据(比如修改地址选国家),有时需要获取一条数据(比如显示地址)。

方案 1 ,使用 List 对象缓存所有国家。

取所有国家时,就是从 Redis 获取这个 List 对象。但是取一个国家时,需要或者这个 List 对象,再取出指定 ID 的数据。或者把 List 换成 LinkedHashMap ,提高获取单条数据的效率。但是,为了取一条数据而把所有国家从 Redis 反序列化出来,感觉有点浪费性能,甚至还不如直接从数据库取(这里需要测试对比)。

方案 2 ,只缓存单条国家数据。

就是 getCountryById 方法加上 @Cacheable 注解,提高获取单个国家的效率,而且这个使用场景更多。需要获取所有国家的话,直接查数据库。

方案 3 ,单条国家数据和所有国家数据分开缓存。

getCountryById 和 findAllCountries 两个方法都加上 @Cacheable 注解,各自的缓存 key 不同。缺点是缓存了两份相同的数据,更新缓存时还得两边都处理。

方案 4 ,使用 Redis 的 List 或者 Hash 数据类型进行缓存。

完美支持一次过获取全部数据和只获取单条数据的场景。更新时不用全部更新。缺点是不能使用 @Cacheable 等注解。

或者有没有更好的方案?

2425 次点击
所在节点    Java
22 条回复
fox0001
2022-08-28 08:27:24 +08:00
@golangLover #20 多个服务都是使用 Hibernate 的话,可以配置为指向同一个二级缓存。Hibernate 二级缓存就不用手工清除了。

如果有的服务使用 Java ,有的使用 Go ,这种情况没遇到过。
golangLover
2022-08-28 10:14:19 +08:00
@fox0001 好的。谢谢你。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/872090

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX