当前位置: 首页 > news >正文

天津市企业网站设计公司wordpress md风格主题

天津市企业网站设计公司,wordpress md风格主题,扬中网站,展陈公司排名需求 希望能够实现清理指定对象缓存的方法#xff0c;例如缓存了User表#xff0c;当User表巨大时#xff0c;通过id全量去清理不现实#xff0c;耗费资源也巨大。因此需要能够支持清理指定本地和远程缓存的批量方法。 分析 查看jetcache生成的cache接口#xff0c;并没… 需求 希望能够实现清理指定对象缓存的方法例如缓存了User表当User表巨大时通过id全量去清理不现实耗费资源也巨大。因此需要能够支持清理指定本地和远程缓存的批量方法。 分析 查看jetcache生成的cache接口并没有提供一个例如getAll()或invalidate的方法。因此需要能够扩展 查看jetcache源码jetcache对于单级和多级缓存实现了统一的cache接口 当为单级缓存时直接返回缓存的包装Cache 当为多级缓存时返回MultiLevelCache 所有的缓存都实现了接口的unwrap方法当指定一个类型时会返回对应的包装Cache否则抛出IllegalArgumentException 源码里MultiLevelCache的unwrap如下 Overridepublic T T unwrap(ClassT clazz) {Objects.requireNonNull(clazz);for (Cache cache : caches) {try {T obj (T) cache.unwrap(clazz);if (obj ! null) {return obj;}} catch (IllegalArgumentException e) {// ignore}}throw new IllegalArgumentException(clazz.getName());}也就是说当多级缓存这里是2级实际可以支持多级时可以通过类型指定unwarp到对应的缓存这样我们就可以通过cache拿到对应的本地缓存进而调用缓存全量清理方法 实现 因此实现思路如下 对于本地的缓存直接unwrap后全量清理掉 对于远程的缓存直接redis缓存访问并通过key的查询方法将符合条件的缓存批量清理掉 对于其他机器的缓存采用订阅发布的方式让其他机器收到消息后unwrap并清理本地缓存。 1) 本地缓存处理 将jetcache的缓存拿出来unwrap即可调用caffeine cache的invalidateAll实现清理本地缓存实现一个方法 Overridepublic void evictCacheLocal() {//清理本地if(cache ! null){com.github.benmanes.caffeine.cache.Cache caffeineCache cache.unwrap(com.github.benmanes.caffeine.cache.Cache.class);caffeineCache.invalidateAll();}}2) 远程缓存处理 远程的目前系统使用了redission驱动使用RKeys将符合前缀的远程清理掉。getKeysByPattern是按10个一组SCAN得到因此不会阻塞redis按100个一组清理即可如果数据较多可以考虑更大点 Overridepublic void evictCacheAll() {// 清理redisRKeys keys redissonClient.getKeys();IteratorString keysList keys.getKeysByPattern(GlobalEx.CACHEREGION_ENTITY entityClass.getSimpleName() -*).iterator();ListString processList new ArrayList();while(keysList.hasNext()) {processList.add(keysList.next());if(processList.size() 100){keys.delete(processList.toArray(new String[processList.size()]));processList.clear();}}if(processList.size() 0){keys.delete(processList.toArray(new String[processList.size()]));}}3) 其它机器缓存处理 研究了下源码jetcache没有很方便的扩展点因此直接绕过jetcache的订阅发布。直接用其它组件去实现订阅发布目前系统已经引入了redission因此直接使用redission的订阅/发布。 这里实现了一个订阅监听列表直接在subsys.子系统.notify添加自己的发布/监听器即可 监听消息类notifyType可以区别消息类型 package org.ccframe.commons.notify;import com.alibaba.fastjson2.annotation.JSONField; import lombok.AllArgsConstructor; import lombok.Data;Data AllArgsConstructor public class NotifyMessage {private int notifyType;JSONField(name message)private String message; }消息监听基类使用Json通知消息 package org.ccframe.commons.notify;import com.alibaba.fastjson2.JSON; import lombok.extern.log4j.Log4j2; import org.ccframe.commons.helper.CcNotifyHelper; import org.springframework.beans.factory.annotation.Autowired;import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;Log4j2 public abstract class BaseNotifyListenerT {public abstract int getNotifyType();private final ClassT messageClass;Autowiredprivate CcNotifyHelper ccNotifyHelper;public BaseNotifyListener(){Type genType getClass().getGenericSuperclass();this.messageClass (ClassT) ((ParameterizedType) genType).getActualTypeArguments()[0];}public void receiveData(String notifyMessage){T message JSON.parseObject(notifyMessage, messageClass);try {process(message);}catch (Throwable tr){log.error(tr);}}public void sendData(T notifyMessage){ccNotifyHelper.sendNotify(getNotifyType(), JSON.toJSONString(notifyMessage));}protected abstract void process(T message); }记得配置一下包扫描 ComponentScan({org.ccframe.subsys.*.notify //所有的订阅广播 }) 然后写一个子类收到消息后调用baseservice的清理方法清理本地缓存 package org.ccframe.subsys.core.notify;import org.apache.commons.lang3.StringUtils; import org.ccframe.commons.base.BaseService; import org.ccframe.commons.helper.SpringContextHelper; import org.ccframe.commons.notify.BaseNotifyListener; import org.springframework.stereotype.Component;Component public class ClearLocalCacheNotifyListener extends BaseNotifyListenerString {Overridepublic int getNotifyType() {return 0;}Overrideprotected void process(String message) {SpringContextHelper.getBean(StringUtils.uncapitalize(message) Service, BaseService.class).evictCacheLocal();} }因此在evictCacheAll最后调用发送清理消息收到所有的订阅清空本地对应对象缓存即可 Overridepublic void evictCacheAll() {// 清理redisRKeys keys redissonClient.getKeys();IteratorString keysList keys.getKeysByPattern(GlobalEx.CACHEREGION_ENTITY entityClass.getSimpleName() -*).iterator();ListString processList new ArrayList();while(keysList.hasNext()) {processList.add(keysList.next());if(processList.size() 100){keys.delete(processList.toArray(new String[processList.size()]));processList.clear();}}if(processList.size() 0){keys.delete(processList.toArray(new String[processList.size()]));}// 广播清理本地缓存clearLocalCacheNotifyListener.sendData(entityClass.getSimpleName());}写个controller方法测试一下 DubboReference(checkfalse)private IUserService userService;GetMapping(test)public QuartzRowDto test(ApiIgnore HttpServletRequest request) {userService.evictCacheAll();return new QuartzRowDto();} 检查一下能够收到清理消息清理本地缓存 这样即可快速的完成本地和远程的指定表缓存的清理也不受表数据过大影响了
http://www.pierceye.com/news/354074/

