分布式环境如何更新本地缓存

news/2024/9/19 16:18:57/文章来源:https://www.cnblogs.com/leecoder5/p/18420840

引言

本地缓存是一种常用的缓存手段,在客户端会经常使用这种手段来提升效率,但服务端在分布式环境下它出现的频率并不高,原因是本地缓存无法做到多台服务器数据共享,因此我们会采用redis这种分布式缓存,然而在某些情况下我们还是要使用的话怎么办呢?网上基本查不到有人去做这种分布式环境使用本地缓存,又要实时更新的方法,我这边项目中就需要这样。

项目背景

我这边有个评论检测的项目,其中有个敏感词检测的功能,这个功能需要一次性拿出所有敏感词,对输入的评论进行检测,敏感词有几万个,因此如果把敏感词放到redis,每次都取出所有的敏感词显然不太合适,因为我考虑放到本地缓存,但同时我们敏感词是需要实时更新的,后台设置以后要立马生效,所以我就弄了一套分布式环境更新本地缓存的方法。

功能实现

一. 第一个考虑的问题,我们要怎么让本地缓存知道敏感词更新了呢,肯定是通知,如何通知?

  • 我第一反应是消息推送,通过MQ这些消息队列来推送,RabbitMq有一种工作模式叫做fanout广播模式,它可以把消息分发给所有bind到此exchange的queue,但是这个依赖rabbitmq,如果公司没装就无法实现。
  • 后来我想到可以通过调用接口来通知消息(首先说明一下,我这个更新敏感词的操作是在后台管理,代码和评论检测的代码不是在一起的,是两套系统),通过接口调用的方式来更新本地缓存,问题就在于,调用接口是一次性的,nginx只会转发到一个节点上,所以现在要做的就是怎么调用所有节点的通知接口。我这边想到了微服务的注册机制,springcloud中每一个微服务都是由注册中心管理,我也可以做一个注册中心,把所有节点的IP注册进去,然后通过IP+端口来调用接口

所以最后的做法就是弄一个注册中心,我选择了redis作为注册中心,简单粗暴,效率又高。具体做法就是:

  • 应用启动时把IP注册到redis
    @PostConstructpublic void addIpToRedis() {String key = XHStringUtil.generateRedisKey(XHConstant.IP);String ip = IPUtil.getLocalIpByNetcard();redisTemplate.opsForSet().add(key, ip);}
  • 应用关闭时把IP从redis剔除
    @PreDestroypublic void removeIpFromRedis() {String key = XHStringUtil.generateRedisKey(XHConstant.IP);String ip = IPUtil.getLocalIpByNetcard();redisTemplate.opsForSet().remove(key, ip);}

当然只是这样还是不够,因为万一机房断电,进程被人误杀,这种都可能导致这个注册中心的数据不正确,不及时,所以还需要给注册中心加一个心跳检测:

  • 可以做个简单的维护注册中心的功能,就是每隔5分钟把本地的IP加入注册中心,而在调用方,只要调用节点接口失败,就把节点的IP从注册中心剔除
  • 也可以做个复杂点的心跳检测,就是专门写一个用于心跳的接口,每隔几秒调用一次,只要失败达到累计次数就剔除IP

至此,分布式环境更新本地缓存就已经实现了,简单又实用.其实还有一种比较麻烦的更新本地缓存方法,就是监控binlog,但是由于比较复杂,而且只能局限于mysql,就不展开了


最近我把这个升级了一下,大体情况就是做了个sdk,使用的时候只需要接入sdk,使用几个注解即可完成本地缓存的更新,更新方式可以选择Redis、Kafka、RabbitMQ或者上面的接口方式。

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

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

相关文章

易优eyoucms网站二次验证密码忘记解决办法

当你忘记了易优CMS(EyouCMS)后台的二次验证密码时,可以通过修改数据库中的相关设置来绕过或重置这个验证。根据提供的记录信息,可以按照以下步骤来进行操作: 步骤登录数据库 修改相关设置 清除缓存详细步骤 1. 登录数据库 首先,你需要登录到你的MySQL数据库。你可以使用命…

