问题一:Redis是什么?
①速度非常快的Nosql数据库,即非关系型数据库。基于key-value的内存存储,同时支持数据持久化到硬盘。
小问题:那么问题来了,它可不可以跟mybatis框架整合,进而对Redis数据库进行操作。答案很明显是不可以的,因为mybatis框架在整合无论是oracle和mysql数据库时,最大的特点就是ORM思想,即Object Relationship Mapping,对象关系映射。一个实体类对应一张表,基于ORM思想,会将数据库表中的数据查询出来的结果集映射到java对象上,方便在程序中操作数据。而在我们的redis,是非关系型数据库,即不存在表的概念,所以我们需要其他的方式对Redis数据库进行操作,后续会进行介绍。
②Redis的特点:
- 高性能
- 数据类型丰富
- 基于内存存储,又支持持久化
问题二:Redis的持久化是什么?
redis支持将内存中的数据通过IO方式保存到硬盘,则可以保证数据可以重用并且保证安全。
问题三:RDB机制
①Snapshotting(RDB)机制的运行原理:
简单来说:
1.在某些时刻,Redis通过fork产生子进程,一个父进程的快照(副本), 其中有和父进程当前时刻相同的数据
2.父进程继续处理client请求,增删改查等,子进程负责将快照(数据副本)写入临时 文件(默认文件名为dump.rdb)
3.子进程写完后,用临时文件替换原来的快照文件,然后子进程退出。
②Snapshotting(RDB)机制的开发步骤
编辑redis.conf文件,进行修改参数:
save 900 1 #900秒超过1个key被修改
save 300 10 #300秒超过10个key被修改
dbfilename dump.rdb #快照文件名
stop-writes-on-bgsave-error yes #快照失败后是否继续写操作
rdbcompression yes #是否压缩快照文件
③RDB触发方式
- 根据配置 save 900 1 等,在满足条件时自动触发
- 执行 bgsave 指令,主动触发
- 执行 save指令,主动触发,但会造成持久化过程中的主进程阻塞,不常用如果数据量很大时可以考虑使用,因为不用创建子进程,也就没有子进程 抢资源,所以save在生成快照时可以更快(夜深人静时手动触发)
- 当通过 shutdown 关闭redis时,会自动触发
④ 细节
- 如果发生系统崩溃,则会丢失最近一次rdb之后的数据,所以如果项目不能接受这样的数据损失,则不建议使用rdb
- 如果数据量巨大,则创建子进程的时间长,导致redis卡顿,要谨慎设置save参数时间间隔大一些;或如果软件允许,可以每天在闲时手动同步
- 将生成的快照文件,留在原地,则可以在重启redis后,保持数据状态
- 将生产的快照文件,复制到其他redis服务中,可以方便的将数据移植过去
问题四:AOP持久化
①Append-Only File(AOF)机制
Redis将每一个写操作(执行成功),写入aof文件,即记录所有的数据改动行为,Redis重启时只要从头到尾执行一次aof文件,即可恢复数据,也可以将aof文件复制到别的服务器,做数据移植。
②aop配置:编辑redis.conf文件
appendonly yes #启动AOF机制
appendfsync always #每次收到写命令就立即强制 写入磁盘,保证完全的持久
化,但产生极大的IO开销(不推荐使用)
appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了
很好的折中(推荐使用)
appendfsync no #完全依赖os,虽然基本不对redis性能产生影响,但操作
系统的缓存区满时,会阻塞redis(不推荐使用)
appendfilename “appendonly.aof” 设置aof文件名
③细节:
1.AOF文件会不断增长(可能比快照文件大几倍),在极端情况下,可能会对 硬盘空间造成压力
2.Redis重启时,需要重新执行一个可能非常大的AOF,时间会很长
3.AOF同步时间间隔小,数据更安全,理论上至多丢失1秒的数据
④注意:在重启时,要恢复数据,如果rdb文件和aof文件同时存在时 以AOF为准
问题五:RDB与AOP的比较
1)RDB体量更小,AOF文件体量更大
2)RDB的同步时间间隔大,AOF同步时间间隔小,所以,AOF更能保证数据的安全
3)RDB有更快的恢复速度,可以用来做数据版本控制
4)通过使用RDB和AOF,用户可以在重启或系统崩溃后保留数 据,但随着负载量变大和数据安全越来越重要,可以使用redis的复制特性做更好的数据安全保障