网站访问统计js代码百度资讯

web/2025/10/3 11:42:48/文章来源:
网站访问统计js代码,百度资讯,手机网站html声明,3m网站源码一、缓存双写一致性 如果redis中有数据#xff1a;需要和数据库中的值相同。如果redis中没有数据#xff1a;数据库中的值要是最新值#xff0c;且准备回写redis。只读缓存。读写缓存#xff1a;①、同步直写策略#xff1a;写数据库后也同步写redis缓存#xff0c;缓存…一、缓存双写一致性 如果redis中有数据需要和数据库中的值相同。如果redis中没有数据数据库中的值要是最新值且准备回写redis。只读缓存。读写缓存①、同步直写策略写数据库后也同步写redis缓存缓存和数据库中的数据一致对于读写缓存来说要想保证缓存和数据库中的数据一致就要采用同步直写策略。②、异步缓写策略正常业务运行中mysql数据变动了但是可以在业务上容许出现一定时间后才作用于redis如仓库、物流等功能。异常情况出现了不得不将失败的动作重新修补有可能需要借助kafka或者rabbitMQ等消息中间件实现重试重写。双检加锁策略多个线程同时去查询数据库的这条数据那么就可以第一个查询数据的请求上使用一个互斥锁来锁住它。其他线程走到这一步拿不到锁就等着等第一个线程查询到了数据然后做缓存。后面的线程进来发现已经有缓存了就直接走缓存。 1.1、数据库和缓存一致性的更新策略 目的给缓存设置过期时间定期清理缓存并回写是保证最终一致性的解决方案。 可以对存入缓存的数据设置过期时间所有的写操作以数据库为准对缓存操作只是尽最大努力即可。就是如果数据库写入成功缓存更新失败那么只要到达过期时间则后面的读请求自然会从数据库中读取新值然后回填缓存达到一致性要以mysql的数据库写入库为准。 1.1.1、在停机的情况下 给出公告服务升级单线程这样重量级的数据操作最好不要多线程。 1.1.2、先更新数据库再更新缓存 1、情况1①、先更新mysql的某商品的库存当前商品的库存是100更新为99。②、先更新mysql修改为99成功然后更新redis。③、出现异常更新redis失败了导致MySQL里面的库存是99而redis里面还是100。所以会导致数据库里的数据和缓存redis里面数据不一致读到redis脏数据。 2、情况2在多线程环境下A,B两个线程有快有慢。①、A更新mysql为100。②、B更新mysql为90。③、B先更新redis为90。④、A再更新redis为100。所以导致redis与mysql更新的数据不一致。 1.1.3、先更新缓存再更新数据库 不推荐业务上一般把mysql作为底单数据库保证最后解释。 1.1.4、先删除缓存再更新数据库 1、请求A进行写操作删除redis缓存后工作正在进行中更新mysql……A还没有彻底更新完mysql还没commit。 2、请求B开工查询查询redis发现缓存不存在(被A从redis中删除了)。 3、请求B继续去数据库查询得到了mysql中的旧值(A还没有更新完)。 4、请求B将旧值写回redis缓存。 5、请求A将新值写入mysql数据库。 这样依然会导致数据不一致的情况发生。 解决方法采用延时双删策略A线程删除redis缓存然后sleep一段时间这期间就是为了让B线程先从数据库读取数据再把缺失的数据写入缓存然后线程A再进行删除。所以线程A sleep的时间就需要大于线程B读取数据再写入缓存的时间。这样其它线程读取数据时会发现缓存缺失所以会从数据库中读取最新值因为这个方案会在第一次删除缓存后延迟一段时间再次进行删除所以叫做延迟双删。 延时双删的不足 这个删除该休眠多久呢 线程A sleep的时间需要大于线程B读取数据再写入缓存的时间。①、在业务程序运行的时候统计下线程读数据和写缓存的操作时间评估出项目的读数据业务逻辑的耗时以此为基础然后写数据的休眠时间则在读数据业务的耗时上加百毫秒就行。这样确保请求结束写请求可以删除读请求造成的缓存脏读。②、新启动一个后台监控程序如watchdog监控程序会加时。 1.1.5、先更新数据库在删除缓存 缺点缓存删除失败或者来不及导致请求再次访问redis时缓存命中读取到的是缓存旧值。 解决方案 可以把要删除的缓存值或者是要更新的数据库值暂存到消息队列中(如使用Kafaka/RabbitMQ)。当程序没有能够成功地删除缓存值或者是更新数据库值时可以从消息队列中重新读取这些值然后再次进行删除或更新。如果能够成功地删除或更新我们就要把这些值从消息队列中去除以免重复操作此时也可以保证数据库和缓存的数据一致了否则还需要再次进行重试。当重试超过一定次数后就需要向业务层发送保错信息了通知运维人员。 总结 1.2、Redis与Mysql数据双写一致性 1.2.1、canal 主要用途用于MySQL数据库增量日志数据的订阅消费和解析是阿里巴巴开发并开源的采用Java语言开发。 主要功能1、数据库镜像2、数据库实时备份。3、索引构建和实时维护(拆分异构索引、倒排索引等)。4、业务cache刷新。5、带业务逻辑的增量数据处理。 工作原理①、canal模拟MySQL  slave的交互协议伪装自己为MySQL master发送dump协议。②、MySQL master收到dump请求开始推送binary log给slave即canal ③、canal解析binary  log对象(原始为byte流)。 下载地址GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅消费组件 1.2.2、Redis与Mysql数据双写一致性实现 mysql前置配置 、MySQL 5.7.36、当前主机二进制日志SHOW  MASTER STATUS;、查看SHOW VARIABLES LIKE log_bin;、开启MySQL的binlog写入功能在mysql的ini文件中配置 log-binmysql-bin #开启binlog binlog-formatROW #开启ROW模式 server_id1 #配置MySQL replction需要定义不要和canal的slaveid重复   重启mysql、再次查看SHOW VARIABLES LIKE log_bin; 授权canal连接MySQL #先检查是否有canal SELECT*FROM mysql.user #没有就创建 CREATE USER canal% IDENTIFIED BY canal; GRANT ALL PRIVILEGES ON *.* TO canal% IDENTIFIED BY canal; FLUSH PRIVILEGES;   Canal服务端 、下载linux版本 解压 配置文件 启动 查看日志 Java程序 、sql脚本 CREATE TABLE a_user( id BIGINT(20) NOT NULL AUTO_INCREMENT, userName VARCHAR(100) NOT NULL, PRIMARY  KEY(id) )ENGINEINNODB  AUTO_INCREMENT10 DEFAULT CHARSETutf8mb4   public class RedisCanalClientExample {public static final Integer _60SECONDS 60;public static final String REDIS_IP_ADDR 192.168.200.110;private static void redisInsert(ListColumn columns) {JSONObject jsonObject new JSONObject();for (Column column : columns) {System.out.println(column.getName() : column.getValue() update column.getUpdated());jsonObject.put(column.getName(), column.getValue());}if (columns.size() 0) {try (Jedis jedis RedisUtils.getJedis()) {jedis.set(columns.get(0).getValue(), jsonObject.toJSONString());} catch (Exception e) {e.printStackTrace();}}}private static void redisDelete(ListColumn columns) {JSONObject jsonObject new JSONObject();for (Column column : columns) {jsonObject.put(column.getName(), column.getValue());}if (columns.size() 0) {try (Jedis jedis RedisUtils.getJedis()) {jedis.del(columns.get(0).getValue());} catch (Exception e) {e.printStackTrace();}}}private static void redisUpdate(ListColumn columns) {JSONObject jsonObject new JSONObject();for (Column column : columns) {System.out.println(column.getName() : column.getValue() update column.getUpdated());jsonObject.put(column.getName(), column.getValue());}if (columns.size() 0) {try (Jedis jedis RedisUtils.getJedis()) {jedis.set(columns.get(0).getValue(), jsonObject.toJSONString());System.out.println(---------update after: jedis.get(columns.get(0).getValue()));} catch (Exception e) {e.printStackTrace();}}}public static void printEntry(ListEntry entrys) {for (Entry entry : entrys) {if (entry.getEntryType() EntryType.TRANSACTIONBEGIN || entry.getEntryType() EntryType.TRANSACTIONEND) {continue;}RowChange rowChage null;try {//获取变更的row数据rowChage RowChange.parseFrom(entry.getStoreValue());} catch (Exception e) {throw new RuntimeException(ERROR ## parser of eromanga-event has an error,data: entry.toString(), e);}//获取变动类型EventType eventType rowChage.getEventType();System.out.println(String.format(gt; binlog[%s:%s] , name[%s,%s] , eventType : %s,entry.getHeader().getLogfileName(), entry.getHeader().getLogfileOffset(),entry.getHeader().getSchemaName(), entry.getHeader().getTableName(), eventType));for (RowData rowData : rowChage.getRowDatasList()) {if (eventType EventType.INSERT) {redisInsert(rowData.getAfterColumnsList());} else if (eventType EventType.DELETE) {redisDelete(rowData.getBeforeColumnsList());} else {//EventType.UPDATEredisUpdate(rowData.getAfterColumnsList());}}}}public static void main(String[] args) {System.out.println(---------O(∩_∩)O哈哈~ initCanal() main方法-----------);//// 创建链接canal服务端CanalConnector connector CanalConnectors.newSingleConnector(new InetSocketAddress(REDIS_IP_ADDR, 11111),example,,);int batchSize 1000;//空闲空转计数器int emptyCount 0;System.out.println(---------------------canal init OK开始监听mysql变化------);try {connector.connect();//设置监控的数据库与表//connector.subscribe(.*\\..*);connector.subscribe(test1.t_user);connector.rollback();int totalEmptyCount 10 * _60SECONDS;while (emptyCount totalEmptyCount) {System.out.println(我是canal每秒一次正在监听: UUID.randomUUID().toString());Message message connector.getWithoutAck(batchSize); // 获取指定数量的数据long batchId message.getId();int size message.getEntries().size();if (batchId -1 || size 0) {emptyCount;try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}} else {//计数器重新置零emptyCount 0;printEntry(message.getEntries());}connector.ack(batchId); // 提交确认// connector.rollback(batchId); // 处理失败, 回滚数据}System.out.println(已经监听了 totalEmptyCount 秒无任何消息请重启重试......);} finally {connector.disconnect();}} }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业高端网站建设服务公司做网站建设公司起名

