首页 > 其他分享 >分布式环境如何更新本地缓存

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

时间:2024-09-19 16:13:02浏览次数:12  
标签:缓存 本地 IP 更新 注册 分布式

引言

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

项目背景

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

功能实现

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

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

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

  • 应用启动时把IP注册到redis
    @PostConstruct
    public void addIpToRedis() {
        String key = XHStringUtil.generateRedisKey(XHConstant.IP);
        String ip = IPUtil.getLocalIpByNetcard();
        redisTemplate.opsForSet().add(key, ip);
    }

  • 应用关闭时把IP从redis剔除
    @PreDestroy
    public 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或者上面的接口方式。

标签:缓存,本地,IP,更新,注册,分布式
From: https://www.cnblogs.com/leecoder5/p/18420840

相关文章

  • PicGo+GitHub解决博客本地图片上传问题
    PicGo+GitHub解决博客本地图片上传问题在Github上创建仓库(公开)获去取gihubtoken右上角头像->Settings->Developersettings->Personalaccesstokens->Tokens(classic)下载PicGoPicGo下载链接https://molunerfinn.com/PicGo/配置PicGo下载后......
  • 分布式消息服务Kafka版的详细解析和配置方式
    分布式消息服务Kafka版是一款基于开源社区版Kafka提供的消息队列服务,它向用户提供计算、存储和带宽资源独占式的Kafka专享实例。以下是对分布式消息服务Kafka版的详细解析和配置方式的介绍。一、分布式消息服务Kafka版解析1.Kafka概述Kafka是一个开源的分布式消息系统,由Apa......
  • 深度学习-16-深入理解BERT基于本地数据微调训练文本分类模型的流程
    文章目录1加载库和设置通用参数1.1DistilBert1.2模型库1.3微调任务2准备数据2.1加载数据2.2切分数据2.3数据分词2.4制作数据集3使用TrainerAPI微调transformer3.1加载预训练模型3.2定义训练器3.3执行训练3.4评估性能3.5保存模......
  • 易优eyoucms网站本地测试正常,放到虚拟主机出错
    遇到在本地测试正常但在虚拟主机上安装时出现问题的情况,通常与环境配置有关。根据您提供的错误信息,问题可能在于文件路径或环境配置不一致。以下是详细的解决步骤:解决步骤检查文件路径调整PHP版本检查文件权限检查虚拟主机配置1.检查文件路径确保文件路径正确无误。2.......
  • 云上分布式SQL Server,你值得拥有
    云上分布式SQLServer,你值得拥有 介绍MicrosoftSQLAzure是微软的云关系型数据库,后端存储又称为云SQLServer(CloudSQLServer)。它构建在SQLServer之上,通过分布式技术提升传统关系型数据库的可扩展性和容错能力。数据模型(1)逻辑模型云SQLServer将数据划分为多个分区......
  • LeetCode_0146. LRU缓存
    题目描述请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intval......
  • SQL Server Service Broker:如何在企业应用中实现高效的异步消息处理|分布式系统中的异
    随着企业应用系统的复杂性不断增加,如何在大规模数据交互中保持高效、稳定的系统性能成为了开发人员的关键挑战。SQLServer的ServiceBroker是一个帮助开发者实现异步消息传递的功能模块,能够有效地处理高并发的数据库操作和事务。通过使用ServiceBroker,企业系统能够在不影响主......
  • 开源多场景问答社区论坛Apache Answer本地部署并发布至公网使用
    ......
  • 分布式光伏发电站数据采集设备管理硬件解决方案
     随着全球能源结构的转型和可再生能源的快速发展,光伏发电作为重要的清洁能源之一,在能源市场中占据了越来越重要的位置。AcrelCoud-1200分布式光伏运维云平台通过监测光伏站点的逆变器设备,气象设备以及摄像头设备,帮助用户管理分散在各地的光伏站点、主要功能包括:站点监测,逆变......
  • 分布式光伏发电系统如何确保电能质量达到并网要求?
    随着全球对可再生能源的日益重视,光伏发电已成为推动能源转型的重要力量。特别是在应对气候变化、提升能源安全方面,光伏发电的潜力被广泛认同。然而,光伏电站的运营与维护面临许多挑战,如发电效率监测、故障诊断和数据管理等。因此,研发光伏监控系统显得尤为重要。光伏发电系统光......