1.Redis

1.1 安装

    wget http://download.redis.io/releases/redis-x.x.x.tar.gz

    

  • step2:解压

    tar xzf redis-x.x.x.tar.gz

  • step3:移动,放到usr/local⽬录下

    sudo mv ./redis-x.x.x /usr/local/redis/

  • step4:进⼊redis⽬录

    cd /usr/local/redis/

  • step5:生成

    sudo make

    

  • step6:测试,这段运⾏时间会较⻓

    sudo make test

    

  • step7:安装,将redis的命令安装到/usr/local/bin/⽬录

    sudo make install

  • step8:安装完成后,我们进入目录/usr/local/bin中查看

    cd /usr/local/bin

    ls -all

    

    redis-server redis服务器

    redis-cli redis命令行客户端

    redis-benchmark redis性能测试工具

    redis-check-aof AOF文件修复工具

    redis-check-rdb RDB文件检索工具

  • step9:配置⽂件,移动到/etc/⽬录下

    配置⽂件⽬录为/usr/local/redis/redis.conf

    sudo cp /usr/local/redis/redis.conf /etc/redis/

  • step9:其他补充

    Mac 上安装 Redis:https://brew.sh/

    使用 brew 安装 Redis:https://www.cnblogs.com/cloudshadow/p/mac_brew_install_redis.html

1.2 配置

  • Redis的配置信息在/etc/redis/redis.conf

    查看  sudo vi /etc/redis/redis.conf

  • 绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip

    • bind 127.0.0.1
  • 端⼝:默认为6379

    • port 6379
  • 是否以守护进程运⾏

    • 如果以守护进程运行,则不会在命令⾏阻塞,类似于服务
    • 如果以⾮守护进程运⾏,则当前终端被阻塞
    • 设置为yes表示守护进程,设置为no表示⾮守护进程
    • 推荐设置为yes   daemonize yes
  • 数据⽂件

    • dbfilename dump.rdb
  • 数据⽂件存储路径

    • dir /var/lib/redis  
  • ⽇志⽂件

    • logfile "/var/log/redis/redis-server.log"
  • 数据库,默认有16个

    • database 16
  • 主从复制,类似于双机备份

    • slaveof  host  port

1.3 服务器端和客户端命令

  1.3.1 服务器端

  • 服务器端的命令为redis-server   
  • 可以使⽤help查看帮助⽂档

    • redis-server --help
  • 个人习惯

    • ps aux | grep redis 查看redis服务器进程
    • sudo kill -9 pid 杀死redis服务器
    • sudo redis-server /etc/redis/redis.conf 指定加载的配置文件

  1.3.2 客户端

  • 客户端的命令为redis-cli
  • 可以使⽤help查看帮助⽂档

    • redis-cli --help
  • 连接redis

    • redis-cli

      

  • 运⾏测试命令

    • ping
  • 切换数据库
  • 数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库

    • select 10

1.4 数据操作

 

键命令

        1)查看所有键:keys *
2)查看名称中包含a的键:keys a*
3)判断键是否存在,如果存在返回1,不存在返回0:exists key1
4)查看键对应的value的类型:type key
5)删除键及对应的值:del key1 key2 ...
6)设置过期时间,以秒为单位:expire key seconds
7)查看有效时间,以秒为单位:ttl key

键命令 

string

hash类型:

    hash⽤于存储对象,对象的结构为属性、值
值的类型为string 1、增加、修改 设置单个属性:hset key field value
设置多个属性:hmset key field1 value1 field2 value2 ... 2、获取 获取指定键所有的属性:hkeys key
获取所有属性的值:hvals key
获取⼀个属性的值:hget key field
获取多个属性的值:hmget key field1 field2 ... 3、删除 删除整个hash键及值,使⽤del命令:hdel key ...

hash

list类型

    列表的元素类型为string