相关文章:

  • 网站维护有啥用2021跨境电商最火的产品
  • 专业的东莞网站排名wordpress 客户端使用
  • 做网站需要什么人才网站建设与规划案例
  • 你学做网站学了多久建设网站困难的解决办法
  • 东莞如何搭建网站建设做招聘信息的网站
  • 网站行业认证怎么做安卓开发技术
  • 泉州城乡住房建设厅网站网站运营方案ppt
  • 免费做网站wxp114五种常用的网站推广方法
  • 简单的网站建设找哪个公司新网站seo技术
  • 电子网址怎么创建下载优化大师app
  • 网站上传服务器教程wordpress 开启多用户
  • 做网站的公司重庆互联网营销方式
  • 在线探测网站开发语言东莞人才市场现场招聘会地址
  • 检测网站是否被挂黑链seo网站营销推广
  • 当今网站开发技术的现状自己做的网站怎么上排行榜
  • 外贸没有公司 如何做企业网站?成都市住房和城乡建设局官网查询
  • 公证网站建设管理无锡百度正规推广
  • 免费海外网站建设自学设计软件的免费网站
  • 个人姓名最多备案多少个网站外贸网站制作公司
  • 上海市建设安全协会官方网站上海人才网官网公示
  • 原创文章网站wordpress注册页面修改密码
  • 山东省建设注册执业中心网站博物馆网站做的最好的
  • 做论坛网站能赚钱吗山东济南网站建设公司
  • 建网站海外英文建站
  • 学网站开发网页制作苏州模板建站哪家好
  • 音乐网站建设怎么上传音乐易点租电脑租赁官网
  • 做足球网站前景一个网站源码值多少钱
  • 成都网站排名优化公司上海创意网站建设
  • 贵阳市住房城乡建设局八大员网站wordpress 输出 文章时间
  • 那个装修公司的网站做的好想创业去哪里找项目