mysql事务隔离级别和spring事务传播机制

一、事务并发会出现的三个问题 数据库事务具有ACID4个特性: A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行; C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100; I:Isolation…

电商系统的简单设计

订单模块 作为电商系统,首入眼帘的就是订单模块,也是电商基础的模块之一。订单流程包含了订单从下单到完成的整个流程,订单的状态如下:这里迎来了第一个问题,可以看到订单状态有非常多种,如果用if else去做判断,逻辑会非常多,这时候就需要用到状态机模式了,状态机如何使…

限流器的实践

背景 我们有一个业务场景是给学生发布考试,发布的过程不复杂,就是一个老师传递一些考试相关的参数过来,服务器自动给所有学生生成一份任务,但是在学生上交的时候会有个问题,就是成百上千的学生一起上交,会有并发流量的问题。 这里由于我们的考试可能会设计多个班级的联考…

易优cms 数据库连接失败,如何重新进行正确配置

当你遇到易优CMS(EyouCMS)数据库连接失败的问题时,可以按照以下步骤进行正确的配置和故障排除。 1. 检查数据库配置文件 易优CMS的数据库配置文件位于 application/database.php。你需要检查并修改该文件中的数据库配置信息。 2. 核对数据库账号和密码 确保数据库账号和密码…

在Windows10中使用rust的diesel库

介绍 最近在学习Actix Web时,需要用到数据库操作,简单尝试了一下diesel,也遇到了一些问题。在这里记录一下,供大家参考。 1.安装 根据Diesel官网介绍,使用cargo binstall安装diesel cli。 cargo binstall diesel_cli如果报错 error: no such command: `binstall` 需要先安…

易优eyoucms网站无法安装,数据库文件版本号(无)与CMS源码版本号(v1.3.1)不一致,点击查看!

解决方法比较简单, 可以找历史版本, 使用同版本数据库或者源码进行安装, 安装完成后操作升级。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处…

易优eyoucms网站添加自定义新建字段的时候报错

根据提供的错误信息 SQLSTATE[42000]: Syntax error or access violation: 1118 Row size too large. The maximum row size for the used table type not counting BLOBs is 65535. You have to change some columns to TEXT or BLOBs,这个错误表明数据库表的行大小超过了 My…

易优eyoucms网站下载的系统导入就数据库出问题了,如何升级数据库?

数据库版本需要一样 数据库有新建模型的 需要打补丁包再导入扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理、二次开发、PSD转HTML、网站被黑、…

易优eyoucms网站登录报错:Array and string offset access syntax with curly braces is deprecated

根据提供的错误信息 Array and string offset access syntax with curly braces is deprecated,这个错误提示表明当前使用的 PHP 版本不支持使用大括号 {} 来访问数组和字符串偏移量。这种语法在 PHP 7.4 之后被标记为已弃用。 以下是一些可能的解决步骤: 1. 切换 PHP 版本 尝…

易优eyoucms网站报错,\\core\\library\\think\\db\\Connection.php

报错 \\\\core\\\\library\\\\think\\\\db\\\\Connection.php 第 380 行左右 数据表或视图不存在,请联系技术处理。[错误代码] SQLSTATE[42S02]: Base table or view not found: 1146 Table eyoucms.ey_channeltype doesnt exist 根据提供的错误信息 SQLSTATE[42S02]: Base ta…

高等数学 3.3 泰勒公式

泰勒(Taylor)中值定理1 如果函数 \(f(x)\) 在 \(x_0\) 处具有 \(n\) 阶导数,那么存在 \(x_0\) 的一个邻域,对于该领域内的任一 \(x\) ,有 \[f(x) = f(x_0) + f^{}(x_0)(x - x_0) + \cfrac{f^{}(x_0)}{2!}(x - x_0)^2 + \cdots + \cfrac{f^{(n)}(x_0)}{n!}(x - x_0)^n + R_…