按照插⼊顺序排序 1、增加 在左侧插⼊数据:lpush key value1 value2 ...
在右侧插⼊数据:rpush key value1 value2 ...
在指定元素的前或后插⼊新元素:
linsert key before或after 现有元素 新元素 2、获取 返回列表⾥指定范围内的元素:range key start stop
设置指定元素的值:lset key index value 3、删除 删除指定元素
将列表中前count次出现的值为value的元素移除
count > 0: 从头往尾移除
count < 0: 从尾往头移除
count = 0: 移除所有 lrem key count value 4、截取修剪 修剪(截取) 在[start stop]区间内的元素,区间外的元素全部删除
ltrim key start stop

list

set类型
1)⽆序集合
2)元素为string类型
3)元素具有唯⼀性,不重复
4)说明:对于集合没有修改操作 1、增加 1)添加元素:sadd key member1 member2 ... 2、获取 1)返回所有的元素:smembers key 3、删除 1)删除指定元素:srem key values

set

zset类型
1)sorted set,有序集合
2)元素为string类型
3)元素具有唯⼀性,不重复
4)每个元素都会关联⼀个double类型的score,
表示权重,通过权重将元素从⼩到⼤排序
5)说明:没有修改操作 1、增加 1)添加:zadd key score1 member1 score2 member2 ... 2、获取 1)返回指定范围内的元素:zrange key start stop
2)获取键a1的集合中权限值在min和max之间的成员
zrangebyscore a1 5 6
3)获取键a2的集合中元素zhangsan的权重
zscore a4 zhangsan 3、删除 1)删除指定元素:zrem key member1 member2 ...
2)删除权重在指定范围的元素:zremrangebyscore key min max

zset

1.5 与python交互

  安装包

  安装Redis的有3种方式https://github.com/andymccurdy/redis-py

  • 第一种:进⼊虚拟环境,联⽹安装包redis

    • pip install redis
  • 第二种:进⼊虚拟环境,联⽹安装包redis
    • easy_install redis
  • 第三种:到中⽂官⽹-客户端下载redis包的源码,使⽤源码安装

  调用模块

  • 引⼊模块

    • from redis import StrictRedis
  • 这个模块中提供了StrictRedis对象,⽤于连接redis服务器,并按照不同类型提供 了不同⽅法,进⾏交互操作

  

  1.5.1  StrictRedis对象方法

      • 通过init创建对象,指定参数host、port与指定的服务器和端⼝连接,host默认为localhost,port默认为6379,db默认为0
      • sr = StrictRedis(host='localhost', port=6379, db=0)
        
        sr=StrictRedis()
      • 根据不同的类型,拥有不同的实例⽅法可以调⽤,与前⾯学的redis命令对应,⽅法需要的参数与命令的参数⼀致  
        • 1、exists
          2、type
          3、delete
          4、expire
          5、getrange
          6、ttl

          keys

        • 1、set
          2、setex
          3、mset
          4、append
          5、get
          6、mget
          7、key

          string

        • 1、hset
          2、hmset
          3、hkeys
          4、hget
          5、hmget
          6、hvals
          7、hdel

          hash

        • 1、lpush
          2、rpush
          3、linsert
          4、lrange
          5、lset
          6、lrem

          list

        • 1、sadd
          2、smembers
          3、srem

          set

        • 1、zadd
          2、zrange
          3、zrangebyscore
          4、zscore
          5、zrem
          6、zremrangebyscore

          zset

  1.5.2  举例 String

      • ⽅法set,添加键、值,如果添加成功则返回True,如果添加失败则返回False
        编写代码如下: from redis import *
        if __name__=="__main__":
        try:
        #创建StrictRedis对象,与redis服务器建⽴连接
        sr=StrictRedis()
        #添加键name,值为itheima
        result=sr.set('name','itheima')
        #输出响应结果,如果添加成功则返回True,否则返回False
        print(result)
        except Exception as e:
        print(e)

        string--增加

      • 1)⽅法get,添加键对应的值,如果键存在则返回对应的值,
        如果键不存在则返回None 编写代码如下: from redis import *
        if __name__=="__main__":
        try:
        #创建StrictRedis对象,与redis服务器建⽴连接
        sr=StrictRedis()
        #获取键name的值
        result = sr.get('name')
        #输出键的值,如果键不存在则返回None
        print(result)
        except Exception as e:
        print(e)

        string--获取

      • 1)⽅法set,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
        
        编写代码如下:
        
        from redis import *
        if __name__=="__main__":
        try:
        #创建StrictRedis对象,与redis服务器建⽴连接
        sr=StrictRedis()
        #设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
        result = sr.set('name','itcast')
        #输出响应结果,如果操作成功则返回True,否则返回False
        print(result)
        except Exception as e:
        print(e)

        string--修改

      • 1)⽅法delete,删除键及对应的值,如果删除成功则返回受影响的键数,
        否则返回0 编写代码如下: from redis import *
        if __name__=="__main__":
        try:
        #创建StrictRedis对象,与redis服务器建⽴连接
        sr=StrictRedis()
        #设置键name的值,如果键已经存在则进⾏修改,如果键不存在则进⾏添加
        result = sr.delete('name')
        #输出响应结果,如果删除成功则返回受影响的键数,否则则返回0
        print(result)
        except Exception as e:
        print(e)

        string--删除

      • 1)⽅法keys,根据正则表达式获取键
        
        编写代码如下:
        
        from redis import *
        if __name__=="__main__":
        try:
        #创建StrictRedis对象,与redis服务器建⽴连接
        sr=StrictRedis()
        #获取所有的键
        result=sr.keys()
        #输出响应结果,所有的键构成⼀个列表,如果没有键则返回空列表
        print(result)
        except Exception as e:
        print(e)

        string--获取键