4 、 浏览器操作 4.1 浏览器最大化 Webdriver 打开浏览器后,默认不是最大化,如果需要界面最大化,需要通过 maximize_window()方法来实现,代码如下: maximize_window()方法是Selenium WebDriver提供的一个方法&#xf…

家电企业网站推广方案标书制作教程全过程

一、酒店 PMS()会员系统 1. 客户关系管理:帮助酒店有效地管理会员信息,包括个人资料、消费记录、偏好等,从而更好地了解会员需求,提供个性化的服务和优惠。 2. 会员忠诚度提升:通过积分、折扣、…

免费网站推广产品wordpress无法访问首页

欧几里得算法 只需要记住一个公式(不需要推导,这就是数论的基础知识): step1: 判断小括号内右边的数字 b 是否为0,如果为0,输出小括号左边的数字 a ,就是一开始要求的两个数的最大…

民治做网站公司discuz网站建设

起因 七月份要去某厂报道了,异地租房的时候发现想租一个有公司班车的地方,却不知道哪里有班车。辗转流传出班车手册后发现搜索实在是太不方便了,于是有了一个主义,想做一个可以搜索房子地址,找出附近班车点&#xff08…

网站运营建设的培训班wordpress flash 插件

视频1:https://live.csdn.net/v/182207 视频2:https://live.csdn.net/v/182208 视频3:https://live.csdn.net/v/182209

