黑马程序员技术交流社区

标题: [黑马程序员杭州]redis持久化 [打印本页]

作者: 小江哥    时间: 2017-11-10 14:20
标题: [黑马程序员杭州]redis持久化
本帖最后由 小江哥 于 2017-11-10 22:50 编辑

         redis一直是java开发中经常使用的nosql数据库,我们都知道redis是基于内存的,那redis可不可以像mysql或者oracle一样把数据存放到硬盘上呢,这个就是今天我们要说的内容啦!


1.   
什么是redis

redis是一种可基于内存可持久化的日志型,key-value型数据库,因为其性能优越使用的简单性,现在被越来越多的公司所使用,但是多数情况下使用redis的时候只是简单的基于内存当做缓存数据库来使用,如果这个时候redis重启了那么一切数据都会消失,所以今天我们就来看一下redis如何实现持久化

2.  什么是持久化
持久化:通俗易懂的说就是将数据保存到磁盘,机器宕机或者重启数据不丢失,如果存储到内存中的数据,会丢失。

3.  redis的持久化方式
redis支持两种方式的持久化,第一种是RDB方式,另一种是AOF方式.他们可以单独的使用也可以一起使用

4.  RDB持久化方式详解
a) RDB方式是通过快照完成的,当符合一定条件的时候redis会自动的将内存中的所有数据进行快照且存储到硬盘上. 进行快照的条件在配置文件中指定,由两个参数构成: 时间和改动建的个数,当在指定的时间内被更改的键的个数大于指定的数据时就会进行快照.这个是redis默认的持久化方式!
b) 下面我们就来看下这个配置在哪里吧:
      首先找到你的redis的安装目录,找到
      打开它一切的配置都在里面,今天我们操作的都在这里啦.
      然后配置在这里:
      那么这三个配置分别是什么意思呢?我们来看:  
  现在大家知道这种配置了把,如果你想更改那么只需要更改那三个时间或者键的个数都是可行的
c) 那么这个持久化文件的位置在哪里呢?
    默认的rdb持久化文件的路径是在当前目录,文件名是: dump.rdb当然这个我们也可以在配置文件中修改: 首先还是这个配置文件找到如下两个配置:   
如果你想更改文件的名字和存储路径更改上面两个配置就行啦

5. RDB方式数据快照与恢复过程
a)数据恢复:
   当我们的redis启动的时候会根据配置文件读取RDB方式的快照文件,将硬盘上的数据载入到内存中
b)快照过程
   当redis要执行快照操作的时候首先会fork出一个子进程,父进程继续执行客户端发出的操作,而子进程开始将内存中的数据写入到硬盘中的临时文件,当所有的数据写完,就会用     该临时文件替换原来旧的RDB文件
   注意: 当fork子进程的时候,子进程会保留父进程的所有的状态,也就是说他会占用和主进程同样的资源,如果当前父进程占用了8G内存那么要实现这个操作服务器最低的内存要是16G,所以fork有风险使用需谨慎哈

6. 手动快照
我们在redis中存入一条数据
然后我重启redis之后发现这条数据不见了
这是为什么呢? 我们回想一下刚才我们说要想让redis执行RDB持久化必须满足三个条件其中的一个,可想而知这时候这三个条件都是不满足的,这个时候就发生了数据丢失的问题. 别急redis想到了这一点所以给我们提供了一个手动快照的方式.还是执行上面的命令之后在执行save命令
然后在重启服务你会发现这条数据还在
所以: 当我们的操作没有满足RDB持久化的三个条件,又想持久化的时候,我们可以通过save命令来手动的持久化. 其实手动持久化的命令有两个,一个是save另一个是bgsave,区别是,前者主进程进行快照,后者是fork出一个子进程进行快照

7. RDB文件的压缩
当我们持久化的内容越来越多的时候那么这个RDB文件会变的越来越大,所以redis给我们提供了压缩该文件的功能,还是在这个文件中
我们可以看到这个配置默认开启,如果你想关闭压缩功能只需要把这个配置改成no就行啦

