• RedisⅡ


    7.redis发布订阅

    - SUBSCRIBE music asmr rap(订阅频道)
    - PUBLISH rap 70%(指定频道发布消息)
    - PSUBSCRIBE python*(模糊)
    

    8.redis数据持久化

    - 内存型数据库,断电数据消失,进程挂掉数据也消失
    - 配置数据持久化的规则,让数据以文件形式存储在磁盘上
    
    • RDB方式
    生成一个rdb方式存储数据的配置文件
    - touch s22-rdb-redis.conf
    打开配置文件并写入如下参数
    - vim s22-rdb-redis.conf
    ######################## RDB方式参数 ########################
    daemonize yes
    port 6379   #可以修改,连接的时候指定端口
    logfile /data/6379/redis.log	#日志文件存放目录
    dir /data/6379              	#定义持久化文件存储位置
    dbfilename  s22dbmp.rdb     	#rdb持久化文件
    bind 127.0.0.1              	#redis绑定地址
    #requirepass redhat           #redis登录密码
    save 900 1                    #rdb机制 每900秒 有1个修改记录
    save 300 10                   #每300秒         10个修改记录
    save 60  10000                #每60秒内        10000修改记录
    ######################## RDB方式参数 ########################
    
    创建配置文件指定的文件夹
    - mkdir -p /data/6379
    
    指定rdb方式的配置文件启动服务端
    - redis-server s22-rdb-redis.conf
    启动客户端             redis-cli
    手动持久化保存数据      save
    
    • AOF方式
    生成一个aof方式存储数据的配置文件
    - vim s22-aof-redis.conf
    写入如下参数
    ######################## AOF方式参数 ########################
    daemonize yes
    port 6379
    logfile /data/6379/redis.log
    dir /data/6379
    #dbfilename  dbmp.rdb
    #requirepass redhat
    #save 900 1
    #save 300 10
    #save 60  10000
    appendonly yes
    appendfsync everysec    #每秒钟记录一次修改类的操作
    ######################## AOF方式参数 ########################
    - redis-server s22-aof-redis.conf
    - redis-cli
    
    实时查看appendonly.aof文件的记录情况
    - tail -f appendonly.aof
    

    9.redis主从同步

    主库-可读可写
    从库-复制主库的数据
    
    redis支持多实例,一台机器上,通过不同的端口,不同的配置文件,运行多个单独的数据库
    
    • 创建多个配置文件 (仅仅是端口的区别, 多个不同文件快速修改同一处内容的方法见最后的知识点补充)
    - vim redis-6379.conf   #添加如下配置
    ########### 6379 ###########
    port 6379
    daemonize yes
    pidfile /data/6379/redis.pid
    loglevel notice
    logfile "/data/6379/redis.log"
    dbfilename dump.rdb
    dir /data/6379
    #protected-mode no
    ########### 6379 ###########
    
    - vim redis-6380.conf   #添加如下配置
    ########### 6380 ###########
    port 6380
    daemonize yes
    pidfile /data/6380/redis.pid
    loglevel notice
    logfile "/data/6380/redis.log"
    dbfilename dump.rdb
    dir /data/6380
    #protected-mode no
    ########### 6380 ###########
    
    - vim redis-6381.conf   #添加如下配置
    ########### 6381 ###########
    port 6381
    daemonize yes
    pidfile /data/6381/redis.pid
    loglevel notice
    logfile "/data/6381/redis.log"
    dbfilename dump.rdb
    dir /data/6381
    #protected-mode no
    ########### 6381 ###########
    
    创建配置文件指定的文件夹
    - mkdir -p /data/{6379,6380,6381}
    
    • 创建主从关系, 模拟主库故障
    启动3个redis
    - redis-server redis-6379.conf
    - redis-server redis-6380.conf
    - redis-server redis-6381.conf
    
    通过命令创建主从的关系(slaveof ip port)
    - slaveof 127.0.0.1 6379
    
    通过命令查看身份
    - info replication
    - redis-cli -p 6380 info replication
    
    主从身份创建好后,从库就有了主库的数据,但不能写入!
    
    手动模拟主库故障,并进行主从切换
    - 将主库进程杀死
        - ps -ef|grep redis
        - kill 52932
    - 从库解除奴隶身份
        - slaveof no one
    - 另一个从库更换主人
        - slaveof 127.0.0.1 6381
    

    10.redis哨兵

    • 环境准备 : 三台redis, 一主两从
    redis-6379.conf
    redis-6380.conf
    redis-6381.conf
    6380和6381的配置文件里写上: slaveof 127.0.0.1 6379
    
    • 准备三个哨兵, 监测主库 (三个配置文件仅仅是端口的不同)
    redis-26379.conf
    redis-26380.conf
    redis-26381.conf
    
    ############### 哨兵配置文件 ###############
    # Sentinel节点的端口
    port 26379  
    dir /data/sentinel/
    logfile "26379.log"
    
    # 当前Sentinel节点监控 127.0.0.1:6379 这个主节点(redis起在0.0.0.0)
    # 2代表判断主节点失败至少需要2个Sentinel节点节点同意
    # mymaster是主节点的别名
    sentinel monitor mymaster 127.0.0.1 6379 2
    
    # 每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达
    sentinel down-after-milliseconds mymaster 30000
    
    # 当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
    sentinel parallel-syncs mymaster 1
    
    # 故障转移超时时间为180000毫秒
    sentinel failover-timeout mymaster 180000
    
    # 后台运行
    daemonize yes
    ############### 哨兵配置文件 ###############
    
    创建哨兵配置文件里指定的文件夹
    - mkdir -p /data/sentinel/
    
    • 启动哨兵, 模拟主库故障
    启动
    - redis-sentinel redis-26379.conf
    - redis-sentinel redis-26380.conf
    - redis-sentinel redis-26381.conf
        
    手动杀死主库
    - kill -9 19380
    
    通过命令查看从库身份
    - redis-cli -p 6380 info replication
    - redis-cli -p 6381 info replication
    
    制定的时间到了后,从库身份自动发生变化!
    
    原先的主库重启后,身份变为slave...
    

    11.redis-cluster集群搭建

    • 准备6个节点,用于搭建集群 (六个配置文件,仅仅是端口的不同)
    redis-7000.conf
    redis-7001.conf
    redis-7002.conf
    redis-7003.conf
    redis-7004.conf
    redis-7005.conf
    
    ########## redis集群配置文件 ##########
    port 7000
    daemonize yes
    dir "/data/cluster"
    logfile "7000.log"
    dbfilename "dump-7000.rdb"
    cluster-enabled yes                 #开启集群模式
    cluster-config-file nodes-7000.conf #集群内部的配置文件
    cluster-require-full-coverage no  #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
    ########## redis集群配置文件 ##########
    
    创建配置文件指定的数据文件夹
    - mkdir -p /data/cluster
    
    • 尝试进入集群进行操作
    进入集群直接写入数据,报错 
    [root@localhost redis-cluster]#redis-cli -c -p 7000
    127.0.0.1:7000> set name tom
    (error) CLUSTERDOWN Hash slot not served
    
    - 集群创建好,相当于马车已经到位了,但是车上的箩筐没有,货物没地方摆放
    - 下一步应该分配槽位了
    
    • 分配槽位, 开启集群
    安装ruby
    - yum install ruby -y
    安装操作ruby的模块
    - wget http://rubygems.org/downloads/redis-3.3.0.gem
    通过包管理工具安装
    - gem install -l redis-3.3.0.gem
    
    全局搜索以下命令
    [root@localhost redis-cluster]#find / -name "redis-trib.rb"
    /opt/redis-4.0.10/src/redis-trib.rb
    
    ruby命令一键开启redis-cluster集群
    - 上述命令 + "create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005"
    
    [root@localhost redis-cluster]#/opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    
    • 再次进入集群写入数据,成功!
    [root@localhost redis-cluster]#redis-cli -c -p 7000
    127.0.0.1:7000> set msg "oh my god"
    -> Redirected to slot [6257] located at 127.0.0.1:7001  #放入6257槽位(归属7001)
    OK
    127.0.0.1:7001>     #自动重定向到7001马车
    #发现在7000马车上找不到刚刚写入的数据,但由于是一个集群,你get取数据,就会自动重定向到数据所在的马车!也就是说在哪个马车上都可以获取到数据了!
    [root@localhost redis-cluster]#redis-cli -c -p 7000
    127.0.0.1:7000> keys *
    (empty list or set)
    127.0.0.1:7000> get msg
    -> Redirected to slot [6257] located at 127.0.0.1:7001
    "oh my god"
    127.0.0.1:7001>     #自动重定向到7001马车
    

    知识点补充:

    主库身份信息

    [root@localhost redis-master-slave]#redis-cli -p 6379 info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=127.0.0.1,port=6380,state=online,offset=280,lag=0
    slave1:ip=127.0.0.1,port=6381,state=online,offset=280,lag=0
    master_replid:ffd8eabfda7806daf0c69da7c93cfde8e362c98b
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:280
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:280
    

    多个不同文件修改一个内容

    sed "s/被替换内容/替换内容/g" 旧文件 > 新文件  (s替换模式 g全局修改 >重定向到新文件)
    
    sed "s/26379/26380/g" redis-26379.conf > redis-26380.conf
    

    启动哨兵后查看进程

     [root@localhost redis-master-slave]#ps -ef|grep redis
     root      19380      1  0 09:00 ?        00:00:03 redis-server *:6379
     root      19385      1  0 09:00 ?        00:00:03 redis-server *:6380
     root      19391      1  0 09:00 ?        00:00:03 redis-server *:6381
     root      20072      1  0 09:30 ?        00:00:00 redis-sentinel *:26379 [sentinel]
     root      20077      1  0 09:30 ?        00:00:00 redis-sentinel *:26380 [sentinel]
     root      20082      1  0 09:30 ?        00:00:00 redis-sentinel *:26381 [sentinel]
     root      20096  13538  0 09:32 pts/0    00:00:00 grep --color=auto redis
     
     #[sentinel]为哨兵标识
    

    启动redis集群文件查看进程

    [root@localhost redis-cluster]#ps -ef|grep redis
    root      21316      1  0 10:35 ?        00:00:00 redis-server *:7000 [cluster]
    root      21321      1  0 10:35 ?        00:00:00 redis-server *:7001 [cluster]
    root      21326      1  0 10:35 ?        00:00:00 redis-server *:7002 [cluster]
    root      21331      1  0 10:35 ?        00:00:00 redis-server *:7003 [cluster]
    root      21336      1  0 10:35 ?        00:00:00 redis-server *:7004 [cluster]
    root      21341      1  0 10:35 ?        00:00:00 redis-server *:7005 [cluster]
    root      21346  13538  0 10:35 pts/0    00:00:00 grep --color=auto redis
    
    #[cluster]为集群标识
    
  • 相关阅读:
    基本类型数组与包装类型数组相互转换
    (转载)JVM中的内存模型与垃圾回收
    Python之threading多线程
    Python之基于socket和select模块实现IO多路复用
    Python之利用socketserver实现并发
    Python的网络编程socket模块
    Python设计模式之一(单例模式)
    Python异常处理
    Python面向对象之常用的特殊方法(5)
    Python面向对象之私有方法(4)
  • 原文地址:https://www.cnblogs.com/straightup/p/13856495.html
Copyright © 2020-2023  润新知