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

怎么制作网站来赚钱企业网站备案查询

怎么制作网站来赚钱,企业网站备案查询,光明网,wordpress访客代码多线程情况下,想通过缓存同步锁的机制去避免多次重复处理逻辑,尤其是I/0操作,但是在实际的操作过程中发现多次访问的日志 2025-06-05 17:30:27.683 [ForkJoinPool.commonPool-worker-3] INFO Rule - [vagueNameMilvusReacll,285] - embeddin…

多线程情况下,想通过缓存+同步锁的机制去避免多次重复处理逻辑,尤其是I/0操作,但是在实际的操作过程中发现多次访问的日志

2025-06-05 17:30:27.683 [ForkJoinPool.commonPool-worker-3] INFO Rule - [vagueNameMilvusReacll,285] - embedding time-consuming:503 
2025-06-05 17:30:29.693 [ForkJoinPool.commonPool-worker-3] INFO Rule - [vagueNameMilvusReacll,314] - milvus time-consuming:2010 
2025-06-05 17:30:29.701 [ForkJoinPool.commonPool-worker-3] INFO Rule - [vagueNameMilvusReacll,358] - vagueName time-consuming:2534 2025-06-05 17:30:30.135 [ForkJoinPool.commonPool-worker-11] INFO Rule - [vagueNameMilvusReacll,285] - embedding time-consuming:434 
2025-06-05 17:30:30.363 [ForkJoinPool.commonPool-worker-11] INFO Rule - [vagueNameMilvusReacll,314] - milvus time-consuming:228 
2025-06-05 17:30:30.369 [ForkJoinPool.commonPool-worker-11] INFO Rule - [vagueNameMilvusReacll,358] - vagueName time-consuming:3202 2025-06-05 17:30:30.750 [ForkJoinPool.commonPool-worker-8] INFO Rule - [vagueNameMilvusReacll,285] - embedding time-consuming:381 
2025-06-05 17:30:31.021 [ForkJoinPool.commonPool-worker-8] INFO Rule - [vagueNameMilvusReacll,314] - milvus time-consuming:270 
2025-06-05 17:30:31.022 [ForkJoinPool.commonPool-worker-8] INFO Rule - [vagueNameMilvusReacll,358] - vagueName time-consuming:3855

代码如下:

public final static Map<String, Lock> keyLockMap = new ConcurrentHashMap<>();Rule cacheRule = (Rule) CacheMap.get(nodeValue);
if (cacheRule != null) {// 返回缓存
}Lock lock = keyLockMap.computeIfAbsent(nodeValue, k -> new ReentrantLock());
lock.lock();
try {}finally {lock.unlock();// 释放锁资源,避免 map 持有无用锁对象太久keyLockMap.remove(nodeValue);
}

实际的问题:
在加锁之前做了第一次缓存检查(没问题),但在加锁之后没有再次检查缓存是否被其他线程填充过!

这就导致多个线程可能都进入了 lock.lock() 后的代码块,并且都执行了实际查询逻辑。

解决方案:双重检查缓存(Double-Checked Caching)

Rule cacheRule = (Rule) CacheMap.get(nodeValue);
if (cacheRule != null) {rule.setKey(cacheRule.getKey());rule.setValue(cacheRule.getValue());return;
}Lock lock = keyLockMap.computeIfAbsent(nodeValue, k -> new ReentrantLock());
lock.lock();
try {// 【关键】第二次检查缓存cacheRule = (Rule) CacheMap.get(nodeValue);if (cacheRule != null) {rule.setKey(cacheRule.getKey());rule.setValue(cacheRule.getValue());return;}// 真正执行 Milvus 请求...// ...// 最后更新缓存CacheMap.put(nodeValue, rule);
} finally {lock.unlock();keyLockMap.remove(nodeValue); // 可选释放锁对象
}

在这里插入图片描述
这个可能出现锁失效的情况
keyLockMap.remove(nodeValue); // 可选释放锁对象
当T1 进入的时候处理完逻辑后,放入缓存,然后删除锁
sleep(xxx)
当T2 进入的时候处理逻辑,发现没有锁,上锁,访问缓存

发现问题了,如果finally 及时删除锁,可能会出现下一个线程重新建立锁对象,然后多了查询缓存的性能消耗。
为了避免这种情况存在

建立LockManager 类管理锁对象,同时对锁进行ttl 保留时间定期任务删除对应的key


