Ehcache 集群改造-----增加手动发现方式自动增加减机器机制

spring使用ehcache实现页面缓存示例 主要介绍了spring使用ehcache实现页面缓存示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

上一篇文章说了ehcache基于RMI手动发现集群的搭建 https://blog.youkuaiyun.com/java_ying/article/details/103071571
但是手动发现有很多限制,比如不能动态增加机器,使用中有很多不方便
所以就根据ehcache的机制 加了一个轮询功能 类似心跳机制 去检查当前生效的链接

放代码前,先说一下思路:
ehcache 手动发现机制,在项目启动时 会读取xml配置文件的值,然后放到一个map里面。如下
在这里插入图片描述
操作是这个类操作的
在这里插入图片描述
就是简单的map操作而已
map里面 的键就是url 类似 //127.0.0.1:40009/articleCache 这样,值是一个date 我们暂时不用关心

RMICacheManagerPeerProvider 这个类提供了两个方法,分别是注册和反注册

/**
     * Register a new peer
     *
     * @param rmiUrl
     */
    public abstract void registerPeer(String rmiUrl);

    /**
     * Unregisters a peer
     *
     * @param rmiUrl
     */
    public final synchronized void unregisterPeer(String rmiUrl) {
        peerUrls.remove(rmiUrl);
    }

我们就可以利用这两个方法来操作它
上文提到过 每次同步内容的时候 他都会遍历这个map 然后如果发送消息不成功会很浪费时间
我们就做一个监测功能,当我们配置文件的值不生效的时候 就unregisterPeer,如果生效了就registerPeer

这个provider 可以从CacheManager中拿到。放代码

package com.hqjl.communityserv.thread;

import com.hqjl.communityserv.bean.vo.SocketParam;
import com.hqjl.communityserv.cache.EhcacheManager;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.distribution.CacheManagerPeerProvider;
import net.sf.ehcache.distribution.RMICacheManagerPeerProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import java.net.Socket;
import java.util.*;

/**
 * @author chunying
 * @Date: 2019/11/14 0014
 */
@Configuration
@PropertySource(value= {"classpath:eh.properties"}, encoding = "utf-8")
public class RMIUrlsThread{

    @Value("${rmiurls}")
    private String rmiurls;

    private static final Map<Integer, String> urls = new HashMap<>();
    private static final Map<Integer, SocketParam> paramMap = new HashMap<>();
    private static final String RMI_URLS = "rmiUrls";
    private static Boolean flag = false;

    public void loadProps() {
        int key = 0;
        String[] split = rmiurls.split("\\|");
        //这里面根据url 取出IP 和port用于测试连接是否可用
        for (String s : split) {
            urls.put(key, s);
            String substring = s.substring(2);
            String[] splitS1 = substring.split("\\:");
            String IP = splitS1[0];
            String s2 = splitS1[1];
            String[] s2Split = s2.split("\\/");
            String port = s2Split[0];
            SocketParam socketParam = new SocketParam(IP, Integer.parseInt(port));
            paramMap.put(key, socketParam);
            key++;
        }

    }

    public void thread() {
        new Thread(){
            @Override
           public void run() {
               loadProps();
               //这里面获取CacheManager 很简单 我没有放这个类。 不会的话看我前一篇文章
               CacheManager cacheManager = EhcacheManager.getCacheManager();
               Map<String, CacheManagerPeerProvider> cacheManagerPeerProviders = cacheManager.getCacheManagerPeerProviders();
               cacheManagerPeerProviders.forEach((k,v)-> {
                   RMICacheManagerPeerProvider provider = (RMICacheManagerPeerProvider)v;
                   while(true) {
                       urls.forEach((key, url)-> {
                           SocketParam socketParam = paramMap.get(key);
                           Socket socket = null;
                           String IP = socketParam.getIp();
                           Integer port = socketParam.getPort();
                           try {
                               //测试连接是否可用
                               socket = new Socket(IP, port);
                               socket.close();
                               provider.registerPeer(url);
                           }catch(Exception e) {
                               provider.unregisterPeer(url);
                           }
                       });
                       System.out.println("执行一次");
                       try {
                           Thread.sleep(10000);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                   }

               });
           }
        }.start();

    }

    public static void main(String[] args) {

    }
}


package com.hqjl.communityserv.bean.vo;

/**
 * @author chunying
 * @Date: 2019/11/15 0015
 */
public class SocketParam {

    private String ip;
    private Integer port;

    public SocketParam(){}

