Redis整合MySQL主从集群的示例代码

目录
  • 1、用Docker搭建MySQL主从集群
    • 1.1 拉取mysql镜像
    • 1.2 创建配置文件夹
    • 1.3 编写主服务器的配置文件信息
    • 1.4 启动mysql主服务器的容器
    • 1.5 观察主服务器状态
    • 1.6 配置mysql从服务器
    • 1.7 启动mysql从服务器
    • 1.8 确认主从关系
  • 2、准备数据
    • 2.1 创建数据库
    • 2.2 创建student数据表
    • 2.3 向student表插入几条数据
  • 3、用Java代码读写MySQL集群和Redis
    • 3.1 引入redis和mysql依赖
    • 3.2 代码整合
  • 4、MySQL主从集群整合Redis主从集群
    • 4.1 搭建Redis主从复制集群
    • 4.2、代码整合

Redis作为承担缓存作用的数据库,一般会应用在高并发的场景里,而在这些高并发应用场景的数据库层面还会用到其他数据库的组件或集群以提升性能,比如用MySQL主从集群实现读写分离效果、用MyCAT组件实现分库分表的功能。另外,Redis本身会以集群的形式对外提供缓存服务。

1、用Docker搭建MySQL主从集群

这里用Docker容器搭建如下图所示的MySQL主从集群。

  • 在主MySQL服务器里操作的动作会自动同步到从nysql服务器,比如在主服务器里发起的“建数据库”“通过insert语句插入数据”和“通过delete语句删除数据”的动作都会同步到从服务器,并且这些操作都会在从服务器上被执行。通过这种同步的动作能确保主从数据库间的数据一致性。
  • 在项目里,一般是向“主服务器”里写数据,从“从服务器”里读数据,用这种“读写分离”的操作方式提升数据库性能。

具体搭建的步骤如下:

1.1 拉取mysql镜像

  开启一个命令窗口,在其中运行docker pull mysql:latest,下载最新的mysql镜像。下载完成后,通过docker images mysql能看到如下图所示的镜像i信息。

1.2 创建配置文件夹

新建/root/redisconf/masterMySQL/conf/root/redisconf/masterMySQL/data两个目录,在其中将会保存主mysql服务器的配置信息和数据。同时新建/root/redisconf/slaveMySQL/conf/root/redisconf/slaveMySQL/data两个目录,在其中将会保存从MySQL服务器的配置信息和数据。当然,目录可自行更改。

1.3 编写主服务器的配置文件信息

  在/root/redisconf/masterMySQL/conf目录里新建一个my.cnf文件,在其中编写针对主mysql服务器的配置信息,主mysql服务器在启动时会读取其中的配置,具体代码如下所示:

[mysqld]
pid-file =/var/run/mysqld/mysqld.pid
socket =/var/run/mysqld/mysqld.sock
datadir =/var/lib/mysql
server-id =1
log-bin=mysql-master-bin

  第二行到第四行给出了MYSQL运行时的参数,在第五行里定义了该服务器的id(这个id需要和之后编写的从MySQL服务器的server-id不一样,否则会出错),在第6行里制定了二进制文件的名字(为了搭建主从集群,建议加上这行配置)

1.4 启动mysql主服务器的容器

docker run -itd --privileged=true -p 3306:3306 \
--name myMasterMysql -e MYSQL_ROOT_PASSWORD=123456\
-v /root/redisconf/masterMySQL/conf:/etc/mysql/conf.d\
 -v /root/redisconf/masterMySQL/data:/var/lib/mysql mysql:latest

-p3306:3306参数指定Docker容器里MySQL的工作端口3306映射到主机的3306端口
-itd参数指定该容器以后台交互模式的方式启动
--name参数指定该容器的名字
通过-e MYSQL_ROOT_PASSWORD=123456参数指定该容器运行时的环境变量,具体到这个场景,配置以用户名root登录到MySQL服务器时所用到的密码123456.
两个-v参数指定外部主机和Docker容器间映射的目录。由于在第三步把MySQL启动时需要加载的my.cnf文件放在了/root/redisconf/masterMySQL/conf目录里,因此这里需要把/root/redisconf/masterMySQL/conf目录映射成容器内部MYSQL服务器的相关路径。
通过mysql:latest参数指定该容器是基于这个镜像生成的。

查看启动的容器:docker ps