8. AOF的持久化方式
a) aof持久化方式是将发送到的redis服务端的每一条命令记录下来,保存到硬盘中,默认存放的地址和RDB方式一样,也可以通过如上的配置进行修改,默认的文件名是
可以通过打开这个配置文件进行修改
b) 如何打开AOF持久化
默认AOF持久化是关闭的我们可以通过如下配置打开他
只需要将no改成yes就能实现开启AOF持久化的功能啦
c) 测试AOF
当客户端向服务器发送Redis命令时,Redis会将所执行的命令记录到aof文件中,如下:客户端执行的命令是
打开AOF文件:
当redis服务器重启后,会将执行该aof文件,达到数据恢复的目的。
d) 优化AOF文件
    当我们以相同的key存入不同的value的时候默认情况下redis会存储这两条命令,命令如下:
aof文件显示如下:


但是对于redis来说这个其实只需要储存最后一条命令就行了,所以redis给我们提供了bgrewriteaof命令来重写aof文件,这个命令所实现的效果就是保留最终命令去除其他多余的命令. 命令行执行该命令:
在打开我们的aof文件发现只有一条命令了,是不是很智能呢.

e)重写的策略
默认情况下redis在配置文件中也给我们提供了一些重写aof文件的策略如下


好啦!写到这里相信大家对于redis的持久化已经有了一定的了解. 咱们下次再见哈!

































06.png (1.62 KB, 下载次数: 82)

06.png

07.png (2.68 KB, 下载次数: 75)

07.png

08.png (1.87 KB, 下载次数: 90)

08.png

12.png (3.91 KB, 下载次数: 83)

12.png

13.png (8.14 KB, 下载次数: 74)

13.png

作者: 杭州宋小妞    时间: 2017-11-10 23:20
赞赞赞
作者: 秋子菇凉    时间: 2017-11-10 23:22
已收藏已分享
作者: nhm    时间: 2017-11-10 23:22
6666666666
作者: yuxiaoyi    时间: 2017-11-10 23:23
厉害厉害
作者: fangmifang618    时间: 2017-11-10 23:24
兵兵好棒啊
作者: 采姑娘的小蘑菇    时间: 2017-11-10 23:26
厉害了我的大黑马
作者: 陈君    时间: 2017-11-10 23:35
6666666666666
作者: L`EG    时间: 2017-11-10 23:47
看一遍,基本掌握
作者: 许言    时间: 2017-11-10 23:49
顶顶顶顶顶
作者: gy_yt    时间: 2017-11-10 23:54
技术岗岗滴,厉害了我的兵哥
作者: patronli    时间: 2017-11-10 23:55
特别完美啊
作者: 咸鱼666    时间: 2017-11-10 23:55
牛牛牛66666
作者: Rocket_冷风    时间: 2017-11-10 23:57
66666666666666666666666
作者: 奔跑地小少女    时间: 2017-11-11 00:52
厉害厉害
作者: 小年青    时间: 2017-11-11 07:23
受益匪浅谢谢谢谢
作者: fanbuer    时间: 2017-11-11 08:32
面试急需,已收藏^_^
作者: 鱼丸儿    时间: 2017-11-11 08:46
6666
作者: 程代明    时间: 2017-11-11 09:37
好货 赞
作者: 小核桃仁    时间: 2017-11-11 09:41
棒棒哒
作者: 人称最美教师    时间: 2017-11-11 09:48
厉害
作者: 从此学好    时间: 2017-11-11 10:01
跟师傅学技术,
作者: 刘华莎    时间: 2017-11-11 10:03


棒棒哒
作者: wxz_hm    时间: 2017-11-11 10:19
兵兵厉害 加油

作者: PHP老曹    时间: 2017-11-11 10:32
受教了1,已经收藏,谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2