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

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

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

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

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

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

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

Redis的AOF存储方式

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

  1. # 动态开启和关闭aof
  2. [root@redis01 ~]# redis-cli -h 127.0.0.1 config set appendonly yes  # 开启aof
  3. OK
  4. [root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite
  5. OK
  6. [root@redis01 ~]# redis-cli -h 127.0.0.1 config set appendonly no  # 关闭aof
  7. OK
  8. [root@redis01 ~]# redis-cli -h 127.0.0.1 config rewrite
  9. OK

写入数据, 查看aof文件

  1. [root@redis01 ~]# cd /data/redis/
  2. [root@redis01 redis]# ls
  3. appendonly.aof dump.rdb redis.log redis.pid
  4. [root@redis01 redis]# du -sh appendonly.aof
  5. 460K appendonly.aof
  6. [root@redis01 redis]# du -sh dump.rdb
  7. 236K dump.rdb
  8. # 写入数据
  9. [root@redis01 redis]# for line in `seq -w `;do redis-cli set key_${line} value1_${line};done
  10. # 查看aof和rdb文件大小
  11. [root@redis01 redis]# du -sh appendonly.aof
  12. 960K appendonly.aof
  13. [root@redis01 redis]# du -sh dump.rdb
  14. 236K dump.rdb

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

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

  1. [root@redis01 redis]# > appendonly.aof   # 清空aof文件
  2. [root@redis01 redis]# ll
  3. 总用量
  4. -rw-r--r--. root root 10 : appendonly.aof
  5. -rw-r--r--. root root 10 : dump.rdb
  6. -rw-r--r--. root root 10 : redis.log
  7. -rw-r--r--. root root 10 : redis.pid
  8. [root@redis01 redis]# redis-cli bgrewriteaof  # 手动触发aof重写
  9. Background append only file rewriting started
  10. [root@redis01 redis]# ll
  11. 总用量
  12. -rw-r--r--. root root 10 : appendonly.aof  # redis里的所有数据会被重新写入aof
  13. -rw-r--r--. root root 10 : dump.rdb
  14. -rw-r--r--. root root 10 : redis.log
  15. -rw-r--r--. root root 10 : redis.pid
  16. [root@redis01 redis]# > appendonly.aof
  17. [root@redis01 redis]# ll
  18. 总用量
  19. -rw-r--r--. root root 10 : appendonly.aof
  20. -rw-r--r--. root root 10 : dump.rdb
  21. -rw-r--r--. root root 10 : redis.log
  22. -rw-r--r--. root root 10 : redis.pid
  23. [root@redis01 redis]# redis-cli set weihan mingming
  24. OK
  25. [root@redis01 redis]# ll
  26. 总用量
  27. -rw-r--r--. root root 10 : appendonly.aof
  28. -rw-r--r--. root root 10 : dump.rdb
  29. -rw-r--r--. root root 10 : redis.log
  30. -rw-r--r--. root root 10 : redis.pid
  31. [root@redis01 redis]# cat appendonly.aof
  32. *
  33. $
  34. set
  35. $
  36. weihan
  37. $
  38. mingming
  39. [root@redis01 redis]# redis-cli del weihan mingming
  40. (integer)
  41. [root@redis01 redis]# cat appendonly.aof
  42. *
  43. $
  44. set
  45. $
  46. weihan
  47. $
  48. mingming
  49. *
  50. $
  51. del
  52. $
  53. weihan
  54. $
  55. mingming
  56. [root@redis01 redis]# ll
  57. 总用量
  58. -rw-r--r--. root root 10 : appendonly.aof
  59. -rw-r--r--. root root 10 : dump.rdb
  60. -rw-r--r--. root root 10 : redis.log
  61. -rw-r--r--. root root 10 : redis.pid

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

aof配置自动rewrite机制

  1. [root@redis01 redis]# cd /usr/local/redis/conf/
  2. [root@redis01 conf]# vim redis.conf
  3. auto-aof-rewrite-percentage # 默认100%,也就是aof增加一倍后考虑rewrite,两个条件要同时满足
  4. auto-aof-rewrite-min-size 64mb # 默认64mb,也就是aof达到64M后考虑rewirte,两个条件要同时满足
  5. # 获取aof-rewrite配置
  6. [root@redis01 conf]# redis-cli config get auto-aof-rewrite*
  7. ) "auto-aof-rewrite-percentage"
  8. ) ""
  9. ) "auto-aof-rewrite-min-size"
  10. ) ""
  11. # 进行aof自动重写
  12. [root@redis01 conf]# redis-cli config set auto-aof-rewrite-min-size
  13. OK
  14. [root@redis01 conf]# redis-cli config get auto-aof-rewrite*
  15. ) "auto-aof-rewrite-percentage"
  16. ) ""
  17. ) "auto-aof-rewrite-min-size"
  18. ) ""
  19. [root@redis01 conf]# redis-cli config rewrite
  20. OK
  21. [root@redis01 conf]# cd /data/redis/
  22. [root@redis01 redis]# > appendonly.aof
  23. [root@redis01 redis]# du -sh appendonly.aof
  24. 0K appendonly.aof
  25. [root@redis01 redis]# for line in `seq -w `;do redis-cli set key2_${line} value2_${line};done
  26. [root@redis01 redis]# du -sh appendonly.aof
  27. 48K appendonly.aof
  28. [root@redis01 redis]# for line in `seq -w `;do redis-cli set key2_${line} value2_${line};done
  29. [root@redis01 redis]# du -sh appendonly.aof
  30. 128K appendonly.aof
  31. [root@redis01 redis]# du -sh appendonly.aof
  32. 92K appendonly.aof # 自动触发了aof重写机制

