JetCache
JetCache是由阿里巴巴开源的通用缓存访问框架,如果你对Spring Cache很熟悉的话,请一定花一点时间了解一下JetCache,它更好用。
JetCache提供的核心能力包括:
提供统一的,类似jsr-107风格的API访问Cache,并可通过注解创建并配置Cache实例
通过注解实现声明式的方法缓存,支持TTL和两级缓存
分布式缓存自动刷新,分布式锁 (2.2+)
支持异步Cache API
Spring Boot支持
Key的生成策略和Value的序列化策略是可以定制的
针对所有Cache实例和方法缓存的自动统计
商品缓存技术选型,一开始考虑使用Mybatis Redis二级缓存,但经实验验证不适合本项目
1.因为项目使用了Mybatis Plus,所以走二级缓存都要先配置Mybatis Plus,分页存在问题,还有关联表查询会有脏数据问题
2.作用于NamesSpaces,影响范围太大
后面使用了JetCache完成了商品缓存,实现如下:
后台管理系统对商品进行增改和上下架的时候删除对应的商品缓存,key是商品id,因为没有做商品删除,有删除也要加上注解。
@CacheInvalidate(name = Constant.PRODUCTDETAIL, key = "#productDto.id")
ResultMap saveOrUpdate(ProductAdminDto productDto, String id, String username);
@CacheInvalidate(name = Constant.PRODUCTDETAIL, key = "#productId")
ResultMap publish(String productId);
小程序接口缓存商品详情1个小时,半小时自动刷新一次,增减库存的同时删除对应的商品缓存,key是商品id。
//CachePenetrationProtect表示在多线程环境中同步加载数据。
@Cached(name = Constant.PRODUCTDETAIL, key = "#productId",expire = 3600, cacheType = CacheType.REMOTE)
@CacheRefresh(refresh = 1800, stopRefreshAfterLastAccess = 3600)
@CachePenetrationProtect
ResultMap moreDetail(String productId,String userid);
//增加库存
@CacheInvalidate(name = Constant.PRODUCTDETAIL, key = "#productId")
void addStock(String productId,Long count);
/**
* 减库存
* @param productId 商品id
* @param count 购买数量
* @return 100002库存不足 100001商品购买数量不能大于商品限购数量
*/
@CacheInvalidate(name = Constant.PRODUCTDETAIL, key = "#productId")
ResultMap subStock(String productId,Long count,String userid);
@Cached(name = Constant.PRODUCTLIST,key = "#ids+#city",expire = 2, timeUnit = TimeUnit.MINUTES, cacheType = CacheType.REMOTE)
List selectByIds(List ids, String city);
查询商品列表的时候查询时间两分钟,然后自动过期,因为商品列表无法做到和数据库信息保持一致,这里用了比较折中的方案,两分钟过期。因为后台当商品修改的时候,无法同步更新到商品列表。