Spring Boot 社交应用如何实现自定义内存缓存及适配对应API接口
自研内存缓存实现思路
底层数据结构设计
核心存储直接用JDK自带的ConcurrentHashMap,天生支持多线程并发读写,不用自己处理锁竞争问题,对新手非常友好。
- Key统一使用字符串,格式固定为
业务域:唯一标识,比如user:1001、feed:public:top_like,避免不同业务的Key冲突 - Value封装为自定义的缓存实体类,包含3个核心字段:实际存储的业务数据、缓存过期时间戳、累计访问次数(用于缓存淘汰)
如果需要实现LRU(最近最少使用)淘汰策略,额外维护一个双向链表,每次访问缓存时把对应节点移到链表头部,内存达到阈值时直接删除链表尾部的节点即可;如果用LFU(最不经常使用)策略,直接基于Value里的访问次数字段排序淘汰即可。
核心逻辑实现
- 过期清理:单独启动一个低优先级的守护线程,每30秒全量遍历一次缓存,删除所有已过期的条目,避免无效数据占用内存
- 读写规则:读缓存时先判断条目是否过期,过期直接删除并返回空,未过期则更新访问时间/访问次数后返回数据;写缓存时直接覆盖对应Key的内容,同时设置过期时间
- 一致性保证:所有数据库更新操作执行完成后,直接删除对应缓存,不要主动更新缓存,避免多线程并发写时出现数据不一致的问题
Spring 集成方案
自定义一个缓存管理器类实现Spring原生的CacheManager接口,之后直接用Spring自带的@Cacheable、@CacheEvict、@CachePut注解就能完成缓存的读写和失效操作,不需要手动写重复的缓存操作代码,符合Spring的开发规范。
适合添加缓存的API接口
优先选择读多写少、实时性要求不是极高、访问频率高的接口加缓存:
- 用户基础信息查询接口:用户头像、昵称、好友列表等数据修改频率极低,缓存过期时间可设为1小时,用户修改资料时主动清除对应缓存即可
- 公开动态列表、公开高赞动态接口:全量用户可访问,访问量极大,缓存命中率非常高,过期时间可设为5~10分钟,有新增高赞公开动态时异步清理缓存即可
- 个人有权限查看的好友私密动态列表:每个用户的好友动态独立,缓存Key携带用户ID,过期时间设为3~5分钟,好友发布新动态时给对应好友的动态缓存发失效通知即可
- 动态点赞数、评论数统计接口:这类统计数据对实时性要求较低,缓存1分钟即可,每次有新增点赞、评论时异步清理对应缓存即可
注意:如果后期要做集群部署,自研的本地内存缓存是节点独立的,跨节点的缓存一致性需要额外处理,单节点部署时直接用没有问题。
内容的提问来源于stack exchange,提问作者Yasar Whizz
相关产品推荐
相关产品推荐