由此能确认myMasterMysql启动成功。
查看该Docker容器的IP地址:docker inspect myMasterMysql

可以看到,这里是172.17.0.2,这也是主mysql服务器所在的Ip地址。

1.5 观察主服务器状态

  运行docker exec -it myMasterMysql /bin/bash命令后进入该myMasterMysql容器的命令行窗口,再运行mysql -u root -p命令,进入MYSQL服务器的命令行窗口,在这个Mysql命令里,以-u参数指定用户名,随后需要输入密码(刚才设置的123456).

进入mysql服务器之后,再运行show master status命令观察主服务器的状态。

  

可以看到,主从集群同步所用到的日志文件是mysql-master-bin.000003,当前同步的位置是156,每次运行这个命令看到的结果未必相同,请记住这两个值,在设置从mysql服务器的主从同步关系时会用到。

1.6 配置mysql从服务器

  在/root/redisconf/slaveMaster/conf目录里,新建一个名为my.cnf的文件,编写针对从MYSQL服务器的配置信息。同样的,从Mysql服务器在启动时也会读取其中的配置,具体代码如下所示。

[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
server-id=2
log-bin=mysql-slave-bin

  该配置文件和第三步创建的主服务器的配置文件很相似,只不过在第5行更改了server-id(这里的取值不能和主mysql服务器的一致)。在第6行也是设置二进制文件的名字

1.7 启动mysql从服务器

docker run -itd --privileged=true -p 3316:3306\
 --name mySlaveMysql -e MYSQL_ROOT_PASSWORD=123456\
 -v /root/redisconf/slaveMySQL/conf:/etc/mysql/conf.d\
 -v /root/redisconf/slaveMySQL/data:/var/lib/mysql\
  mysql:latest

  这里在-p参数之后使用主机的3316端口映射Docker容器的3306端口,因为之前主mysql服务器的Docker容器已经映射到了3306端口,其他的参数和之前创建myMasterMysql容器时很相似,就不再重复了。

  随后docker exec -it mySlaveMysql /bin/bash进入容器,进入后可以运行mysql -h 172.17.0.2 -u root -p命令,尝试在这个容器里连接主MySQL服务器。其中172.17.0.2是主服务器的地址。随后输入root用户的密码123456,即可确认连接。

  确认链接后,通过exit命令退出指向myMasterMysql的连接,再通过mysql -h 127.0.0.1 -u root -p命令连接到本Docker容器包含的从MySQL服务器上。

1.8 确认主从关系

change master to master_host='172.17.0.2',master_port=3306,\
master_user='root',master_password='123456',\
master_log_pos=156,\
master_log_file='mysql-master-bin.000003';

   本命令运行在mySlaveMysql容器中的从Mysql服务器里,通过master_host和master_port指定主服务器的ip地址和端口号,通过master_user和master_password设置了连接所用的用户名和密码。
  注意master_logpos和master_log_file两个参数的值需要和第5步图中的结果一致。

  运行完成后,需要再运行start slave命令启动主从复制的动作。运行后可以通过show slave status\G;命令查看主从复制的状态,如果Slave_IO_Running和Slave_SQL_Running这两项都是Yes,并且没有其他异常,就说明配置主从复制成功。

  此时如果再到主mysql服务器里运行create database redisDemo创建一个数据库,那么从库里虽然没有运行命令,但是也能看到redisDemo数据库,这说明已经成功地搭建了MySQL主从复制集群。其中,主库地IP地址和端口号是172.17.0.2:3306,从库是172.17.0.3:3306.

主库

从库

2、准备数据

  由于已经成功地设置了主从复制模式,因此如下地建表和插入语句都只需要在主库里运行。

2.1 创建数据库

create database redisDemo

进入redisDemo数据库use redisDemo

2.2 创建student数据表

create table student(
    id int not null primary key,
    name char(20),
     age int,
     score float
    );

2.3 向student表插入几条数据

insert into student(id,name,age,score) values(1,'Peter',18,100);
insert into student(id,name,age,score) values(2,'Tom',17,98);
insert into student(id,name,age,score) values(3,'John',17,99);

从库里查看

3、用Java代码读写MySQL集群和Redis

3.1 引入redis和mysql依赖

   <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.3.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>

  Java应用程序是向主mySQL服务器写数据,这样写入地数据会自动同步到从mysql服务器上,而读数据时会先从Redis缓存里读,读不到时再到从mysql里读。以下用代码实现

3.2 代码整合

MySQLClusterDemo.java

import redis.clients.jedis.Jedis;
import java.sql.*;
public class MySQLClusterDemo {
    //创建操作Redis和数据库的对象
    private Jedis jedis;
    private Connection masterConn;  //连接主库的对象
    private Connection slaveConn;   //连接从库的对象
    PreparedStatement masterPs=null;    //对主库进行操作的对象
    PreparedStatement slavePs=null;     //对从库进行操作的对象
    //初始化环境
    private void init(){
        //MYSQL的连接参数
        String mySQLDriver="com.mysql.cj.jdbc.Driver";
        String masterUrl="jdbc:mysql://192.168.159.33:3306/redisDemo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
        String slaveUrl="jdbc:mysql://192.168.159.33:3316/redisDemo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
        String user="root";
        String pwd="123456";
        try{
            Class.forName(mySQLDriver);
            masterConn= DriverManager.getConnection(masterUrl,user,pwd);
            slaveConn= DriverManager.getConnection(slaveUrl,user,pwd);
            jedis=new Jedis("192.168.159.33",6379);
        }catch (SQLException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private void insertData(){
        //是向主MySQL服务器插入数据
        try{
        masterPs=masterConn.prepareStatement("insert into student(id,name,age,score) values(10,'Frank',18,100)");
        masterPs.executeUpdate();
        }catch (SQLException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private String getNameByID(String id){
        String key="Stu"+id;
        String name="";
        //如果存在于Redis,就先从Redis里获取
        if(jedis.exists(key)){
            System.out.println("ID:"+key+" exists in Redis");
            name=jedis.get(key);
            System.out.println("Name is :"+jedis.get(key));
            return name;
        }else{  //如果没在Redis里,就到从MySQL里去读
            try {
                slavePs=slaveConn.prepareStatement("select name from student where id=10");
                ResultSet rs=slavePs.executeQuery();
                if(rs.next()){
                    System.out.println("ID: "+key+" exists in Slave MySQL");
                    name=rs.getString("name");
                    System.out.println("Name is: "+name);
                    //放入Redis缓存
                    jedis.set(key,name);
                }
                return name;
            }catch (SQLException e){
                e.printStackTrace();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return name;
    }

    public static void main(String[] args) {
        MySQLClusterDemo tool=new MySQLClusterDemo();
        tool.init();
        tool.insertData();
        //场景1 没有从Redis中找到,就到从MySQL服务器中去读
        System.out.println(tool.getNameByID("10"));
        //场景2,当前ID=10的数据已存在于Redis,所有直接读缓存
        System.out.println(tool.getNameByID("10"));
    }
}

运行结果

4、MySQL主从集群整合Redis主从集群

  上面的mysql主从集群至整合了一个Redis主机,在这种模式里如果Redis服务器失效了,那么整个缓存可能都会失效。可以在次基础上引入Redis主从复制集群,以提升缓存的可用性以及性能,改进后的框架图如下所示。

应用程序同样是向主mysql服务器里写数据,这些数据同步到从mysql数据库里。

应用程序先到“从Redis服务器”里读取缓存,如果找不到,就再到从mysql数据库里去读。

如果从“从mysql数据库”里读到数据,那么需要写入“主Redis”,而根据Redis集群的主从复制机制,该数据会被写入“从Redis服务器”。这种针对Redis集群的读写分离机制能提升读写缓存的性能。

4.1 搭建Redis主从复制集群

4.1.1 创建redis-master容器

docker run -itd --name redis-master -p 6379:6379 redis:latest

4.1.2 创建resis-slave容器

docker run -itd --name redis-slave -p 6380:6379 redis:latest

4.1.3 查看redis服务器的ip

docker inspect redis-master

可以看到,redis-master的ip地址为172.17.0.4

4.1.4 主从配置

  在redis-slave容器的窗口里,通过docker exec -it redis-slave /bin/bash命令进入容器的命令行窗口。运行如下的slaveof命令,指定当前服务器为从服务器,该命令的格式是slaveof IP地址 端口号,这里指向172.17.0.2:6379所在的主服务器。

slaveof 172.17.0.4 6379

运行完该命令后,在redis-slave客户端里再次运行info replication

  可以看到,该redis-slave已经成为从服务器,从属于172.17.0.2:6379所在的Redis服务器。

4.2、代码整合

MySQLClusterImprovedDemo.java

import redis.clients.jedis.Jedis;
import java.sql.*;
public class MySQLClusterImprovedDemo {
    //创建操作Redis和数据库的对象
    private Jedis masterJedis;  //指向主Redis服务器
    private Jedis slaveJedis;   //指向从Redis服务器
    private Connection masterConn;  //连接主库的对象
    private Connection slaveConn;   //连接从库的对象
    PreparedStatement masterPs=null;    //对主库进行操作的对象
    PreparedStatement slavePs=null;     //对从库进行操作的对象

    private void init(){
        //MYSQL的连接参数
        String mySQLDriver="com.mysql.cj.jdbc.Driver";
        String masterUrl="jdbc:mysql://192.168.159.33:3306/redisDemo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
        String slaveUrl="jdbc:mysql://192.168.159.33:3316/redisDemo?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
        String user="root";
        String pwd="123456";
        try{
            Class.forName(mySQLDriver);
            masterConn= DriverManager.getConnection(masterUrl,user,pwd);
            slaveConn= DriverManager.getConnection(slaveUrl,user,pwd);
            masterJedis=new Jedis("192.168.159.33",6379);
            slaveJedis=new Jedis("192.168.159.33",6380);
        }catch (SQLException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    private void insertData(){
        //是向主MySQL服务器插入数据
        try{
            masterPs=masterConn.prepareStatement("insert into student(id,name,age,score) values(10,'Frank',18,100)");
            masterPs.executeUpdate();
        }catch (SQLException e){
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private String getNameByID(String id){
        String key="Stu"+id;
        String name="";
        //如果存在于Redis,就先从Redis里获取
        if(slaveJedis.exists(key)){ //到从Redis服务器去找
            System.out.println("ID: "+key+" exists in Redis.");
            name=slaveJedis.get(key);//找到后到从Redis里读
            System.out.println("Name is: "+slaveJedis.get(key));
            return name;
        }else{  //没在Redis,就到从MySQL去读
            try{
                slavePs=slaveConn.prepareStatement("select name from student where id=10");
                ResultSet rs=slavePs.executeQuery();
                if(rs.next())
                {
                    System.out.println("ID: "+key+" exists in Slave MySQL");
                    name=rs.getString("name");
                    System.out.println("Name is: "+name);
                    //放入主Redis缓存
                    masterJedis.set(key,name);
                }
                return name;
            }catch (SQLException e){
                e.printStackTrace();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return name;
    }

    public static void main(String[] args) {
        MySQLClusterImprovedDemo tool=new MySQLClusterImprovedDemo();
        tool.init();
        tool.insertData();
        //场景1 在主Redis中没有读到,则到从MySQL服务器中读
        System.out.println(tool.getNameByID("10"));
        //场景2 当前ID=10已经存在于Redis,所以直接读缓存
        System.out.println(tool.getNameByID("10"));
    }
}

   为了突出重点,这里我并没有设置“缓存失效时间”和“防止缓存穿透”等方面的实施代码,但是这些要点同样重要。

到此这篇关于Redis整合MySQL主从集群的示例代码的文章就介绍到这了,更多相关Redis整合MySQL主从集群内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Redis主从实现读写分离

    前言 大家在工作中可能会遇到这样的需求,即Redis读写分离,目的是为了压力分散化.下面我将为大家介绍借助AWS的ELB实现读写分离,以写主读从为例. 实现 引用库文件 <!-- redis客户端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.2</version> &l

  • redis的主从配置方法详解

    Linux系统下的redis的主从配置方法非常简单,下面给大家分享一下redis的主从配置方法具体的操作步骤 环境介绍: OS:oracle linux 5.6 redis:redis-2.6.8 master rac1 192.168.2.101 slave    rac2 192.168.2.102 下载地址: http://redis.googlecode.com/files/redis-2.6.8.tar.gz 安装配置主从redis 1. 主节点配置 [root@rac1 opt] t

  • Redis主从复制问题和扩容问题的解决思路

    一.解决主从复制问题 当使用Redis作为存储引擎的时候,并且使用Redis读写分离,从机作为读的情况,从机宕机或者和主机断开连接都需要重新连接主机,重新连接主机都会触发全量的主从复制,这时候主机会生成内存快照,主机依然可以对外提供服务,但是作为读的从机,就无法提供对外服务了,如果数据量大,恢复的时间会相当的长.为了解决Redis主从Copy的问题,有如下两个解决方案: 主动复制所谓主动复制,就是业务层双写多个Redis,避开Redis自带的主从复制.但是自己干同步,就会产生一致性问题,为了保证

  • Redis的主从同步解析

    一.Redis主从同步原理 1.1 Redis主从同步的过程 配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中.同时master主进程会开始收集新的写命令并缓存起来.当后台进程完成写文件后,master就将快照文件发送给slave,slave将文件保存到磁盘上,然后加载到内存将数据库快照恢复到slave上.slave完成快照文件的恢

  • Redis Cluster集群主从切换的踩坑与填坑

    因为项目的原因采用了Redis Cluster,3主3从,每台主机1主1从,集群信息如下: 10.135.255.72:20011> cluster nodes 7b662b36489a6240aa21d1cf7b04b84019254b63 10.135.255.74:20012 slave 85c78164a448fb9965e22447429a56cab226c68f 0 1537239581900 43 connected 61c3e1a640e71f4801d850c901dd33f0

  • Redis主从复制详解

    单机Redis存在的问题 无法故障转移 ,无法避免单点故障 磁盘空间的瓶颈 QPS瓶颈 Redis主从复制的作用 提供数据副本 扩展读性能 配置方法 通过命令 通过配置文件 演示 为方便演示,在一台服务器上搭建redis主从(生产上不会这样做),根据端口区分. 主库 6379 从库 6380 编辑配置文件 vi  redis-6379.conf #后台进程启动 daemonize yes #端口 port 6379 #日志文件名称 logfile "6379.log" #Redis工作

  • 使用Docker搭建Redis主从复制的集群

    在主从复制模式的集群里,主节点一般是一个,从节点一般是两个或多个,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统能切换到从节点去读写数据,这样能提升系统的可用性.而且如果再采用主从复制模式里默认的读写分离的机制,更能提升系统的缓存读写性能.所以对性能和实时性不高的系统而言,主从复制模式足以满足一般的性能和安全性方面的需求. 1 概述主从复制模式 在实际应用中,如果有相应的设置,在向一台Redis服务器里写数据后,这个数据可以复制到另外一台(或多台)Redis服务器,这里数据

  • Redis主从同步配置的方法步骤(图文)

    一丶主从概念 一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1 通过主从配置可以实现读写分离 master和slave都是一个redis实例(redis服务) 二丶主从配置 说明:搭建redis主服务和从服务可以在同一台电脑上搭建,也可以在不同电脑上搭建,博主这里使用一台电脑进行搭建 1.配置主 step1 查看电脑中的ip地址 step2 编辑

  • Redis整合MySQL主从集群的示例代码

    目录 1.用Docker搭建MySQL主从集群 1.1 拉取mysql镜像 1.2 创建配置文件夹 1.3 编写主服务器的配置文件信息 1.4 启动mysql主服务器的容器 1.5 观察主服务器状态 1.6 配置mysql从服务器 1.7 启动mysql从服务器 1.8 确认主从关系 2.准备数据 2.1 创建数据库 2.2 创建student数据表 2.3 向student表插入几条数据 3.用Java代码读写MySQL集群和Redis 3.1 引入redis和mysql依赖 3.2 代码整合

  • Keepalived+Nginx+Tomcat 实现高可用Web集群的示例代码

    Keepalived+Nginx+Tomcat 实现高可用Web集群 一.Nginx的安装过程 1.下载Nginx安装包,安装依赖环境包 (1)安装 C++编译环境 yum -y install gcc #C++ (2)安装pcre yum -y install pcre-devel (3)安装zlib yum -y install zlib-devel (4)安装Nginx 定位到nginx 解压文件位置,执行编译安装命令 [root@localhost nginx-1.12.2]# pwd

  • docker实现MySQL主从双备的示例代码

    目录 环境配置 MySQL基础知识 搭建主MySQL 搭建从MySQL 配置主从复制 拓展 环境配置 本地操作系统:Win10虚拟机的操作系统:CentOS Stream 8已安装docker,可以参考详细安装教程 MySQL基础知识 搭建MySQL主从双备是在docker情况下自定义MySQL的配置文件,在上一节我们讲述了如何挂载docker的MySQL数据文件,其中run指令参数-v /home/mysql/conf:/etc/mysql/conf.d是挂载MySQL的配置文件. 当我们通过

  • 基于Docker搭建Redis主从集群的实现

    最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得一定是之前写的这篇 <基于Docker的Redis集群搭建> 文章有问题了,所以我花了几分钟浏览之前的文章总结了下面几个问题: redis 数量太少,只创建了 3 个实例:由于只有 3 个实例,所以全部只能是主节点,无法体现集群主从关系:如何搭建主从集群?如何分配从节点? 基于之前的文章,我想快速的过一下这几个问题,本文基于 Docker + Redis 5.0.5 版本,通过 cluster 方式创建一个 6 个 redi

  • Redis源码解析:集群手动故障转移、从节点迁移详解

    一:手动故障转移 Redis集群支持手动故障转移.也就是向从节点发送"CLUSTER  FAILOVER"命令,使其在主节点未下线的情况下,发起故障转移流程,升级为新的主节点,而原来的主节点降级为从节点. 为了不丢失数据,向从节点发送"CLUSTER  FAILOVER"命令后,流程如下: a:从节点收到命令后,向主节点发送CLUSTERMSG_TYPE_MFSTART包:          b:主节点收到该包后,会将其所有客户端置于阻塞状态,也就是在10s的时间内

  • 具有负载均衡功能的MySQL服务器集群部署及实现

    在实际生产环境中,部署和实现具有一定负载均衡功能的 MySQL服务器集群,对于提高用户数据库应用系统的性能.速度和稳定性具有明显的作用.本文简要介绍了在 FreeBSD 7.0-Release系统上部署实现MySQL服务器集群的方案,并对可能出现的问题提供了相应的解决方法.1. 引言MySQL是一个高速度.高性能.多线程.开放源代码,建立在客户/服务器(Client /Server)结构上的关系型数据库管理系统(RDBMS).它始于1979年,最初是Michael Widenius为瑞典TcX公

  • 一文掌握Redis的三种集群方案(小结)

    在开发测试环境中,我们一般搭建Redis的单实例来应对开发测试需求,但是在生产环境,如果对可用性.可靠性要求较高,则需要引入Redis的集群方案.虽然现在各大云平台有提供缓存服务可以直接使用,但了解一下其背后的实现与原理总还是有些必要(比如面试), 本文就一起来学习一下Redis的几种集群方案. Redis支持三种集群方案 主从复制模式 Sentinel(哨兵)模式 Cluster模式 主从复制模式 1. 基本原理 主从复制模式中包含一个主数据库实例(master)与一个或多个从数据库实例(sl

  • SpringBoot整合Redis实现消息发布与订阅的示例代码

    当我们在多个集群应用中使用到本地缓存时,在数据库数据得到更新后,为保持各个副本当前被修改的数据与数据库数据保持同步,在数据被操作后向其他集群应用发出被更新数据的通知,使其删除;下次当其他应用请求该被更新的数据时,应用会到数据库去取,也就是最新的数据,从而使得被更新数据与数据库保持同步! 能实现发送与接收信息的中间介有很多,比如:RocketMQ.RabbitMQ.ActiveMQ.Kafka等,本次主要简单介绍Redis的推送与订阅功能并集成Spring Boot的实现. 1.添加SpringB

  • Redis自动化安装及集群实现搭建过程

    Redis实例安装 安装说明:自动解压缩安装包,按照指定路径编译安装,复制配置文件模板到Redis实例路的数据径下,根据端口号修改 配置文件模板 配置文件,当前shell脚本,安装包 参数1:basedir,redis安装包路径 参数2:安装实例路径 参数3:安装包名称 参数4:安装实例的端口号 #!/bin/bash set -e if [ $# -lt 4 ]; then echo "$(basename $0): Missing script argument" echo &qu

  • SpringBoot整合Redis正确的实现分布式锁的示例代码

    前言 最近在做分块上传的业务,使用到了Redis来维护上传过程中的分块编号. 每上传完成一个分块就获取一下文件的分块集合,加入新上传的编号,手动接口测试下是没有问题的,前端通过并发上传调用就出现问题了,并发的get再set,就会存在覆盖写现象,导致最后的分块数据不对,不能触发分块合并请求. 遇到并发二话不说先上锁,针对执行代码块加了一个JVM锁之后问题就解决了. 仔细一想还是不太对,项目是分布式部署的,做了负载均衡,一个节点的代码被锁住了,请求轮询到其他节点还是可以进行覆盖写,并没有解决到问题啊

随机推荐