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

怎么做期货网站怎样找到工厂直招网站

怎么做期货网站,怎样找到工厂直招网站,如何用网络推广自己的公司,网页设计与网站开发基础教程title: redis读写一致问题 date: 2025-05-18 11:11:31 tags: redis categories: redis的问题方案 Redis读写一致问题 条件: 数据库此时的数据为10,redis此时的数据也为10 业务流程: 操作数据库使得数据库的数据为20,删除redis里面的数据保证读写一致 先删缓存…

title: redis读写一致问题
date: 2025-05-18 11:11:31
tags: redis
categories: redis的问题方案

Redis读写一致问题

条件:

数据库此时的数据为10,redis此时的数据也为10

业务流程:

操作数据库使得数据库的数据为20,删除redis里面的数据保证读写一致

先删缓存,再操作数据库

出现读写不一致情况:

在这里插入图片描述

线程1(业务)线程2(并发线程)
删除缓存
查询缓存,没有命中,查询数据库(数据库查到为10,下一步将10写入redis)
将10写入缓存
更新数据库,将数据库中的数据改为20

最终情况

redis里面的数据数据库里面的数据
1020

出现数据不一致情况

先操作数据库,再删除缓存

在这里插入图片描述

线程1(并发线程)线程2(业务线程)
查询缓存未命中,查询数据库(下一步:将缓存更新为10)
更新数据库 v=20
删除缓存
写入缓存数据10

最终情况:

redis数据数据库数据
1020

两个方法选择原则

适用策略典型场景是否推荐使用延迟双删
先删缓存 → 后更新数据库高一致性业务(余额、库存)✅ 一定要延迟双删!
先更新数据库 → 后删缓存低一致性业务(资料、文章内容)❌ 可以不用延迟双删

解决方案:双写一致性

读操作没啥问题按照老流程

在这里插入图片描述

延时双删

在这里插入图片描述

问题答案
先删缓存还是先改数据库?先删缓存! 避免并发写入旧值
为什么删两次?防止“改库之后,又有人写了旧值到缓存”
为什么要延迟删?给并发线程一个“写入脏缓存”的机会,然后再清理掉它

缺点:

问题点延迟双删解决得了么?推荐改进方式
并发窗口写入脏缓存❌ 只能删最后一个分布式锁 + 双删 / MQ
延迟时间难控制❌ 不可预测MQ 或 Canal 机制更精准
异步删除失败风险❌ 会丢失删除使用可靠任务队列 / Redis 持久化
操作复杂、代码维护困难❌ 容易遗漏 key封装中间件、使用 AOP统一处理

给他加锁

读写都加锁

在这里插入图片描述

如图,程序运行串行化,性能低

引入共享锁和排他锁机制

共享锁:读锁readLock,加锁之后,其他线程可以共享读操作

排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作

在这里插入图片描述

代码Demo

import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;public class UserService {private final RedissonClient redissonClient;private final RedisService redisService;     // 你封装的 Redis 工具类private final UserRepository userRepository; // 你操作数据库的类public UserService(RedissonClient redissonClient, RedisService redisService, UserRepository userRepository) {this.redissonClient = redissonClient;this.redisService = redisService;this.userRepository = userRepository;}// 读操作:加“读锁”public User getUserById(Long userId) {String key = "user:" + userId;String lockKey = "lock:user:" + userId;RReadWriteLock rwLock = redissonClient.getReadWriteLock(lockKey);RLock readLock = rwLock.readLock();try {readLock.lock(5, TimeUnit.SECONDS); // 加读锁,防止同时写入User user = redisService.get(key);  // 先查缓存if (user != null) {return user;}// 缓存未命中 → 查数据库并回写缓存user = userRepository.findById(userId);if (user != null) {redisService.set(key, user, 10, TimeUnit.MINUTES);}return user;} finally {readLock.unlock(); // 释放读锁}}// 写操作:加“写锁”public void updateUser(User user) {Long userId = user.getId();String key = "user:" + userId;String lockKey = "lock:user:" + userId;RReadWriteLock rwLock = redissonClient.getReadWriteLock(lockKey);RLock writeLock = rwLock.writeLock();try {writeLock.lock(10, TimeUnit.SECONDS); // 加写锁,防止并发读/写redisService.del(key);                // 删除缓存(第一次)userRepository.save(user);            // 更新数据库// 第二次删除可延迟做(避免并发写入旧值)Thread.sleep(500);                    // 模拟延迟redisService.del(key);                // 延迟删除(第二次)} catch (InterruptedException e) {e.printStackTrace();} finally {writeLock.unlock(); // 释放写锁}}
}
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;public class UserService {private final RedissonClient redissonClient;private final RedisService redisService;     // 你封装的 Redis 工具类private final UserRepository userRepository; // 你操作数据库的类public UserService(RedissonClient redissonClient, RedisService redisService, UserRepository userRepository) {this.redissonClient = redissonClient;this.redisService = redisService;this.userRepository = userRepository;}// 读操作:加“读锁”public User getUserById(Long userId) {String key = "user:" + userId;String lockKey = "lock:user:" + userId;RReadWriteLock rwLock = redissonClient.getReadWriteLock(lockKey);RLock readLock = rwLock.readLock();try {readLock.lock(5, TimeUnit.SECONDS); // 加读锁,防止同时写入User user = redisService.get(key);  // 先查缓存if (user != null) {return user;}// 缓存未命中 → 查数据库并回写缓存user = userRepository.findById(userId);if (user != null) {redisService.set(key, user, 10, TimeUnit.MINUTES);}return user;} finally {readLock.unlock(); // 释放读锁}}// 写操作:加“写锁”public void updateUser(User user) {Long userId = user.getId();String key = "user:" + userId;String lockKey = "lock:user:" + userId;RReadWriteLock rwLock = redissonClient.getReadWriteLock(lockKey);RLock writeLock = rwLock.writeLock();try {writeLock.lock(10, TimeUnit.SECONDS); // 加写锁,防止并发读/写redisService.del(key);                // 删除缓存(第一次)userRepository.save(user);            // 更新数据库// 第二次删除可延迟做(避免并发写入旧值)Thread.sleep(500);                    // 模拟延迟redisService.del(key);                // 延迟删除(第二次)} catch (InterruptedException e) {e.printStackTrace();} finally {writeLock.unlock(); // 释放写锁}}
}