茶的网站制作网站建设360

numpy中表示向量和矩阵乘法的有四种"*"、outer、dot、multiply。1、关于 "*" 的用法"*" 也为对于元素的乘积,但是 "*" 作为乘法运算时,必须满足 numpy 的 broadcasting(广播) 的原则 ,当两个矩阵相乘…

asp网站代码 部分封装一个网站需要几个人做

1. 引言 在Spring框架中,类加载机制是一个至关重要的环节,关系到Spring容器如何动态地加载、解析和管理应用程序中的类。其中,“准备”阶段作为类加载过程中的一个关键步骤,对于理解整个类加载机制具有重要意义。本文将对Spring类…

素材模板网站网络销售公司经营范围

文章目录 前言Chat2DB介绍Chat2DB地址下载安装 Chat2DB配置Chat2DB使用1、自然语言转sql2. SQL解释3. SQL优化4. SQL转换 写在最后 前言 随着人工智能的发展,各行各业都出现了不少基于AI的工具来提升工作效率。就连国内的各个大厂也都在基于大模型开发自己的产品线…

整站优化多少钱python做网站的 框架

Virtualenv(虚拟环境) VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响.这样有很多优点,宝宝们要记住哦,比如: 在没有权限的情况下安装新套件 不同应用可以使用不同的套件版本 套件升级不影响其他应用 …

