zoukankan      html  css  js  c++  java
  • Redis4.0 之持久化存储

    redis如果提供缓存服务,可以关闭所有持久化存储,如此一来redis重启后所有数据会丢失 
    开启rdb或aof持久化存储,能把redis中的数据持久化到磁盘中。 
    rdb和aof对性能都有影响,所以建议持久化的操作在从库上进行

    Redis的rdb存储方式,使用save配置开启rdb存储或者关闭rdb存储

    # 默认情况下rdb持久化存储是开启的
    [root@redis01 ~]# redis-cli -h 127.0.0.1 config set save ""  # 关闭rdb存储
    OK
    [root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite  # 保存配置
    OK
    [root@redis01 ~]# redis-cli -h 127.0.0.1 config set save "180 1 120 10 60 10000"  # 开启rdb
    OK
    [root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite  # 保存配置
    OK

    进行数据写入 , 观察rdb存储日志

    # 输入一万条数据
    [root@redis01 ~]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done 
    # 查看日志
    [root@redis01 ~]# tail -5 /data/redis/redis.log 
    54721:M 08 Oct 18:43:39.026 * 10000 changes in 60 seconds. Saving...  # 60秒内发生了一万条数据变化,出发rdb存储
    54721:M 08 Oct 18:43:39.027 * Background saving started by pid 85432
    85432:C 08 Oct 18:43:39.032 * DB saved on disk
    85432:C 08 Oct 18:43:39.033 * RDB: 0 MB of memory used by copy-on-write
    54721:M 08 Oct 18:43:39.127 * Background saving terminated with success

    Redis也提供了bgsave命令能够立刻出发rdb存储

    [root@redis01 ~]# redis-cli save  # 会阻塞前端客户数据写入
    OK
    [root@redis01 ~]# redis-cli bgsave  # 后台启动新进程进行rdb存储
    Background saving started
    [root@redis01 ~]# tail -5 /data/redis/redis.log 
    54721:M 08 Oct 18:46:44.263 * DB saved on disk  # save触发rdb存储
    54721:M 08 Oct 18:47:02.738 * Background saving started by pid 85602  # bgsave触发的rdb存储
    85602:C 08 Oct 18:47:02.744 * DB saved on disk
    85602:C 08 Oct 18:47:02.744 * RDB: 0 MB of memory used by copy-on-write
    54721:M 08 Oct 18:47:02.835 * Background saving terminated with success

    Redis的AOF存储方式

    aof持久化存储会把用户每次的操作都记录到文件中

    # 动态开启和关闭aof
    [root@redis01 ~]# redis-cli -h 127.0.0.1 config set appendonly yes  # 开启aof
    OK
    [root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite
    OK
    [root@redis01 ~]# redis-cli -h 127.0.0.1 config set appendonly no  # 关闭aof
    OK
    [root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite
    OK

    写入数据, 查看aof文件

    [root@redis01 ~]# cd /data/redis/
    [root@redis01 redis]# ls
    appendonly.aof  dump.rdb  redis.log  redis.pid
    [root@redis01 redis]# du -sh appendonly.aof 
    460K    appendonly.aof
    [root@redis01 redis]# du -sh dump.rdb 
    236K    dump.rdb
    # 写入数据
    [root@redis01 redis]# for line in `seq -w 100`;do redis-cli set key_${line} value1_${line};done
    # 查看aof和rdb文件大小
    [root@redis01 redis]# du -sh appendonly.aof 
    960K    appendonly.aof
    [root@redis01 redis]# du -sh dump.rdb 
    236K    dump.rdb

    重写aof文件 , 整理相同的key , 写入最后的有效值

    执行AOF文件重写操作会重新创建一个当前AOF文件的体积优化版本
    即使BGREWRITEAOF执行失败,也不会有任何数据丢失,因为旧的AOF文件在BGREWRITEAOF成功之前不会被修改
    重写操作只会在没有其他持久化工作在后台执行时被触发
    从Redis2.4开始,AOF重写由Redis自行触发,BGREWRITEAOF仅仅用于手动触发重写操作

    [root@redis01 redis]# > appendonly.aof   # 清空aof文件
    [root@redis01 redis]# ll
    总用量 252
    -rw-r--r--. 1 root root      0 10月  8 19:00 appendonly.aof
    -rw-r--r--. 1 root root 242163 10月  8 18:59 dump.rdb
    -rw-r--r--. 1 root root   5654 10月  8 18:59 redis.log
    -rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid
    [root@redis01 redis]# redis-cli bgrewriteaof  # 手动触发aof重写
    Background append only file rewriting started
    [root@redis01 redis]# ll
    总用量 716
    -rw-r--r--. 1 root root 474323 10月  8 19:00 appendonly.aof  # redis里的所有数据会被重新写入aof
    -rw-r--r--. 1 root root 242163 10月  8 18:59 dump.rdb
    -rw-r--r--. 1 root root   6395 10月  8 19:00 redis.log
    -rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid
    [root@redis01 redis]# > appendonly.aof 
    [root@redis01 redis]# ll
    总用量 252
    -rw-r--r--. 1 root root      0 10月  8 19:01 appendonly.aof
    -rw-r--r--. 1 root root 242163 10月  8 18:59 dump.rdb
    -rw-r--r--. 1 root root   6395 10月  8 19:00 redis.log
    -rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid
    [root@redis01 redis]# redis-cli set weihan mingming
    OK
    [root@redis01 redis]# ll
    总用量 256
    -rw-r--r--. 1 root root     39 10月  8 19:01 appendonly.aof
    -rw-r--r--. 1 root root 242163 10月  8 18:59 dump.rdb
    -rw-r--r--. 1 root root   6395 10月  8 19:00 redis.log
    -rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid
    [root@redis01 redis]# cat appendonly.aof 
    *3
    $3
    set
    $6
    weihan
    $8
    mingming
    [root@redis01 redis]# redis-cli del weihan mingming
    (integer) 1
    [root@redis01 redis]# cat appendonly.aof 
    *3
    $3
    set
    $6
    weihan
    $8
    mingming
    *3
    $3
    del
    $6
    weihan
    $8
    mingming
    [root@redis01 redis]# ll
    总用量 256
    -rw-r--r--. 1 root root     78 10月  8 19:03 appendonly.aof
    -rw-r--r--. 1 root root 242180 10月  8 19:02 dump.rdb
    -rw-r--r--. 1 root root   6721 10月  8 19:02 redis.log
    -rw-r--r--. 1 root root      6 10月  8 16:08 redis.pid

    我们向redis添加了一个key,又删除了这个key,redis数据库从本质上来说并没有新增任何数据 但是aof文件仍旧把操作都给记录了 这样就会导致aof文件最终会非常大,所以aof文件的优化,就是让aof文件进行重写,只记录数据的增量部分 如此aof文件就小很多了

    aof配置自动rewrite机制

    [root@redis01 redis]# cd /usr/local/redis/conf/
    [root@redis01 conf]# vim redis.conf
    auto-aof-rewrite-percentage 100 # 默认100%,也就是aof增加一倍后考虑rewrite,两个条件要同时满足
    auto-aof-rewrite-min-size 64mb  # 默认64mb,也就是aof达到64M后考虑rewirte,两个条件要同时满足
    # 获取aof-rewrite配置
    [root@redis01 conf]# redis-cli config get auto-aof-rewrite*
    1) "auto-aof-rewrite-percentage"
    2) "100"
    3) "auto-aof-rewrite-min-size"
    4) "67108864"
    # 进行aof自动重写
    [root@redis01 conf]# redis-cli config set auto-aof-rewrite-min-size 100000
    OK
    [root@redis01 conf]# redis-cli config get auto-aof-rewrite*
    1) "auto-aof-rewrite-percentage"
    2) "100"
    3) "auto-aof-rewrite-min-size"
    4) "100000"
    [root@redis01 conf]# redis-cli config rewrite
    OK
    [root@redis01 conf]# cd /data/redis/
    [root@redis01 redis]# > appendonly.aof 
    [root@redis01 redis]# du -sh appendonly.aof 
    0K    appendonly.aof
    [root@redis01 redis]# for line in `seq -w 1000`;do redis-cli set key2_${line} value2_${line};done
    [root@redis01 redis]# du -sh appendonly.aof 
    48K    appendonly.aof
    [root@redis01 redis]# for line in `seq -w 1000`;do redis-cli set key2_${line} value2_${line};done
    [root@redis01 redis]# du -sh appendonly.aof 
    128K    appendonly.aof
    [root@redis01 redis]# du -sh appendonly.aof 
    92K    appendonly.aof    # 自动触发了aof重写机制

    Redis的删除算法

    # Redis的键值设置有效期 , 过期自动删除
    redis-cli flushall命令 # 手动清空redis里所有数据 [root@redis01 redis]# redis-cli set name weihan OK [root@redis01 redis]# redis-cli ttl name (integer) -1  # -1代表key永不过期 [root@redis01 redis]# redis-cli expire name 10  # 设定key过期时间为10s (integer) 1 [root@redis01 redis]# redis-cli ttl name  # 查看key剩余的存活时间 (integer) 9 [root@redis01 redis]# redis-cli ttl name (integer) 7 [root@redis01 redis]# redis-cli ttl name (integer) 5 [root@redis01 redis]# redis-cli ttl name (integer) 3 [root@redis01 redis]# redis-cli ttl name (integer) 1 [root@redis01 redis]# redis-cli ttl name (integer) -2 [root@redis01 redis]# redis-cli get name  # key已经因为过期被删除 (nil)

    Redis的最大内存设置

    [root@redis01 redis]# redis-cli config get maxmemory
    1) "maxmemory"
    2) "0"          # 默认对内存无限制
    [root@redis01 redis]# redis-cli config set maxmemory 1M  # 设置限制为1M
    OK
    [root@redis01 redis]# redis-cli config get maxmemory
    1) "maxmemory"
    2) "1000000"

    Redis的内存清理算法

    volatile-lru : 使用LRU算法删除键(key需要设置过期时间)

    volatile-random : 随机删除键(key需要设置过期时间)

    volatile-ttl : 删除ttl最小的键(key需要设置过期时间)

    allkeys-lru : 使用LRU算法删除键(所有key)

    allkeys-random : 随机删除键(所有key)

    noeviction : 不进行任何的操作,只返回错误,默认

    [root@redis01 redis]# redis-cli config get maxmemory-policy
    1) "maxmemory-policy"
    2) "noeviction"            # 默认算法
    # 模拟内存溢出
    [root@redis01 redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value_${line};done
    [root@redis01 redis]# redis-cli set name weihan
    (error) OOM command not allowed when used memory > 'maxmemory'.
    [root@redis01 redis]# redis-cli 
    127.0.0.1:6379> set name weihan
    (error) OOM command not allowed when used memory > 'maxmemory'.        # 测试会报错

    设置删除算法

    # 将删除算法设置为volatile-lru
    [root@redis01 redis]# redis-cli config get maxmemory-policy
    1) "maxmemory-policy"
    2) "noeviction"
    [root@redis01 redis]# redis-cli config set maxmemory-policy volatile-lru
    OK
    [root@redis01 redis]# redis-cli config get maxmemory-policy
    1) "maxmemory-policy"
    2) "volatile-lru"
    [root@redis01 redis]# redis-cli config rewrite
    OK
    [root@redis01 redis]# redis-cli get key_00111
    "value1_00111"
    [root@redis01 redis]# redis-cli expire key_00111 3600
    (integer) 1
    [root@redis01 redis]# redis-cli ttl key_00111 
    (integer) -2
    [root@redis01 redis]# redis-cli get key_00111
    (nil)
    # 测试发现 volatile-lru算法可以实现当内存达到了预设的最大值后,会优先删除有过期时间的key

    Redis禁用屏蔽危险命令

    FLUSHALL和FLUSHDB会清除redis的数据,比较危险 
    KEYS在键过多的时候使用会阻塞业务请求

    # 配置代码如下, 写入配置文件即可,此配置无法平滑更新
    [root@redis01 redis]# vim /usr/local/redis/conf/redis.conf
    rename-command  FLUSHALL "" # 将命令改名成空
    rename-command  FLUSHDB ""  # 将命令改名成空
    rename-command  KEYS ""     # 将命令改名成空
    [root@redis01 redis]# redis-cli shutdown
    [root@redis01 redis]# redis-server /usr/local/redis/conf/redis.conf
    [root@redis01 redis]# redis-cli flushall
    (error) ERR unknown command 'flushall'
    [root@redis01 redis]# redis-cli flushdb
    (error) ERR unknown command 'flushdb'
    [root@redis01 redis]# redis-cli 
    127.0.0.1:6379> keys *
    (error) ERR unknown command 'keys'
  • 相关阅读:
    转载《XAMPP安装和使用教程》(转)
    EA经典教程(转)
    something to note
    XAMPP安装说明及操作指南 (转)
    Use vCard Objects in RDF/XML (转)
    word2007的相关操作如删除标记区等 及firefox 修改颜色
    jsp和servlet重定向
    HowToMakeCustomSearch
    关于树型dropdownlist的绑定
    在ASP.NET中显示进度条
  • 原文地址:https://www.cnblogs.com/bigdevilking/p/9757094.html
Copyright © 2011-2022 走看看