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

在施工过程中某施工企业的安全网站seo思路

在施工过程中某施工企业的安全,网站seo思路,网站的前端怎么做,江苏品牌网站建设第一部分:本地缓存实现的逐步解析 1.1 本地缓存的实现原理 本地缓存实现分为两步: 项目启动时初始化缓存:从数据库加载数据到内存(如 Map),为后续快速访问做准备。数据变化时实时刷新缓存:通…

第一部分:本地缓存实现的逐步解析

1.1 本地缓存的实现原理

本地缓存实现分为两步:

  1. 项目启动时初始化缓存:从数据库加载数据到内存(如 Map),为后续快速访问做准备。
  2. 数据变化时实时刷新缓存:通过 Redis Pub/Sub 机制,当数据发生变化(如增删改)时,发送消息通知所有实例更新本地缓存,确保数据一致性。

1.2 代码实现步骤

步骤 1:定义缓存初始化接口

在 RoleService 接口中定义 initLocalCache 方法,用于初始化本地缓存。

public interface RoleService {/*** 初始化角色的本地缓存*/void initLocalCache();
}
  • 解释
    • 目的:定义接口方法,方便后续在服务层实现缓存初始化逻辑,并允许其他组件(如消费者)调用。
    • 原因:通过接口定义,保持代码的模块化和可扩展性,尤其是在分布式环境中需要刷新缓存时,可以直接调用此方法。
步骤 2:实现缓存初始化逻辑

在 RoleServiceImpl 类中,通过 @PostConstruct 注解实现项目启动时的缓存初始化。

@Service
public class RoleServiceImpl implements RoleService {@Resourceprivate RoleMapper roleMapper;/*** 角色缓存* key:角色编号 {@link RoleDO#getId()}* volatile 修饰,确保线程安全*/@Getterprivate volatile Map<Long, RoleDO> roleCache;/*** 初始化 {@link #roleCache} 缓存*/@Override@PostConstructpublic void initLocalCache() {// 忽略多租户隔离,加载所有角色数据TenantUtils.executeIgnore(() -> {// 第一步:查询数据库List<RoleDO> roleList = roleMapper.selectList();log.info("[initLocalCache][缓存角色,数量为:{}]", roleList.size());// 第二步:构建缓存roleCache = CollectionUtils.convertMap(roleList, RoleDO::getId);});}
}

解释

  • 缓存存储:roleCache 是一个 Map<Long, RoleDO>,以角色 ID 为键,RoleDO 对象为值,存储在内存中。
  • volatile 修饰:确保多线程环境下缓存的可见性,当缓存刷新时,直接替换整个 Map 对象。
  • @PostConstruct:Spring 容器初始化 bean 后自动调用此方法,在项目启动时加载角色数据。
  • TenantUtils.executeIgnore:忽略多租户隔离,加载所有租户的角色数据到缓存。因为角色数据是全局共享的,不受租户限制。
  • 查询与构建
    • 使用 MyBatis-Plus 的 roleMapper.selectList() 查询所有角色。
    • 使用 CollectionUtils.convertMap(Hutool 工具)将角色列表转换为 Map,以 ID 作为键,便于快速查找。
步骤 3:定义刷新消息(RoleRefreshMessage)

为实现分布式环境下的缓存同步,定义 RoleRefreshMessage 类,作为 Redis Pub/Sub 的消息载体。

@Data
@EqualsAndHashCode(callSuper = true)
public class RoleRefreshMessage extends AbstractRedisChannelMessage {
}

解释

  • 继承:AbstractRedisChannelMessage 是 yudao 项目自定义的基类,可能包含 Redis 频道信息(如 topic)。
  • 作用:RoleRefreshMessage 是一个空消息体,仅用于通知角色数据变更,实际刷新逻辑由消费者执行。
  • 简单设计:无需携带具体数据,因为刷新时会重新查询数据库。
步骤 4:实现消息生产者(RoleProducer)

创建 RoleProducer 类,负责在角色数据变更时发送刷新消息。

@Component
public class RoleProducer {@Resourceprivate RedisMQTemplate redisMQTemplate;/*** 发送角色刷新消息*/public void sendRoleRefreshMessage() {RoleRefreshMessage message = new RoleRefreshMessage();redisMQTemplate.send(message);}
}

解释

