Apache Ignite 2.14.0:会话过期时如何彻底移除缓存对象?
解决Apache Ignite 2.14.0中TRANSACTIONAL缓存会话过期后备份残留的问题
针对你遇到的会话过期后主缓存被移除、但TRANSACTIONAL模式下备份缓存残留的问题,可以通过以下几种配置和调整彻底解决:
调整缓存事务与过期策略的同步逻辑
当缓存使用TRANSACTIONAL原子性模式时,默认的过期移除操作可能未在事务上下文内同步到备份节点。在缓存配置中,需确保过期清理操作绑定事务,同时显式开启主备节点的同步:CacheConfiguration<String, Session> cacheCfg = new CacheConfiguration<>("web-sessions"); cacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); // 设置会话过期时长(示例为30分钟) cacheCfg.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(new Duration(TimeUnit.MINUTES, 30))); // 配置事务并发与隔离级别,确保移除操作同步到备份节点 cacheCfg.setTransactionConcurrency(TransactionConcurrency.PESSIMISTIC); cacheCfg.setTransactionIsolation(TransactionIsolation.SERIALIZABLE);自定义WebSessionFilter的会话销毁逻辑
默认的WebSessionFilter可能仅在主节点执行会话移除,未触发跨节点事务同步。可以扩展过滤器,在销毁会话时通过事务执行缓存移除:public class CustomWebSessionFilter extends WebSessionFilter { @Override protected void destroySession(HttpServletRequest req, String sesId) { try (Ignite ignite = Ignition.ignite()) { IgniteCache<String, Session> cache = ignite.cache(getCacheName()); // 开启事务执行移除,保证主备节点同时清理 try (Transaction tx = ignite.transactions().txStart()) { cache.remove(sesId); tx.commit(); } } super.destroySession(req, sesId); } }之后在web.xml中将默认过滤器替换为这个自定义实现。
启用全局过期清理线程兜底
配置Ignite的过期扫描线程,让它定期在所有节点(包括备份节点)上扫描并清理过期条目,作为兜底机制:IgniteConfiguration igniteCfg = new IgniteConfiguration(); // 设置扫描频率(示例为每分钟一次) igniteCfg.setExpiryScannerFrequency(60_000); // 启用类加载同步,确保清理逻辑在所有节点生效 igniteCfg.setPeerClassLoadingEnabled(true);
内容的提问来源于stack exchange,提问作者kjtnk
相关产品推荐
相关产品推荐