Redis的删除算法

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

Redis的最大内存设置

  1. [root@redis01 redis]# redis-cli config get maxmemory
  2. ) "maxmemory"
  3. ) ""   # 默认对内存无限制
  4. [root@redis01 redis]# redis-cli config set maxmemory 1M  # 设置限制为1M
  5. OK
  6. [root@redis01 redis]# redis-cli config get maxmemory
  7. ) "maxmemory"
  8. ) ""

Redis的内存清理算法

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

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

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

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

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

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

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

设置删除算法

  1. # 将删除算法设置为volatile-lru
  2. [root@redis01 redis]# redis-cli config get maxmemory-policy
  3. ) "maxmemory-policy"
  4. ) "noeviction"
  5. [root@redis01 redis]# redis-cli config set maxmemory-policy volatile-lru
  6. OK
  7. [root@redis01 redis]# redis-cli config get maxmemory-policy
  8. ) "maxmemory-policy"
  9. ) "volatile-lru"
  10. [root@redis01 redis]# redis-cli config rewrite
  11. OK
  12. [root@redis01 redis]# redis-cli get key_00111
  13. "value1_00111"
  14. [root@redis01 redis]# redis-cli expire key_00111
  15. (integer)
  16. [root@redis01 redis]# redis-cli ttl key_00111
  17. (integer) -
  18. [root@redis01 redis]# redis-cli get key_00111
  19. (nil)
    # 测试发现 volatile-lru算法可以实现当内存达到了预设的最大值后,会优先删除有过期时间的key

Redis禁用屏蔽危险命令

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

  1. # 配置代码如下, 写入配置文件即可,此配置无法平滑更新
  2. [root@redis01 redis]# vim /usr/local/redis/conf/redis.conf
  3. rename-command FLUSHALL "" # 将命令改名成空
  4. rename-command FLUSHDB "" # 将命令改名成空
  5. rename-command KEYS "" # 将命令改名成空
  6. [root@redis01 redis]# redis-cli shutdown
  7. [root@redis01 redis]# redis-server /usr/local/redis/conf/redis.conf
  8. [root@redis01 redis]# redis-cli flushall
  9. (error) ERR unknown command 'flushall'
  10. [root@redis01 redis]# redis-cli flushdb
  11. (error) ERR unknown command 'flushdb'
  12. [root@redis01 redis]# redis-cli
  13. 127.0.0.1:> keys *
  14. (error) ERR unknown command 'keys'

