zoukankan      html  css  js  c++  java
  • 四十一.redis主从复制 RDB/AOF持久化 数据类型

    把redis集群里的主机 恢复为独立的redis服务器(51-58)
    ]# redis-cli  -h 192.168.4.51 -p 6351 shutdown
    ]# rm -rf /var/lib/redis/6379/*
    ]# vim /etc/redis/6379.conf  (把与集群配置相关的 3项 注释)
    ]# /etc/init.d/redis_6379 start
    ]# netstat -utnlp  | grep redis-server
     
    1. Redis主从复制
    将主机192.168.4.51作为主库
    将主机192.168.4.52作为从库
    测试配置
     
    命令行指定主库 > slaveof 主库ip 端口
    命令行把从库恢复为主库 > slaveof no one
     
    带密码的主库库设置
    主库配置:
    541 ~]# vim /etc/redis/6379.conf
    requirepass 123456
    ...
    从库配置
    52 ~]# sed -n '282p;289p' /etc/redis/6379.conf 
    slaveof  192.168.4.51 6351 主库ip及端口
    masterauth 123456 主库密码
     
    哨兵服务配置文件
    主库宕机后,从库自动升级为主库
    在slave主机编辑sentinel.conf文件
    在slave主机运行哨兵程序
     
    52 redis-4.0.8]# cat /etc/sentinel.conf
    bind 0.0.0.0
    sentinel monitor redis51 192.168.4.51 6351 1
    sentinel auth-pass redis51 123456
     
    启动哨兵服务
    52 ~]# redis-sentinel /etc/sentinel.conf
    新开52窗口,查看效果:
     
    检测:
    51宕机
    ]# redis-cli -h 192.168.4.51 -p 6351 shutdown
    观看原52窗口动态变化
    新52窗口查询
    192.168.4.52:6352> info replication(主库,没有从库)
    51开机
    ]# /etc/init.d/redis_6379 start 
    Starting Redis server...
    新52窗口查询
    192.168.4.52:6352> info replication(主库,51为其从库))
     
    2.Redis数据类型
     
    数据管理命令:
    string类型
    set get strlen setrange getrange
    append incr incrby incrbyfloat decr decrby mget mset setbit bitcount 
    LIST表
    lpush llen lrange lset lpop lindex rpop rpush
    Hash表
    hset hget hmget hmset hgetall hkeys hvals hdel
     
    2.1 String字符串
    set key value [ex seconds] [px milliseconds] [nx|xx]
    设置key及值,过期时间可以使用秒或毫秒为单位
    setrange key offset value
    从偏移量开始复写key的特定位的值
     
    192.168.4.52:6352> set first "hello world"
    OK
    192.168.4.52:6352> get first
    "hello world"
    192.168.4.52:6352> setrange first 6 "redis" (替换)
    (integer) 11
    192.168.4.52:6352> get first
    "hello redis"
     
    strlen key,统计字串长度
    192.168.4.52:6352> strlen first
    (integer) 11
     
    setbit key offset value 对key所存储字串,设置或清除特定偏移量上的位(bit),value值可以为1或0,offset为0~2^32之间,key不存在,则创建新key
    192.168.4.52:6352> setbit bit 0 1
    (integer) 0
    192.168.4.52:6352> setbit bit 1 0
    (integer) 0
    192.168.4.52:6352> get bit
    "x80"
     
    bitcount key 统计字串中被设置为1的比特位数量
    192.168.4.52:6352> setbit bits 0 1(0001)
    (integer) 0
    192.168.4.52:6352> setbit bits 3 1(1001)
    (integer) 0
    192.168.4.52:6352> get bits
    "x90"
    192.168.4.52:6352> bitcount bits
    (integer) 2
     
    记录网站用户上线频率,如用户A上线了多少天等类似的数据,如用户在某天上线,则使用setbit,以用户名为key,将网站上线日为offset,并在该offset上设置1,最后计算用户总上线次数时,使用bitcount用户名即可,这样即使网站运行10年,每个用户仅占用10*365比特位即456字节
    //网站上线100天用户登录了一次
    192.168.4.52:6352> setbit peter 100 1 
    (integer) 0
    //网站上线105天用户登录了一次
    192.168.4.52:6352> setbit peter 105 1
    (integer) 0
    192.168.4.52:6352>  bitcount  peter
    (integer) 2
     
    decr key 将key中的值减1,key不存在则先初始化为0,再减1
    192.168.4.52:6352> set z 10
    OK
    192.168.4.52:6352> decr z
    (integer) 9
    192.168.4.52:6352> decr z
    (integer) 8
     
    192.168.4.52:6352> decr bb
    (integer) -1
    192.168.4.52:6352> decr bb
    (integer) -2
     
    decrby key decrement 将key中的值,减去decrement
    192.168.4.52:6352> set count 100
    OK
    //定义每次减少20(步长)
    192.168.4.52:6352> DECRBY count 20
    (integer) 80
    192.168.4.52:6352> DECRBY count 20
    (integer) 60
     
    192.168.4.52:6352> DECRBY cc 20
    (integer) -20
    192.168.4.52:6352> DECRBY cc 20
    (integer) -40
     
    get key 返回key存储的字符串值,若key不存在则返回nil,若key的值不是字串,则返回错误,get只能处理字串
    192.168.4.52:6352> get a
    (nil)
     
    getrange key start end 返回字串值中的子字串,截取范围为start和end,负数偏移量表示从末尾开始计数,-1表示最后一个字符,-2表示倒数第二个字符
    192.168.4.52:6352> set x 123456789
    OK
    192.168.4.52:6352> getrange x -5 -1
    "56789"
    192.168.4.52:6352> getrange x 0 4
    "12345"
     
    incr key 将key的值加1,如果key不存在,则初始为0后再加1,主要应用为计数器
    192.168.4.52:6352> set page 20
    OK
    192.168.4.52:6352> incr page
    (integer) 21
     
    incrby key increment 将key的值增加increment
    192.168.4.52:6352> set x 10
    OK
    192.168.4.52:6352> incrby x 10
    (integer) 20
    192.168.4.52:6352> incrby x 20
    (integer) 40
     
    incrbyfloat key increment 为key中所储存的值加上浮点数增量 increment
    192.168.4.52:6352> set num 16.1
    OK
    192.168.4.52:6352> incrbyfloat num 1.1
    "17.2"
     
    mset key value [key value …] 设置多个key及值,空格分隔,具有原子性
    192.168.4.52:6352> mset j 9 k 29
    OK
    192.168.4.52:6352> get j
    "9"
    192.168.4.52:6352> get k
    "29"
     
    2.2 list列表
    Redis的list是一个字符队列,先进后出,一个key可以有多个值
    lpush key value [value…] 将一个或多个值value插入到列表key的表头,Key不存在,则创建key
    //list值依次为c b a
    192.168.4.52:6352> lpush list a b c  
    (integer) 3
    //从0位开始,读到2位为止
    192.168.4.52:6352> lrange list 0 2
    1) "c"
    2) "b"
    3) "a"
    /从开始读到结束为止
    192.168.4.52:6352> lrange list 0 -1
    1) "c"
    2) "b"
    3) "a"
    //从开始读到倒数第2位值
    192.168.4.52:6352> lrange list 0 -2 
    1) "c"
    2) "b"
     
    lpop key 移除并返回列表头元素数据,key不存在则返回nil
    192.168.4.52:6352> lpop list
    "c"
    192.168.4.52:6352> lpop list
    "b"
    192.168.4.52:6352> lpop list
    "a"
    192.168.4.52:6352> lpop list
    (nil)
     
    llen key 返回列表key的长度
    192.168.4.52:6352> llen list
    (integer) 3
     
    lindex key index 返回列表中第index个值
    192.168.4.52:6352> lindex list1 1
    "c"
     
    lset key index value 将key中index位置的值修改为value
    192.168.4.52:6352> lpush t1 a b  c d
    (integer) 4
    192.168.4.52:6352> lrange t1 0 -1
    1) "d"
    2) "c"
    3) "b"
    4) "a"
    192.168.4.52:6352> lset t1 3 test
    OK
    192.168.4.52:6352> lrange t1 0 -1
    1) "d"
    2) "c"
    3) "b"
    4) "test"
     
    rpush key value [value…] 将value插入到key的末尾
    192.168.4.52:6352>  rpush list1 a b c
    (integer) 3
    192.168.4.52:6352>  rpush list1 d 
    (integer) 4
    192.168.4.52:6352> lrange list1 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
     
    rpop key 删除并返回key末尾的值
    192.168.4.52:6352> RPOP list1
    "d"
    192.168.4.52:6352> RPOP list1
    "c"
     
    2.3 hash表
    hset key field value 将hash表中field值设置为value
    192.168.4.52:6352> hset site google 'www.g.cn'
    (integer) 1
    192.168.4.52:6352> hset site baidu 'www.baidu.com'
    (integer) 1
    192.168.4.52:6352> hget site google
    "www.g.cn"
    192.168.4.52:6352> hget site baidu
    "www.baidu.com"
     
    hmset key field value [field value…] 同时给hash表中的多个field赋值
    192.168.4.52:6352> hmset site google www.g.cn baidu www.baidu.com
    OK
     
    hmget key field [field…] 返回hash表中多个field的值
    192.168.4.52:6352> hmget site google baidu
    1) "www.g.cn"
    2) "www.baidu.com"
     
    hkeys key 返回hash表中所有field名称
    192.168.4.52:6352> hmset site google www.g.cn baidu www.baidu.com
    OK
    192.168.4.52:6352> hkeys  site
    1) "google"
    2) "baidu"
     
    hgetall key 返回hash表中所有key名和对应的值列表
    192.168.4.52:6352> hgetall site
    1) "google"
    2) "www.g.cn"
    3) "baidu"
    4) "www.baidu.com"
     
    hvals key 返回hash表中所有key的值
    192.168.4.52:6352> hvals site
    1) "www.g.cn"
    2) "www.baidu.com"
     
     
    3 使用RDB文件恢复数据
     
    要求如下:
    启用RDB
    设置存盘间隔为120秒 10个key改变存盘
    备份RDB文件
    删除数据
    使用RDB文件恢复数据
     
    RDB介绍:
    Redis数据库文件,全称Reids DataBase
    数据持久化方式之一
    在指定时间间隔内,将内存中的数据集快照写入硬盘
    术语叫Snapshot快照
    恢复时,将快照文件直接读到内存里
    相关配置参数
    文件名
    dbfilename “dump.rdb” 文件名
    save “” 禁用RDB
    数据从内存保存到硬盘的频率
    save 900 1 900秒内且有1次修改
    save 300 10 300秒内且有10次修改
    save 60 10000 60秒内且有10000修改
     
    3.1 开启
    ]# vim /etc/redis/6379.conf
    dbfilename dump.rdb
    #   save ""        //启用RDB,去掉#号为禁用RDB
    save 120 1       //120秒内且有1次修改(满足三个条件中的任意一个都会保存)
    save 300 10
    save 60 10000
    ]# /etc/init.d/redis_6379 start
    ]# redis-cli -h 192.168.4.52 -p 6352
     
    3.2 存入值
    192.168.4.52:6352> set v1 k1
    OK
    192.168.4.52:6352> set v2 k1
    OK
    192.168.4.52:6352> set v3 k1
    OK
    192.168.4.52:6352> set v4 k1
    OK
    192.168.4.52:6352> set v5 k1
    OK
    192.168.4.52:6352> set v6 k1
    OK
    192.168.4.52:6352> set v7 k1
    OK
    192.168.4.52:6352> set v8 k1
    OK
    192.168.4.52:6352> set v9 k1
    OK
    192.168.4.52:6352> set v10 k1
    OK
    192.168.4.52:6352> keys *
     1) "v2"
     2) "v7"
     3) "v1"
     4) "v10"
     5) "v6"
     6) "v5"
     7) "v8"
     8) "v9"
     9) "v4"
    10) "v3"
     
    3.3 备份数据
    ]# redis-cli -h 192.168.4.52 -p 6352 shutdown 
    ]# cd /var/lib/redis/6379/
    6379]# ls
    dump.rdb
    6379]# cp dump.rdb dump.rdb.bak
     
    3.4 删除数据
    ]# rm -rf dump.rdb
    6379]# /etc/init.d/redis_6379 start 
    Starting Redis server...
    6379]# ls
    dump.rdb  dump.rdb.bak
    ]# redis-cli -h 192.168.4.52 -p 6352
    192.168.4.52:6352> keys * (已经没有数据)
    (empty list or set)
     
    3.5 恢复数据
    ]# redis-cli -h 192.168.4.52 -p 6352 shutdown 
    6379]# mv dump.rdb.bak dump.rdb
    mv:是否覆盖"dump.rdb"? yes
    6379]# ls
    dump.rdb
    6379]# /etc/init.d/redis_6379 start 
    Starting Redis server...
    6379]# redis-cli -h 192.168.4.52 -p 6352
    192.168.4.52:6352> keys *
     1) "v6"
     2) "v3"
     3) "v9"
     4) "v1"
     5) "v5"
     6) "v8"
     7) "v2"
     8) "v4"
     9) "v7"
    10) "v10"
     
    RDB优点:
    高性能的持久化实现:创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;过程中主进程不做任何IO操作
    比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合
    RDB的缺点:
    意外宕机时,最后一次持久化的数据会丢失
     
    4.使用AOF文件恢复数据
    启用AOF
    备份AOF文件
    删除数据
    使用AOF文件恢复数据
     
    AOF介绍
    只做追加操作的文件,Append Only File
    记录redis服务所有写操作
    不断的将新的写操作,追加到文件的末尾
    使用cat命令可以查看文件内容
    参数配置
    文件名
    appendfilename "appendonly.aof" 指定文件名
    appendonly yes 启用aof ,默认no
    AOF文件记录写操作的方式
    appendfsync always 有新写操作立即记录
    appendfsync everysec 每秒记录一次
    appendfsync no 从不记录
     
    4.1 开启
    ]# redis-cli -h 192.168.4.52 -p 6352 shutdown 
    6379]# rm -rf dump.rdb
    6379]# vim /etc/redis/6379.conf(修改,不需要添加)
    appendonly yes                  //启用aof,默认no
    appendfilename "appendonly.aof" //文件名
    appendfsync everysec            //每秒记录一次
     
    4.2 查看测试
    ]# /etc/init.d/redis_6379 start 
    Starting Redis server...
    6379]# ls
    appendonly.aof  dump.rdb
    6379]# cat appendonly.aof (没东西)
    6379]# redis-cli -h 192.168.4.52 -p 6352
    插入数据
    192.168.4.52:6352> set t1 1
    OK
    192.168.4.52:6352> set t2 2
    OK
    192.168.4.52:6352> set t3 3
    OK
    查看
    ]# !cat
    cat appendonly.aof 
    *2
    $6
    SELECT
    $1
    0
    *3
    $3
    set
    $2
    t1
    $1
    1
    *3
    $3
    set
    $2
    t2
    $1
    2
    *3
    $3
    set
    $2
    t3
    $1
    3
     
    4.3 使用AOF恢复数据
    ]# cp appendonly.aof appendonly.aof.bak
    6379]# ls
    appendonly.aof  appendonly.aof.bak  dump.rdb
     
    6379]# redis-cli -h 192.168.4.52 -p 6352 shutdown 
    6379]# rm -rf appendonly.aof
     
    6379]# /etc/init.d/redis_6379 start 
    Starting Redis server...
    6379]# redis-cli -h 192.168.4.52 -p 6352 
    192.168.4.52:6352> keys * (没了)
    (empty list or set)
     
    恢复数据
    ]# mv appendonly.aof.bak appendonly.aof
    mv:是否覆盖"appendonly.aof"? y
    6379]# ls
    appendonly.aof  dump.rdb
    6379]# redis-cli -h 192.168.4.52 -p 6352 shutdown 
    6379]# /etc/init.d/redis_6379 start 
    Starting Redis server...
    6379]# redis-cli -h 192.168.4.52 -p 6352 
    192.168.4.52:6352> keys *
    1) "t1"
    2) "t3"
    3) "t2"
     
    修复AOF文件,把文件恢复到最后一次的正确操作
    ]# vim appendonly.aof 
    *2        //可以把这一行删除
    $6
    ...
    ]# redis-check-aof --fix appendonly.aof
    ...
    Continue? [y/N]: y
    Successfully truncated AOF
     
    AOF优点:
    可以灵活的设置同步持久化appendfsync always或异步持久化appendfsync verysec
    宕机时,仅可能丢失1秒的数据
    RDB的缺点:
    AOF文件的体积通常会大于RDB文件的体积
    执行fsync策略时的速度可能会比RDB慢
  • 相关阅读:
    SQL 统计两个表的数据,按同一日期分组
    SQL 隐藏手机号中间四位
    SVN本地代码未提交而被覆盖
    [转]VS2012 快捷键
    IE8下String的Trim()方法失效的解决方案
    IE8下导入EXCEL数据传到客户端以附件下载
    jenkins插件
    OJ练习28——T118 Pascal's Triangle
    OJ练习27——T112 Path Sum
    OJ练习26——T111 Minimum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/luwei0915/p/10494262.html
Copyright © 2011-2022 走看看