1.6 搭建主从

  1.6.1 主从概念

      • ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
      • master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
      • 通过主从配置可以实现读写分离
      • master和slave都是一个redis实例(redis服务)

  1.6.2 主从配置

      配置主
      • 查看当前主机的ip地址

        • ifconfig
      • 修改/etc/redis/redis.conf文件

           sudo vi redis.conf
           bind 192.168.26.128

      • 重启redis服务  

           sudo service redis stop
           sudo redis-server redis.conf

  配置从

      • 复制/etc/redis/redis.conf文件   

           sudo cp redis.conf ./slave.conf

      • 修改redis/slave.conf文件  

           sudo vi slave.conf    

      • 编辑内容  

           bind 192.168.26.128   

           port 6378

           slaveof 192.168.26.128 6379  

      • redis服务

           sudo redis-server slave.conf

      • 查看主从关系  

           redis-cli -h 192.168.26.128 info Replication

  1.6.3 数据操作

      • 在master和slave分别执⾏info命令,查看输出信息 进入主客户端

           redis-cli -h 192.168.26.128 -p 6379  

      • 进入从的客户端

           redis-cli -h 192.168.26.128 -p 6378

      • 在master上写数据

           set aa aa

           

      • 在slave上读数据

           get aa

  1.6.4 与python交互

      • REDIS = {
        'Master':{
        'host':'192.168.56.100',
        'port': '6379',
        'db': 0
        },
        'Slave':{
        'host':'192.168.56.100',
        'port': '6378',
        'db': 0
        },
        } class MSRedis(object):
        '''读写分离客户端(只针对程序中用到的命令)'''
        def __init__(self,conf):
        self.master = StrictRedis(**conf['Master'])
        self.slave = StrictRedis(**conf['Slave'])
        self.read_commands = [
        'ttl', 'exist', 'expire', 'get', 'keys',
        'hget', 'hgetall', 'hkeys', 'hmget',
        'sismember', 'smembers', 'sdiff', 'sinter', 'sunion'
        'zrevrange', 'zrevrangebyscore', 'zrevrank', 'zscore'
        ] def __getattribute__(self, name):
        if name in ['master', 'slave', 'read_commands']:
        return object.__getattribute__(self, name)
        elif name in self.read_commands:
        print('选择了从库')
        return self.slave.__getattribute__(name)
        else:
        print('选择了主库')
        return self.master.__getattribute__(name) rds = MSRedis(REDIS) res = rds.get('name2')
        # res = rds.set('name2','lisi')
        print(res)

        redis_test.py

            

