Java使用Redis分布式锁实现负载均衡

Java使用Redis分布式锁实现负载均衡的一种常见方式是利用Redisson来进行协调和管理。具体步骤如下:

1)  在Redis中创建一个有序集合,作为服务注册中心。

2)  每个服务在启动时向该有序集合添加一个成员,并将自己的IP地址和端口号等信息保存到该成员上面去。

3)  客户端在请求服务前先获取全局互斥访问权(即分布式锁),然后从注册中心随机选择一个可用的服务器并发起请求。

4)  服务器处理完请求之后返回结果给客户端,并释放全局互斥访问权以便其他客户端能够继续使用它所对应的服务器。

5)  当某个服务器出现故障或者网络异常时,其对应的成员会被删除,此时需要重新选取另外一个可用的服务器来处理相同请求。

以下是一个简单示例代码演示如何使用Java结合Redisson实现基本的负载均衡功能:

public class LoadBalancer {
    private static final String REDIS_SERVER = "redis://localhost:6379";
    private static final String SERVICE_NAME = "my_service";

    // Redisson客户端
    private RedissonClient redisson;

    // 初始化方法,在系统启动时执行
    public void init() throws Exception {
        Config config = new Config();
        config.useSingleServer().setAddress(REDIS_SERVER);
        redisson = Redisson.create(config);

        System.out.println("LoadBalancer initialized.");
     }

     // 处理GET请求
     @GetMapping("/api")
     public String api(){
         RLock lock=redisson.getLock(SERVICE_NAME);

         try{
             if(lock.tryLock()){
                 List<String> members=redisson.getScoredSortedSet(
                     SERVICE_NAME,LongCodec.INSTANCE).readAll();

                 if(members.isEmpty()){
                     throw new RuntimeException("没有可用服务!");
                     
                 }else{
                    int index=(int)(Math.random()*members.size());
                    String selectedMember=members.get(index);
                    
                    return doApiLogic(selectedMember); 
                  }
                  
              }else{ 
                throw new RuntimeException("无法获得全局互斥访问权!");
              }
              
          }catch(Exception ex){
               throw new RuntimeException(ex.getMessage(),ex);
               
          }finally{
              lock.unlock();   释放全局互斥访问权.
           }
       }