中间件解决方案

异步通知保证数据的最终一致性

在这里插入图片描述

在这里插入图片描述

canal是基于mysql的主从同步来实现的

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。


文章转载自:

http://kJMFny11.Lmxzw.cn
http://TYmk4ITV.Lmxzw.cn
http://1nxTQU2b.Lmxzw.cn
http://H8NQZRtm.Lmxzw.cn
http://c67u7nIj.Lmxzw.cn
http://ABToR2pu.Lmxzw.cn
http://FravDhAW.Lmxzw.cn
http://EOXRobAd.Lmxzw.cn
http://H0UpfwM3.Lmxzw.cn
http://18lkfexS.Lmxzw.cn
http://NPAUrVbS.Lmxzw.cn
http://4JwcaZTu.Lmxzw.cn
http://4chvmFAy.Lmxzw.cn
http://gh27Nf4E.Lmxzw.cn
http://5PyZRb2Z.Lmxzw.cn
http://cdgn6wF4.Lmxzw.cn
http://9eZBikuJ.Lmxzw.cn
http://4kosjhwD.Lmxzw.cn
http://BcbY0ECb.Lmxzw.cn
http://kAhUSiLJ.Lmxzw.cn
http://tbUqT5LP.Lmxzw.cn
http://9uuPL1Qo.Lmxzw.cn
http://dob1Ggtr.Lmxzw.cn
http://n9zRNFdc.Lmxzw.cn
http://xDzrDCpB.Lmxzw.cn
http://vHXUuktk.Lmxzw.cn
http://YGkW9IsN.Lmxzw.cn
http://DfMJUTfe.Lmxzw.cn
http://kLIWeNfE.Lmxzw.cn
http://1yFFYVXP.Lmxzw.cn
http://www.dtcms.com/wzjs/696294.html

相关文章:

  • 顺的品牌网站设计价位ps制作网站logo
  • 贵港北京网站建设洛阳网站改版维护公司
  • 大连做网站哪家服务好开发公司和建筑公司同一法人
  • 手机视频网站建设河北中石化建设网站
  • 上海做网站的小公司建立网站的费用
  • 网站推广流程是建网站 xyz
  • 学校网站的建设费用吗广安哪里做网站
  • 建设工程询价网站有哪些南宁网站建设长春
  • 找人做网站注意哪些wordpress七牛云存储
  • 做ug图纸的网站广东城乡住房建设部网站
  • 手机建设网站制作开发网站的意义
  • 手机网站模板下载大数据营销的典型案例
  • 网站建设小技巧电子商务网站开发与应用的介绍
  • 泉州网站建设外包河南省新闻联播
  • 深圳手机端网站建设模板瑞幸咖啡网站建设方案
  • 做网站 如何注册公司wordpress 按点击排序
  • 互联网网站案例免费做金融网站
  • 网站设计编辑龙岩公司注册流程
  • 网站备案怎么换学的网络工程
  • 青岛网站建设定制网页视频下载器app免费
  • 360搜索网站提交入口知名网站建设官网
  • 网站后台发了文章看不到4399网页游戏官网
  • 网站开发数据郑州网站建设外贸
  • Python做网站难不难网站搭建空间
  • dede网站下载在手机上自建网站怎么弄
  • 滨州网站开发公司怎么找平台推广
  • 个人可以做的外贸网站如何建设手机网站首页
  • 建设工程信息网站有哪些如何进入wordpress
  • p2p网站制作流程wordpress 舆情管理系统
  • 公司做网站好wordpress免费域名