1.7 搭建集群

    1.7.1 配置机器1

      • 在演示中,192.168.56.100为当前ubuntu机器的ip
      • 在192.168.56.100上进⼊Desktop⽬录,创建conf⽬录
      • 在conf⽬录下创建⽂件7000.conf,编辑内容如下
        • port 7000
          bind 192.168.56.100
          daemonize yes
          pidfile 7000.pid
          cluster-enabled yes
          cluster-config-file 7000_node.conf
          cluster-node-timeout 15000
          appendonly yes

          7000.conf

      • 在conf⽬录下创建⽂件7001.conf,编辑内容如下

        • port 7001
          bind 192.168.56.100
          daemonize yes
          pidfile 7001.pid
          cluster-enabled yes
          cluster-config-file 7001_node.conf
          cluster-node-timeout 15000
          appendonly yes

          7001.conf

      • 在conf⽬录下创建⽂件7002.conf,编辑内容如下

        • port 7002
          bind 192.168.56.100
          daemonize yes
          pidfile 7002.pid
          cluster-enabled yes
          cluster-config-file 7002_node.conf
          cluster-node-timeout 15000
          appendonly yes

          7002.conf

      • 总结:三个⽂件的配置区别在port、pidfile、cluster-config-file三项
      • 使⽤配置⽂件启动redis服务
        • redis-server 7000.conf
          redis-server 7001.conf
          redis-server 7002.conf
      • 查看进程如下图

    1.7.2 配置机器2

      • 在演示中,192.168.56.100为当前ubuntu机器的ip
      • 在192.168.56.100上进⼊Desktop⽬录,创建conf⽬录
      • 在conf⽬录下创建⽂件7003.conf,编辑内容如下

        • port 7003
          bind 192.168.56.100
          daemonize yes
          pidfile 7003.pid
          cluster-enabled yes
          cluster-config-file 7003_node.conf
          cluster-node-timeout 15000
          appendonly yes

          7003.con  

      • 在conf⽬录下创建⽂件7004.conf,编辑内容如下

        • port 7004
          bind 192.168.56.100
          daemonize yes
          pidfile 7004.pid
          cluster-enabled yes
          cluster-config-file 7004_node.conf
          cluster-node-timeout 15000
          appendonly yes

          7004.conf

      • 在conf⽬录下创建⽂件7005.conf,编辑内容如下

        • port 7005
          bind 192.168.56.100
          daemonize yes
          pidfile 7005.pid
          cluster-enabled yes
          cluster-config-file 7005_node.conf
          cluster-node-timeout 15000
          appendonly yes

          7005.conf

      • 总结:三个⽂件的配置区别在port、pidfile、cluster-config-file三项
      • 使⽤配置⽂件启动redis服务
        • redis-server 7003.conf
          redis-server 7004.conf
          redis-server 7005.conf
      • 查看进程如下图

    

    1.7.3 创建集群  

      • redis的安装包中包含了redis-trib.rb,⽤于创建集群
      • 接下来的操作在192.168.56.100机器上进⾏
      • 将命令复制,这样可以在任何⽬录下调⽤此命令
      • sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
      • 安装ruby环境,因为redis-trib.rb是⽤ruby开发的
      • sudo apt-get install ruby
      • 在提示信息处输⼊y,然后回⻋继续安装
      • 运⾏如下命令创建集群
      • redis-trib.rb create --replicas 1 192.168.56.100:7000 192.168.56.100:7001 192.168.56.100:7002 192.168.56.100:7003 192.168.56.100:7004 192.168.56.100:7005
      • 执⾏上⾯这个指令在某些机器上可能会报错,主要原因是由于安装的 ruby 不是最 新版本!
      • 天朝的防⽕墙导致⽆法下载最新版本,所以需要设置 gem 的源
      • 解决办法如下
      • -- 先查看⾃⼰的 gem 源是什么地址
        gem source -l -- 如果是https://rubygems.org/ 就需要更换
        -- 更换指令为
        gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
        -- 通过 gem 安装 redis 的相关依赖
        sudo gem install redis
        -- 然后重新执⾏指令
      • redis-trib.rb create --replicas 1 192.168.56.100:7000 192.168.56.100:7001 192.168.56.100:7002 192.168.56.100:7003 192.168.56.100:7004 192.168.56.100:7005
      • 提示如下主从信息,输⼊yes后回⻋  
      • 提示完成,集群搭建成功

    

    1.7.4 数据验证

      • 根据上图可以看出,当前搭建的主服务器为7000、7001、7002,对应的从服务器是7003、7004、7005
      • 在192.168.56.100机器上连接7002,加参数-c表示连接到集群
      • redis-cli -h 172.16.179.131 -c -p 7002
      • 写⼊数据
      • set name itheima
      • ⾃动跳到了7003服务器,并写⼊数据成功
      • 在7003可以获取数据,如果写入数据又重定向到7000(负载均衡)

    

    1.7.5 在哪个服务器上写数据:CRC16

      • redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中 的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保 证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
      • Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希 槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈 希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的 时候看到set 和 get 的时候,直接跳转到了7000端⼝的节点
      • Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节 点获取数据。只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充 当 master
      • 需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存 活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了

   

    1.7.6 与python交互

      • from rediscluster import *
        
        if __name__ == '__main__':
        try:
        # 构建所有的节点,Redis会使⽤CRC16算法,将键和值写到某个节点上
        startup_nodes = [
        {'host': '192.168.56.100', 'port': '7000'},
        {'host': '192.168.56.100', 'port': '7001'},
        {'host': '192.168.56.100', 'port': '7002'},
        {'host': '192.168.56.100', 'port': '7003'},
        {'host': '192.168.56.100', 'port': '7004'},
        {'host': '192.168.56.100', 'port': '7005'},
        ]
        # 构建StrictRedisCluster对象
        src=RedisCluster(startup_nodes=startup_nodes,decode_responses=True) #decode_responses=True 返回的内容自动decode一下
        # 设置键为name、值为itheima的数据
        result=src.set('name','zhangsan')
        print(result)
        # 获取键为name
        name = src.get('name')
        print(name)
        except Exception as e:
        print(e) #1、存储的位置不需要管 因为它是通过哈希自动分配到一个服务器上
        #2、现在我们开发只是要求高性能 还没
        # 有高可用 崩溃了之后 有崩溃的处理方式 高可用交给运维去做

        redis_cluster.py