做婚恋网站wordpress悬浮登录插件

目录 前文 回望页表 一,什么是线程 二,使用 pthread_create (线程创建) 三,线程控制 1 ,线程共享进程数据,但也拥有自己的一部分数据: 2, 线程 VS 进程优点 3,…

论述网站建设整个流程建设网站有哪些参考文献

初心伟大的艺术品不必追随潮流,他本身就能引领潮流。课前准备软件安装【2019(上)】《三维建模与动画设计》【2019年下学期】第一节:选修介绍及选修人数确定【2019年下学期】第二节:2D&3D设计之百事可乐图标设计【2019年下学期】第三四节&…

以网站建设为开题报告网站电话转化率

教程链接 https://www.youtube.com/watch?vCYiHNbAIp4s 前提 虚幻引擎5.1之后,项目设置里的input选项,默认会有一条警告,告知旧的input系统已经不能用了。 做法 在content文件夹下新建一个input按钮 input文件夹里面分成两部分内容 1.…

dede 网站名称 空的免费销售网站模板

长按弹出修改后:charles如果不配置SSL通用证书;会导致HPPTS协议的域名抓取失败/乱码的现象;现在SSL越来越多,很多博客都上了SSL,支付相关的行业更是基础配置;charles配置SSL证书,算起来很简单&a…

宠物网站 html模板网站开发及后期维护

2024中国(杭州)国际数字物流技术与应用展览会 2024年7月8-10日 | 杭州国际博览中心 同期举办:2024长三角快递物流供应链与技术装备展览会 数字贸易创新引领合作动能 《十四五规划》明确指出关于“加快数字化发展,建设数字中国…

猪八戒网做网站被骗网站开发建设用的软件

在Spring Boot Mybatis 中,使用Repository失效 在springboot 中,给mapper的接口上加上Repository,无法生成相应的bean,从而无法Autowired,这是因为spring扫描注解时,自动过滤掉了接口和抽象类,这种情况下可…

家居企业网站建设资讯做 ps pr 赚钱的 网站

文章目录 前言一、线程同步二、互斥量 mutex三、死锁总结 前言 一、线程同步 在多线程环境下,多个线程可以并发地执行,访问共享资源(如内存变量、文件、网络连接 等)。 这可能导致 数据不一致性, 死锁, 竞争条件等 问题。 为了解…

做外贸公司 网站wordpress模板定做

镜像官网 操作系统基础镜像 busybox Alpine CentOS Ubuntu Debian 编程语言基础镜像 Java基础镜像 Python基础镜像 NodeJs基础镜像 应用基础镜像 Nginx基础镜像 Tomcat基础镜像 Jetty基础镜像 其它基础镜像例子 Maven基础镜像 Jenkins基础镜像 GitLab基础镜像 如何选择Docker基…

汽车网站建设公司哪家好百度网站建设公司

全世界只有3.14 % 的人关注了爆炸吧知识来看越南学生拍摄的一组图,主题是老师和文具“撞衫”!老师你和我的胶水撞了!老师你和我的笔袋撞了!老师你和我的手机壳撞了!这个铅笔和老师好像啊书皮和老师很像老师今天穿得像面…

资源库建设网站微信平台制作网站开发

【JavaEE】进阶 个人博客系统(4) 文章目录 【JavaEE】进阶 个人博客系统(4)1. 增加博文1.1 预期效果1.1 约定前后端交互接口1.2 后端代码1.3 前端代码1.4 测试 2. 我的博客列表页2.1 期待效果2.2 显示用户信息以及博客信息2.2.1…

旅游网站建设案例分析北京个人制作网站有哪些

本文深入研究Vuex,一个Vue.js状态管理库。我们将介绍创建它是为了解决的问题、其背后的核心概念、如何设置它,当然,还将在每一步中使用代码示例。 Vuex是一个由Vue团队构建的状态管理库,用于管理Vue.js应用程序中的数据。它提供了一种集中管理跨应用程序使用的数据的方式,…