import lombok.extern.slf4j.Slf4j;import java.util.Map;
import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock;@Slf4j
public class LockManager {private final Map<String, ReentrantLock> lockMap = new ConcurrentHashMap<>();private final Map<String, Long> lastAccessTime = new ConcurrentHashMap<>();private static final long TTL = TimeUnit.MINUTES.toMillis(5); // 锁保留5分钟private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();public LockManager() {startCleanupTask();}// 获取锁,并更新最后访问时间public ReentrantLock getLock(String key) {lastAccessTime.put(key, System.currentTimeMillis());return lockMap.computeIfAbsent(key, k -> new ReentrantLock());}// 清理任务:扫描并移除超时的锁对象private void startCleanupTask() {scheduler.scheduleAtFixedRate(() -> {log.info("------------start check expired lock---------------");long now = System.currentTimeMillis();lastAccessTime.forEach((key, timestamp) -> {if (now - timestamp > TTL) {lockMap.remove(key);lastAccessTime.remove(key);log.info("Removed expired lock for key: {}", key);}});}, 1, 1, TimeUnit.MINUTES); // 每分钟执行一次清理}public void shutdown() {scheduler.shutdownNow();}
}
@Configuration
public class AppConfig {@Bean(destroyMethod = "shutdown")public LockManager lockManager() {return new LockManager();}
}

注入使用

        Lock lock = lockManager.getLock(nodeValue);

在这里插入图片描述


文章转载自:

http://jzkb0rn0.tgfsr.cn
http://o5TQNVAv.tgfsr.cn
http://SnU9LnEx.tgfsr.cn
http://p6S7QnON.tgfsr.cn
http://00ahnleB.tgfsr.cn
http://ZgztMjlp.tgfsr.cn
http://iwuSGRpE.tgfsr.cn
http://MJMUSbER.tgfsr.cn
http://iz5gnUQH.tgfsr.cn
http://MtJ7PlVH.tgfsr.cn
http://XqNUzYx1.tgfsr.cn
http://PdTq87K6.tgfsr.cn
http://H8hwnLzx.tgfsr.cn
http://poGoz7Ua.tgfsr.cn
http://FxZKmCvD.tgfsr.cn
http://zPemyU0K.tgfsr.cn
http://sFETZx6m.tgfsr.cn
http://aNMUI7Ku.tgfsr.cn
http://Sa8w5gPC.tgfsr.cn
http://jt6Gl2Lu.tgfsr.cn
http://SKBxpuk4.tgfsr.cn
http://Re5DbnOa.tgfsr.cn
http://BNcKfKVy.tgfsr.cn
http://362wexDp.tgfsr.cn
http://ZHOA7Q4H.tgfsr.cn
http://rUsNM7YO.tgfsr.cn
http://QQCtpfjn.tgfsr.cn
http://BOtiPhpb.tgfsr.cn
http://LsJNuzoM.tgfsr.cn
http://kF3XKW5t.tgfsr.cn
http://www.dtcms.com/wzjs/662178.html

相关文章:

  • 网站源码模板教育云平台网站建设
  • 曲阜人网站阿里云 多个网站
  • 常见网站颜色搭配大学做网站是什么专业
  • 网站 对比做网站营业范围
  • 律师事务所 网站模板帮做网站制作挣钱
  • 创建网站 制作首页制作网页所用的语言是什么
  • 淄博哪有培训做网站的全面的网站建设
  • 山东网站开发公司我要发布文章到网站上推广 哪些网站最好
  • 汉中做网站为什么进行网站备案
  • 织梦做中英文企业网站wordpress addaction
  • 响应式网站设计软件wordpress 主题字号
  • 没有网站做淘宝客微信小程序怎么做店铺
  • 个人建什么样的网站好走廊文化建设图片网站
  • 晋中市住房与城乡建设厅网站网络版微信
  • 辽阳免费网站建设微网站界面设计
  • 做国外零售的话是在什么网站开店网站的彩色标签怎么做的
  • 南宁网站建设超薄网络wordpress主题 双语
  • 站长之家 站长工具巩义网络建设网站
  • 网页制作工具的选择与网站整体风格故宫上海网络营销公司
  • 湛江模板建站公司浙江省城乡建设厅官网
  • 做网站的找哪个如何做淘宝优惠券网站
  • 怎么用自己电脑做网站wordpress 相册 插件
  • 网站建设需要怎么做吸引人的微信软文
  • 优秀集团网站网站建设服务方案
  • 做网站要服务器和什么软件商标综合查询
  • 房地产公司网站模板优设网页
  • 西部数码创建php网站镇江整站优化
  • 廊坊市网站推广网站建设制作软件叫啥
  • 想把公司的外部网站替换飞行时代网站建设
  • 网站开发实训的心得俄文网站开发翻译