Redis--部署操作的更多相关文章

  1. Python Redis常用操作(持续更新)

    目录 1.Redis简介 2.Redis部署 3.Redis API应用 4.String操作 1.Redis简介 redis是业界主流的key-value,nosql数据库之一.和Memcached ...

  2. Redis 部署方式(单点、master/slaver、sentinel、cluster) 概念与区别

    转载自 https://blog.csdn.net/java_zyq/article/details/83818341 在K8S上部署Redis集群时突然遇到一个(sentinel哨兵模式)概念,感觉 ...

  3. Operator 示例:使用 Redis 部署 PHP 留言板应用程序

    「Kubernetes 官方示例:使用 Redis 部署 PHP 留言板应用程序」Operator 化. 源码仓库:https://github.com/jxlwqq/guestbook-operat ...

  4. spring data redis RedisTemplate操作redis相关用法

    http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

  5. Spring Framework 中启动 Redis 事务操作

    背景: 项目中遇到有一系列对Redis的操作,并需要保持事务处理. 环境: Spring version 4.1.8.RELEASE Redis Server 2.6.12 (64位) spring- ...

  6. php的redis 操作类,适用于单台或多台、多组redis服务器操作

    redis 操作类,包括单台或多台.多组redis服务器操作,适用于业务复杂.高性能要求的 php web 应用. redis.php: <?php /* redis 操作类,适用于单台或多台. ...

  7. 【springboot】【redis】springboot结合redis,操作List集合实现时间轴功能

    springboot结合redis,操作List集合实现时间轴功能

  8. php redis队列操作

    php redis队列操作 rpush/rpushx 有序列表操作,从队列后插入元素:lpush/lpushx 和 rpush/rpushx 的区别是插入到队列的头部,同上,'x'含义是只对已存在的 ...

  9. redis下操作hash对象

    redis下操作hash对象 hash用于存储对象,对象的格式为键值对 命令 设置 设置单个属性 HSET key field value 设置多个属性 HMSET key field value [ ...

  10. Redis字符串操作

      字符串命令 (基本用法) GET : 获取给定键的值 SET : 设置给定键的值 DEL : 删除给定键的值(这个命令可以用于任何类型) (自增命令和自减命令) INCR : INCR key-n ...

随机推荐

  1. 第10.4节 Python模块的弱封装机制

    一. 引言 Python模块可以为调用者提供模块内成员的访问和调用,但某些情况下, 因为某些成员可能有特殊访问规则等原因,并不适合将模块内所有成员都提供给调用者访问,此时模块可以类似类的封装机制类似的 ...

  2. PyQt(Python+Qt)学习随笔:QListWidget删除项的takeItem方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 takeItem方法从QListWidget列表部件的项中删除指定项,并返回对应项对象.调用语法如下 ...

  3. python安装Scrapy框架

    看到自己写的惨不忍睹的爬虫,觉得还是学一下Scrapy框架,停止一直造轮子的行为 我这里是windows10平台,python2和python3共存,这里就写python2.7安装配置Scrapy框架 ...

  4. WinForm 加载大数据时不闪烁的ListView

    自己之前做小工具的时候,遇到这个问题,记录一下... namespace 相册处理 { //将ListView重载为此新类,解决加载过程中闪烁的问题 //在designer.cs中改写: //priv ...

  5. Day2 【Scrum 冲刺博客】

    每日会议总结 昨天已完成的工作 方晓莹(PIPIYing) 新增人员管理页面的开发 静态页面的进一步完善 方子茵(Laa-L) 完成车辆查询接口 黄芯悦(Sheaxx) 新增社区通知页面 新增社区活动 ...

  6. angular 双向数据绑定与vue数据的双向数据绑定

    二者都是 MVVM 模式开发的典型代表 angular 是通过脏检测实现,angular 会将 UI 事件,请求事件,settimeout 这类延迟的对象放入到事件监测的脏队列,当数据变化的时候,触发 ...

  7. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  8. AcWing 407. 稳定的牛分配

    大型补档计划 题目链接 题目看的有点晕(语文差) 总体来说就是让每头牛找个谷仓,不能超过容量,最小化每头牛在的谷仓在自己心目中排名的极差. 显然这个最优性问题不好做,但是转换为判定性问题这就是一个标准 ...

  9. 「 洛谷 」P2768 珍珠项链

    珍珠项链 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 题目来源 「 洛谷 」P2768 珍珠项链 ...

  10. Qingcloud_MySQL Plus(Xenon) 高可用搭建实验

    实验:Xenon on 5.7.30 Xenon (MySQL Plus) 是青云Qingcloud的一个开源项目,号称金融级别强一致性的高可用解决方案,项目地址为 https://github.co ...