      // 执行API相关业务逻辑
      private String doApiLogic(String serverInfo){
          Connection conn=null;
          PreparedStatement stmt=null;
          ResultSet rs=null;
          
          try{    
              conn=getConnectionFromPool(serverInfo);   根据传入参数连接指定数据库  
              
              stmt=conn.prepareStatement(
                  "SELECT * FROM my_table WHERE status='active'");
                  
              rs=stmt.executeQuery();

              
              StringBuilder sb=new StringBuilder();
              
              while(rs.next()){
                  sb.append(rs.getString(2)).append("\n");   
                   将查询结果转换为字符串格式并添加到输出缓冲区里面去。
               }
               
               return sb.();

           }catch(SQLException ex){
               throw new RuntimeException(ex.getMessage(),ex);
           }finally{
               closeResultSet(rs); 关闭结果集对象  
               closeStatement(stmt); 关闭语句对象  
               releaseConnection(conn); 归还conn对象给连接池 
           }
       }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nordic 52832作为HID 键盘连接配对电视/投影后控制没反应问题的分析和解决

问题现象&#xff1a;我们的一款HID键盘硬件一直都工作的很好&#xff0c;连接配对后使用起来和原装键盘效果差不多&#xff0c;但是后面陆续有用户反馈家里的电视等蓝牙设备配对连接我们的键盘后&#xff0c;虽然显示已连接&#xff0c;但实际上控制不了。设备涉及到了好些品牌…

【操作与配置】VSCode配置Python及Jupyter

Python环境配置 可以参见&#xff1a;【操作与配置】Python&#xff1a;CondaPycharm_pycharmconda-CSDN博客 官网下载Python&#xff1a;http://www.python.org/download/官网下载Conda&#xff1a;Miniconda — Anaconda documentation VSCode插件安装 插件安装后需重启V…

layui-表格

1.使用方法 加上table标签 加上classlayui-table colgroup是列属性 tr是行td是列 thead是表头&#xff0c;后面一一对应 2.基础属性 加lay-even逐行换色 加lay-skin 设置边框风格

竞赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

企业多存储方式如何兼顾安全统一管理、便捷流畅访问的双向需求?

数据和文件存储是企业最基础的需求&#xff0c;常见的存储方式有磁盘存储、NAS存储、SAN存储、云存储、分布式存储、闪存存储等&#xff1b;随着企业规模的扩大、业务结构的复杂化&#xff0c;企业内部可能会同时出现多种存储方式、多个存储设备并行使用的情况。 这样的使用场景…

Ubuntu24.04(22.04+版本通用)Miniconda与Isaacgym

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

Meta 发布 Meta 3D Gen 文本生成3D模型

Meta推出了 Meta 3D Gen &#xff08;3DGen&#xff09;&#xff0c;这是一种用于文本到 3D 资产生成的最先进的快速管道。3DGen 可在一分钟内提供具有高提示保真度和高质量 3D 形状和纹理的 3D 资产创建。 它支持基于物理的渲染 &#xff08;PBR&#xff09;&#xff0c;这是…

【笔记】强化学习,gym的命令行图形化界面适配

搞了一大堆还是搞不出来放弃了 最后用matplotlib画出来看 import gym import matplotlib.pyplot as plt from IPython import display import numpy as np %matplotlib inlineenv gym.make(CartPole-v1, render_mode"rgb_array") observation env.reset() a 0 f…

新手教学系列——使用uWSGI对Flask应用提速

在构建和部署Flask应用时,性能和稳定性是两个关键的因素。为了提升Flask应用的性能,我们可以借助uWSGI这个强大的工具。本文将详细介绍为什么要使用uWSGI、uWSGI的底层原理,并提供一个实例配置,帮助你更好地理解和应用这个工具。 为什么要使用uWSGI uWSGI 是一个应用服务…

CentOS 7.9 快速更换 阿里云源教程

CentOS 7.9 更换源教程 总结 # 下载 wget yum -y install wget # 备份 yum 源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云的yum源到 /etc/yum.repos.d/ # 此处以 CentOS 7 为例&#xff0c;如果是其它版本或者系统的话&#…

微软工具合集 -- Microsoft PowerToys v0.82.0

软件简介 PowerToys是由微软开发的一款免费系统工具集&#xff0c;专为Windows 10和Windows 11系统设计。它提供了一系列高效实用的工具&#xff0c;旨在帮助用户提升操作系统的使用效率和个性化程度。PowerToys工具集深受系统管理员和高级用户的喜爱&#xff0c;通过集成多种…

Laravel介绍与学习入门

Laravel 是一款优雅且功能强大的 PHP Web 开发框架&#xff0c;它被广泛认为是 PHP 领域内构建现代 Web 应用程序的最佳选择之一。Laravel 提供了一套简洁、富有表现力的语法&#xff0c;使得开发者能够高效地编写清晰、可维护的代码。以下是 Laravel 的一些关键特点和入门概念…

Java线程同步的特征和安全类型

一线程同步的特征 ◆不同的线程在执行以同一个对象作为锁标记的同步代码块或同步方法时&#xff0c;因为要获得这个对象的锁而相互牵制&#xff0c;多个并发线程访问同一资源的同步代码块或同步方法时。 ◆同一时刻只能有一个线程进入synchronized(this)同步代码块。 ◆当一个…

大数据开发如何快速进阶

目录 1. 个人经验与心得分享1.1 试错的价值与机会把握1.2 投入产出比的考量1.3 刻意练习与技能提升1.4 目标设定与职业规划1.5 自我驱动与成长1.6 第一性原理的应用 2. 大数据开发领域的挑战与机遇2.1 技术革新的挑战2.2 数据治理的难题2.3 人才短缺的问题2.4 投入产出比的考量…

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码&#xff0c;我们用到的是tianai-captcha。 文档地址&#xff1a;http://doc.captcha.tianai.cloud/ 源码地址&#xff1a;https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…

路由的基本使用

1.安装 npm i vue-router3 2.引入 import VueRouter from vue-router 3.使用 Vue.use(VueRouter) 4.在src目录下创建router 5.创建两个组件 5.1创建About组件 <template><div> <h1>我是About的内容</h1></div> </template><script> …

PyMuPDF 操作手册 - 08 API - Document属性方法和简短说明

文章目录 https://pymupdf.readthedocs.io/en/latest/document.html#Document 方法/属性简短描述Document.add_layer()仅限 PDF:进行新的可选内容配置Document.add_ocg()仅限 PDF:添加新的可选内容组Document.authenticate()访问加密文档Document.bake()仅限 PDF:将…

Redis 高可用(理论)

目录 Redis 高可用 Redis 持久化 RDB 持久化 触发条件 手动触发 自动触发 ##其他自动触发机制## 执行流程 启动时加载 AOF 持久化 执行流程 &#xff08;1&#xff09;命令追加(append) &#xff08;2&#xff09;文件写入(write)和文件同步(sync) &#xff08;3&…

C++11新特性【下】{lambda表达式、可变模板参数、包装器}

一、lambda表达式 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用std::sort方法。如果待排序元素为自定义类型&#xff0c;需要用户定义排序时的比较规则&#xff0c;随着C语法的发展&#xff0c;人们开始觉得上面的写法太复杂了&#xff0c…

Linux服务器升级openssh9.8最新版全过程,及遇到问题处理

前言&#xff1a;由于2024年7月1日&#xff0c;openssh发布了最新版9.8&#xff0c;所以服务器需要升级一下&#xff0c;特此做个详细记录&#xff1a; 由于下载最新版openssh9.8&#xff0c;需要将openssl也一并进行升级 一、下载openssh最新版本与openssl对应版本&#xff…