    public SocketParam(String ip, Integer port) {
        this.ip = ip;
        this.port = port;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }
}

eh.properties中的值就是我copy了一份 xml中rmiurl的值 比较懒 不想解析xml。。。
这个方法会在项目启动完成后立刻执行,首先把properties中值读出来,放进我们准备好的map,
然后还有一个map 是初次加载时 解析出地址中的IP 和 port ,因为String 的相关操作还是有点耗时的,最好一次操作,一直使用。两个map的key是相同的 用的时候用key做关联。

thread方法,新建了一个不死的线程,里面先通过EhcacheManager 取出 RMICacheManagerPeerProvider
while(true) 保证一直运行,测试连接是否可用 使用java.net的socket 如果通了 说明 连接的机器在运行,那么就注册
如果没通,说明挂了或者没启动,直接反注册。 切记 记得close();
Sleep()方法 是心跳间隔时间,自由发挥即可。

好了 这是一个不完整的博客,这样操作虽然可以实现想要的功能,但是会有一个问题:
我们看这个Map 注意是个SynchronizedMap 这个东西是带操作锁的,一个只有一个线程可以操作他,如果在遍历时有更新操作,那么他会报错的。所以要处理这个问题,还要继续跟踪ehcache的同步机制,是怎么处理异常的。
后续会继续更新~

------------------------------------------------------------------分割线-------------------------------------------------------------------------------------
后续:准备把ehcache源码搞下来,把遍历过程和读写过程加读写锁。最近莫得时间,有时间更改后上代码

SpringBoot手动使用EhCache的方法示例 本篇文章主要介绍了SpringBoot手动使用EhCache的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 立即下载

相关推荐

Ehcache分布式缓存与其在spring中的使用

主要讲解下encache的原理、分布式缓存集群环境配置、与在spring中的使用

libata分析

[cpp] view plaincopy 进来分析libata模块,颇有所感,记录如下,希望能对大家有所帮助,同时也对自己的理解进一步深入。  linux版本:linux-2.6.24.3  注:因完全是个人理解,理解不当难免,恳请批评指正!!!!    大家知道驱动程序在初始化sata controller后, 并初始化ata_host结构体后,会调用函数ata_host_acti

wangyunqian6的专栏 1917

GBASE南大通用GBase 8s数据库-从零开始的手动安装与实例配置指南

本文详细介绍了GBASE南大通用GBase 8s数据库的手动安装与实例配置全过程,包括环境准备、用户创建、安装包准备、实例创建、环境变量配置等关键步骤。通过实战经验分享和常见问题解决方案,帮助用户快速掌握GBase 8s数据库的安装与配置技巧,确保数据库稳定运行。

weixin_29209825的博客 454

ehchache验证缓存过期的api_HTTP 缓存机制

缓存分为两种:强缓存和协商缓存1.强缓存:不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的Network选项中可以看到该请求返回200的状态码,并且size显示from disk cache或from memory cache两种(灰色表示缓存)。可以看到加载时间都是几毫秒。2.协商缓存:向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中...

weixin_39959482的博客 265

CH592F RISC-V蓝牙LED灯设计:WS2812B驱动与微信小程序控制

蓝牙低功耗(BLE)是嵌入式物联网设备主流无线通信技术,其核心在于协议栈轻量化、射频稳定性与外设协同调度。基于RISC-V内核的蓝牙SoC(如CH592F)凭借高集成度、低待机电流和免外部巴伦的射频设计,显著降低硬件复杂度与BOM成本;而WS2812B作为单线级联RGB LED,依赖微秒级精准时序,需借助定时器+DMA机制规避CPU干预,保障动态效果流畅性。该方案融合电容触摸交互、GATT服务自定义与微信小程序标准Bluetooth API对接,适用于智能照明、DIY彩灯及教学实践等场景,是BLE+LED实

weixin_31163455的博客 433

EEG信号分析实战:从时域到频域,手把手教你用Python处理脑电数据

本文详细介绍了使用Python进行EEG信号分析的实战方法,涵盖时域分析、频域分析和时频分析三大核心技术。通过MNE-Python等工具,读者将学习如何从原始脑电数据中提取事件相关电位(ERP),解码脑波节律特征,并运用时频分析追踪动态神经活动。教程包含完整的代码示例和认知科学解释,适合神经科学研究者快速掌握EEG分析全流程。

pink的博客 1006

MyBatis

详细记录了MyBatis获取参数值和动态SQL中标签的使用,在工作中批量操作非常实用。特殊SQL在MyBatis中的写法也有涉及,对于批量删除,批量添加具有借鉴意义。

m0_56709616的博客 383

达梦7实时主备集群

达梦7实时主备配置实时主备数据环境说明配置主库配置 dm.ini配置dmmal.ini配置dmarch.ini配置dmwatcher.ini配置dmwatcher.ini以mount方式启动主库设置OGUID修改数据库为primary模式配置备库 在服务器部署过程中,通常搭建有数据库主备集群,用于防备数据库服务器产生问题影响数据正常,在此,我们分享一下在虚拟机环境中模拟搭建实时主备的数据守护模式。 在搭建环境之前,需用户确认主备DM7的数据库已安装完成,且版本一致,同时还应注意各实例所在主机的操作系统位数、

g360382的博客 1022

Servlet基本知识

前提: 这只是我个人的笔记,为了让自己印象深一点,没有太多的详细讲解,只是为了以后让自己有一个记忆点!!! 一、什么是servlert Servlet(Server Applet),称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。 狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,理解为后者。Servlet运行于支持Java的应用服

HQJLforever的博客 310

扩视机器视觉—Halcon机器视觉48个实战项目六(检测定位角度)

此项目halcon检测检测定位角度问题,并显示。

qq_21516871的博客 1093

从标记基因到功能分析:手把手教你人工注释单细胞亚群的完整流程

本文详细介绍了人工注释单细胞亚群的完整流程,从标记基因筛选到功能分析验证,特别针对肿瘤微环境、发育轨迹等复杂场景提供解决方案。通过差异表达分析、多维数据整合和实验验证,帮助研究者准确识别细胞类型,提升单细胞转录组研究的生物学解读深度。

jenkins8butler的博客 244

Java IO流

个人笔记 一、什么是IO流? 也就是In和Out输入和输出,也就是程序和外部设备之间的数据传递(文件、管道、网络连接) 流(Stream)是指一连串的数据(字节或者字符)通过先进先出的方式发送信息的通道(而数据又可以是文件、内存、网络连接); 二、IO流的分类 按数据流的方向:输入流、输出流 按处理数据单位:字节流、字符流 按功能:节点流、处理流 三、字节流 public class 字节复制 { public static voi...

HQJLforever的博客 143

Microsemi Libero系列教程(全网首发)

关于Libero IDE和Libero SoC Libero分为Libero IDE和Libero SoC,Libero IDE最新版本是v9.2 SP3(2016年4月4日)已经不再更新维护了,而Libero SoC是Libero IDE的升级版,官方推荐的开发工具,文中的Libero指的是Libero SoC。 Libero SoC Libero® SoC是Microsemi(美高森美)官方...

whik1194的博客 2万+

使用rmi实现ehcache集群模式

RMi集群模式 你如何知道集群环境中的其他缓存? • 分布式传送的消息是什么形式? • 什么情况需要进行复制?增加(Puts),更新(Updates)或是失效(Expiries)? • 采用什么方式进行复制?同步还是异步方式? 1、正确的元素类型:只有可序列化的元素可以进行复制。一些操作,比如移除,只需要元素的键值而不用整个元素;在这样的操作中即使元素不是可序列化的但键值是可序列化...

Leon_Jinhai_Sun的博客 364

PC 端微信页面拆分及 JavaFx 使用

一、前言 对于一个知识点的学习过程来说,往往使用自己熟悉的工具或方式才更易于上手。因为所有同类型的知识点在抛出复杂的流程拨云见日后,所能得到的几乎都是同样的设计思想和实现理论。 在 Java 语言桌面版开发中,直至目前共提供了三套 UI 开发方式;Awt、Swing、JavaFx,以及一些扩展组件 SWT 等。在这三套 UI 组件中,JavaFx 是最新也是最为好用的,因为他提供了丰富的功能,以及...

bugstack虫洞栈 3606

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Ehcache 服务器分布式/集群缓存同步方案

Ehcache提供多种缓存解决方案,其中RMI是最简单也是最常用的一种,分为自动成员发现及手动成员发现2种配置方式: 自动成员发现 配置广播地址 自动的发现方式用TCP广播机制来确定和维持一个广播组。它只需要一个简单的配置可以自动的在组中添加和移除成员。在集群中也不需要什么优化服务器的知识,这是默认推荐的。不同服务器自动成员发现的配置是一样的,其中配置如下 <cacheManagerPeer...

梦里蓝天 3288

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

缓存-ehcache 集群缓存的同步

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34248023的博客 201

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java基础面试题总结《八》

确认进程 -> 抓取现场 (Processlist) -> 分析计划 (Explain) -> 优化/限流。大多数情况下,通过优化索引和 SQL 语句即可解决问题;若是业务量激增,则需从架构层面考虑读写分离或扩容。这个问题考察的是对 Redis 基础定位的宏观认知。回答时不仅要说出它是什么,还要解释它为什么强,以及能干什么。对于绝大多数互联网业务,“先更新数据库,再删除缓存” + “基于消息队列/Binlog 的重试机制”是保证最终一致性的最佳实践。它既保证了高性能,又能容忍极小概率的短暂不一致。

qq_55862497的博客 334

【RocketMQ合集-02】RocketMQ客户端编程模型学习笔记

RocketMQ客户端编程模型学习

记录日常技术学习,分享后端学习笔记 1157

Redis 知识体系(文档型 NoSQL)

本文深入解析Redis八大基础数据结构及其底层编码实现,涵盖String、List、Set、ZSet、Hash、Geo、Bitmap、HyperLogLog和Stream等核心结构。通过源码级分析,揭示了SDS、Ziplist、Dict等底层组件的设计原理,并详细探讨了Redis的高性能IO模型、持久化机制(RDB/AOF/混合模式)、内存管理策略及高可用架构(主从/哨兵/Cluster)。 重点剖析了Redis在工程实践中的典型问题与优化方案,包括缓存穿透/击穿/雪崩的解决方案、分布式锁的完整实现(含Re

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 792

本地缓存实战:从Caffeine原理到多级缓存架构设计

缓存是提升系统性能的核心技术之一,其原理是在快速存储介质中暂存高频访问数据,以减少对慢速数据源的直接访问。从本地内存缓存到分布式缓存,不同层级的缓存技术共同构成了现代高并发系统的基石。本地缓存作为最贴近应用的一层,以其纳秒级访问速度和零网络开销,在应对热点数据、保障系统高可用性方面展现出独特的技术价值。它尤其适用于电商实时查询、金融风控等对延迟极度敏感的应用场景。然而,本地缓存也带来了数据一致性、内存管理等挑战。本文以Caffeine这一高性能本地缓存库为例,深入探讨其核心原理与最佳实践,并解析如何通过多级

weixin_30627341的博客 416

goalng开发_开发篇

Go 面试,基础知识

qq_46640341的博客 1159

淘宝架构演进:从单体到千万级并发的实战演进与核心设计思想

在互联网技术领域,高并发系统架构是支撑业务增长的核心基石。其基本原理是通过分布式、服务化与异步化等技术手段,将单一应用拆解为可独立伸缩的组件,以应对流量压力。这一过程的技术价值在于,它能在保障系统稳定性的前提下,实现资源的弹性利用与开发效率的提升。典型的应用场景包括电商大促、社交热点及金融交易等瞬时高流量业务。以淘宝的架构演进为例,其通过服务化拆分、分布式中间件(如HSF、TDDL)及多级缓存体系,成功应对了从单体应用到千万级并发的挑战。其中,分库分表解决了数据库瓶颈,而消息队列(如RocketMQ)则实现

weixin_30455023的博客 313

Java高并发系统 + 安全监控 完整知识体系

本文系统梳理了Java高并发开发的全方位知识体系,涵盖单机并发基础、分布式架构、系统安全、监控体系和故障治理等核心模块。主要内容包括: 单机并发基础 CPU多级缓存与内存模型 JMM内存模型与happens-before原则 锁机制与CAS原子操作 并发容器与线程池原理 JVM调优与性能优化 分布式高并发架构 分布式锁与一致性算法 缓存体系与典型问题解决方案 消息队列的削峰填谷 负载均衡与分库分表 微服务通信与流量控制 生产级解决方案 高并发业务安全防护 全链路监控体系搭建 典型故障排查与治理 应急预案与性

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 574

Spring Security- 接口访问频率限制的实现

Spring Security 接口访问频率限制实现指南 本文介绍如何在Spring Security中实现接口访问频率限制功能,保护系统免受暴力破解和恶意请求攻击。 核心实现方案 基于Redis的滑动窗口算法:使用Redis存储请求计数和时间戳,保证分布式环境下的一致性 自定义过滤器:通过OncePerRequestFilter拦截请求并执行限流检查 灵活配置:支持按用户/IP/接口等多维度配置限流规则 主要技术组件 Spring Security过滤器链 Redis原子操作(INCR+EXPIRE) 自

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

Linux

多线程、shell语句、网络编程、mysql数据库、git远程仓库以及redis数据库与缓存的总结性学习

2601_94965056的博客 575
上一篇: Ehcache 基本使用 以及 基于RMI集群搭建
下一篇: 微信公众平台unionID简介以及小程序获取unionID机制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值