Redis4.0 之持久化存储的更多相关文章

  1. Redis4.0之持久化存储

    一,redis概述与实验环境说明 1.1 什么是redis redis是一种内存型的NoSQL数据库,优点是快,常用来做缓存用  redis存储数据的方法是以key-value的形式  value类型 ...

  2. redis系列--redis4.0深入持久化

    前言 在之前的博文中已经详细的介绍了redis4.0基础部分,并且在memcache和redis对比中提及redis提供可靠的数据持久化方案,而memcache没有数据持久化方案,本篇博文将详细介绍r ...

  3. 自顶向下redis4.0(5)持久化

    redis4.0的持久化 目录 redis4.0的持久化 简介 正文 rdb持久化 save命令 bgsave命令 rdb定期保存数据 进程结束保存数据 aof持久化 数据缓冲区 刷新数据到磁盘 ap ...

  4. Redis4.0.0 安装及配置 (Linux — Centos7)

    本文中的两个配置文件可在这里找到 操作系统:Linux Linux发行版:Centos7 安装 下载地址,点这里Redis4.0.0.tar.gz 或者使用命令: wget http://downlo ...

  5. redis-4.0.8 配置文件解读

    # Redis configuration file example.## Note that in order to read the configuration file, Redis must ...

  6. centos7.5 安装 redis-4.0.11

    1.下载redis包 wget wget http://download.redis.io/releases/redis-4.0.11.tar.gz 2.解压安装 #解压 .tar.gz #安装 cd ...

  7. 阿里云 CentOS7安装redis4.0.9并开启远程访问

    1 安装redis编译的c环境 yum install gcc-c++ redis是c语言开发的,安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境. 如果没有gcc环境,需要安装gcc ...

  8. Redis(二)CentOS7安装Redis4.0.10与集群搭建

    一 Redis单机安装 1 Redis下载安装 1.1 检查依赖环境(Redis是C语言开发,编译依赖gcc环境) [root@node21 redis-]$ gcc -v -bash: gcc: c ...

  9. linux下redis4.0.2安装与部署

    一.redis的介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更 ...

随机推荐

  1. Linux 新手应该知道的 26 个命令

    https://linux.cn/article-6160-1.html 当你进入了 Linux 的世界,在下载.安装 了某个 Linux 发行版,体验了 Linux 桌面并安装了一些你喜爱和需要的软 ...

  2. 查看Linux系统软硬件信息

    查看Linux系统软硬件信息 查看计算机CPU信息 cat /proc/cpuinfo 查看文件系统信息 cat /proc/filesystems 查看主机中断信息 cat /proc/interr ...

  3. centos 搭建git服务器和客户端

    参考资料:http://blog.feehi.com/linux/124.html 1.搭配环境 2.安装git 3.创建git用户 4.创建裸库 5.配置公钥匙 6.客户端clone代码库 1.搭配 ...

  4. HTML入门9

    这一篇着眼于HTML里的音频和视频标签及相关处理: 传统技术不能再web中使用音频和视频,一致使用Flash后来因为一些HTML/CSS特性,安全问题,慢慢退出.在HTML5提出后,新特性<vi ...

  5. VMware workstation --虚拟机静态ip设置

    背景介绍 我在本机win10上安装VMware workstation软件,新建两台centos7虚拟机,最近在配服务,每天虚拟机重启后,ip总会变,服务配置文件又要修改,很麻烦,便需要将其ip由dh ...

  6. scrapy入门使用

    scrapy入门 创建一个scrapy项目 scrapy startporject mySpider 生产一个爬虫 scrapy genspider itcast "itcast.cn&qu ...

  7. C#基础概念总结

    C#基础概念总结 1..NET Framework概念 2. C#的含义: 3.什么是面向对象编程: 4.Visual Studio开发工具: 5..NET程序运行的机制: 1..Net Framew ...

  8. Mac学习

    碰到问题可以多查看帮助文件 快速上手 1,自动隐藏顶端菜单栏: 通用-> 外观 menu bar 2,docker 程序坞,左边为应用程序,右边是文件或者文件夹,38线 3,option -&g ...

  9. linux基础命令--userdel 删除用户帐户和相关文件

    描述 userdel命令用于删除用户帐户和相关文件. userdel命令修改系统账户文件,删除所有涉及用户的信息,指定的用户(LOGIN)必须存在. 语法 userdel [options] LOGI ...

  10. org.hibernate.HibernateException: Duplicate identifier in table for: Waa

    提示表的标识符重复,发现是数据库中的主键id重复了.因为是序列自动生成的. 我原本以为是因为我的序列的问题,序列.nextval()有问题,但是当我在数据库测试时,发现当前序列没有问题.但是当数据插入 ...