什么是Redis
Redis 是开源免费的,遵守BSD协议,是一个高性能的key-value非关系型数据库。
用途及使用场景
- 用途
- 解决应用服务器的cpu和内存压力
- 减少io的读操作,减轻io的压力
- 关系型数据库的扩展性不强,难以改变表结构
- 使用场景
- 数据高并发的读写
- 海量数据的读写
- 对扩展性要求高的数据
- 实际用例
- token生成、session共享、分布式锁、自增id、验证码等。
数据结构
- key-value型数据库,支持string、list、set、zset和hash类型数据
- 对这些数据的操作都是原子性的,redis为了保证效率会定期持久化数据。
持久化方式
- RDB(快照):保存某个时间点的全量数据快照
- 手动触发
- save:阻塞Redis的服务器进程,直到RDB文件被创建完毕
- bgsave:fork出一个子进程来创建RDB文件
- 自动触发
- 根据redis.conf配置里的save m n定时触发(用的是BGSAVE)
- 主从复制时,主节点自动触发
- 执行Debug Relaod
- 执行Shutdown且没有开启AOF持久化
- 优缺点
- 优点:适合冷备;可以根据时间段进行备份,出现问题的时候可以根据时间段进行恢复.
- 缺点:无法保证数据完整性,服务宕机会导致时间段的数据丢失.因为未进行备份.
- 手动触发
- AOF(Append-Only-File)持久化:保存写状态
- 记录除了查询以外的所有变更数据库状态的指令
- 以append的形式追加保存到AOF文件中(增量)
- 优缺点
- 优点:每次修改操作就会把它添加到AOF文件中,redis重启后会根据AOF文件修改记录进行恢复数据
- 缺点:相同数据集的情况下AOF体积会比RDB大,而且根据 fsync 策略恢复速度会比RDB慢.
关于fork,在redis官网有这么一段描述:
RDB disadvantages
RDB is NOT good if you need to minimize the chance of data loss in case Redis stops working (for example after a power outage). You can configure different save points where an RDB is produced (for instance after at least five minutes and 100 writes against the data set, but you can have multiple save points). However you’ll usually create an RDB snapshot every five minutes or more, so in case of Redis stopping working without a correct shutdown for any reason you should be prepared to lose the latest minutes of data.
RDB needs to fork() often in order to persist on disk using a child process. Fork() can be time consuming if the dataset is big, and may result in Redis to stop serving clients for some millisecond or even for one second if the dataset is very big and the CPU performance not great. AOF also needs to fork() but you can tune how often you want to rewrite your logs without any trade-off on durability.
大意是:RDB为了将数据持久化到硬盘,需要经常fork一个子进程出来。数据集如果过大的话,fork()的执行可能会非常耗时,如果数据集非常大的话,可能会导致Redis服务器产生几毫秒甚至几秒钟的拒绝服务,并且CPU的性能会急剧下降。
这个停顿的时间长短取决于redis所在的系统,对于真实硬件、VMWare虚拟机或者KVM虚拟机来说,Redis进程每占用1个GB的内存,fork子进程的时间就增加10-20ms,对于Xen虚拟机来说,Redis进程每占用1个GB的内存,fork子进程的时间需要增加200-300ms。