  • RedisMQTemplate:yudao 自定义的 Redis 消息队列模板,基于 Redis Pub/Sub 发布消息。
  • sendRoleRefreshMessage:创建并发送 RoleRefreshMessage 到 Redis 指定频道。
步骤 5:在数据变更时发送刷新消息

在 RoleServiceImpl 的数据写入方法(如新增、更新)中,调用 RoleProducer 发送刷新消息。

@Service
public class RoleServiceImpl implements RoleService {@Resourceprivate RoleMapper roleMapper;@Resourceprivate RoleProducer roleProducer;@Override@Transactionalpublic long createRole(RoleCreateReqVO reqVO, Integer type) {// 校验角色checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null);// 插入数据库RoleDO role = RoleConvert.INSTANCE.convert(reqVO);role.setType(ObjectUtil.defaultIfNull(type, RoleTypeEnum.CUSTOM.getType()));role.setStatus(CommonStatusEnum.ENABLE.getStatus());role.setDataScope(DataScopeEnum.ALL.getScope());roleMapper.insert(role);// 发送刷新消息(事务提交后)TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCommit() {roleProducer.sendRoleRefreshMessage();}});return role.getId();}@Override@Transactionalpublic void updateRole(RoleUpdateReqVO reqVO) {// 校验角色checkUpdateRole(reqVO.getId());checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId());// 更新数据库RoleDO updateObject = RoleConvert.INSTANCE.convert(reqVO);roleMapper.updateById(updateObject);// 发送刷新消息roleProducer.sendRoleRefreshMessage();}
}

解释

  • 数据变更:createRole 和 updateRole 方法分别处理角色的新增和更新操作。
  • 事务同步:在 createRole 中,使用 TransactionSynchronizationManager 确保消息在事务提交后发送,避免数据未提交就通知刷新。
  • 消息发送:调用 roleProducer.sendRoleRefreshMessage(),通知所有实例刷新本地缓存。
步骤 6:实现消息消费者(RoleRefreshConsumer)

创建 RoleRefreshConsumer 类,监听 Redis 频道的刷新消息并更新本地缓存。

@Component
@Slf4j
public class RoleRefreshConsumer extends AbstractRedisChannelMessageListener<RoleRefreshMessage> {@Resourceprivate RoleService roleService;@Overridepublic void onMessage(RoleRefreshMessage message) {log.info("[onMessage][收到 Role 刷新消息]");roleService.initLocalCache();}
}

解释

  • 继承:AbstractRedisChannelMessageListener 是 yudao 的基类,处理 Redis Pub/Sub 消息监听。
  • onMessage:收到 RoleRefreshMessage 后,调用 roleService.initLocalCache() 重新加载角色数据到本地缓存。
  • 分布式同步:通过 Redis Pub/Sub,所有部署实例都会收到消息并刷新各自的本地缓存,确保一致性。
步骤 7:使用本地缓存

在业务逻辑中直接访问 roleCache,避免数据库查询。

@Service
public class RoleServiceImpl implements RoleService {@Overridepublic RoleDO getRole(Long id) {return roleCache.get(id);}
}
  • 解释
    • 快速访问:直接从 roleCache 获取角色数据,速度远快于数据库查询。
    • 一致性:通过初始化和刷新机制,roleCache 与数据库保持一致。

1.3 实现总结

  • 初始化:项目启动时通过 @PostConstruct 加载角色数据到 roleCache。
  • 刷新机制:数据变更时通过 Redis Pub/Sub 广播消息,所有实例调用 initLocalCache 刷新缓存。
  • 多租户处理:使用 TenantUtils.executeIgnore 忽略租户隔离,加载全局数据。
  • 分布式支持:Redis Pub/Sub 确保多实例环境下的缓存一致性。

http://www.dtcms.com/wzjs/364751.html

相关文章:

  • 做网站广告公司联系方式长春seo网站优化
  • 设计网站建设宽带业务如何推广
  • 如何做的网站手机可以用吗友情链接网自动收录
  • 网站换ip影响 百度关键词优化seo费用
  • 网站做排名靠前广州网络营销产品代理
  • 网站美工网络舆情案例分析
  • 东莞网站建设方案重庆网站排名公司
  • 网站注册页面无锡网站推广公司
  • sem推广软件哪家好seo快速排名软件案例
  • 景德镇网站建设公司最新黑帽seo教程
  • wordpress建立商业网站济南优化网页
  • 佛教网站建设_精品推荐黄色大气极乐古寺网站源码百度指数数据官网
  • 广州网站建设市场ip网站查询服务器
  • 长沙网站优化厂家合肥全网推广
  • 郑州百度推广代运营公司东莞网站seo优化
  • 大型网站的技术架构问题免费长尾词挖掘工具
  • 宁夏微信服务网站银川seo优化
  • wordpress阿里百秀5.4网站优化排名哪家好
  • 网站设计文档百度小说排行榜前十名
  • 专业网站开发哪里找怎么做app推广
  • 如何去国外网站看内容网站收录是什么意思
  • 揭阳网站制作怎样十大骗子教育培训机构
  • 网站建设制作咨询客服指数基金定投技巧
  • 做58同城网站可靠么seo课程排行榜
  • 网站开发简介怎么接app推广的单子
  • 建设银行公积金预约网站首页海南乐秀同城群软件下载
  • ppt做视频的模板下载网站有哪些关键词密度
  • 公司建设网站的优缺点seo工作职位
  • 苏州网站建设费用平台接广告在哪里接的
  • 网站建设服务合同谷歌官网下载