一、目前主流缓存的技术
从业界企业开发实战应用来看,目前主要使用两种缓存技术:
1、Redis
2、Memcached
二者谁的性能更高?
1、单纯从缓存命中的角度来说,是Memcached要高;但是,从平均来看,Redis和Memcache的差距不大。
2、但是,Redis提供的功能更强大。
二者的区别是什么?
1、Memcache是多线程。
2、Redis是单线程。
本文中,我们主要关注后者的持久化问题。
二、关于Redis数据库
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型,类似于Java中的map)。Redis基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构存储服务器。
与其他NoSQL数据库相比,Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的,同时对程序员透明,无需进行额外抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。内存数据库的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Redis特性
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 其它特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
三、Redis持久化
使用Redis做缓存,可以方便多个业务进程之间共享数据。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据全丢失,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。
Redis提供两种方式进行持久化:一种是RDB(Redis DataBase)持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(Append Only File)持久化(原理是将Reids的操作日志以追加的方式写入文件)。
2.二者的区别
【RDB持久化】RDB 是 Redis 默认的持久化方案。是指在指定的时间间隔内将内存中的数据集快照写入磁盘。实际操作过程就是:有一个fork子进程,先将数据集写入到临时文件中,写入成功后,再替换之前的文件,用二进制压缩存储。更细致的说法是:在指定的时间间隔内,执行指定次数的写操作,并将内存中的数据写入到磁盘中,即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。
【AOF持久化】则是以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
3.二者优缺点
RDB的优缺点:
优点:RDB持久化文件,速度比较快,而且存储的是一个二进制文件,传输起来很方便。
缺点:RDB无法保证数据的绝对安全,有时候就是1秒时间也会有很大的数据丢失。
AOF的优缺点:
优点:AOF相对RDB更加安全,一般不会有数据的丢失或者很少。官方推荐同时开启AOF和RDB。
缺点:AOF持久化的速度,相对于RDB较慢,存储的是一个文本文件,到了后期文件会比较大,传输困难。
四、Redis持久化配置
(一)RDB持久化配置
Redis会将数据集的快照dump到dump.rdb文件中。此外,我们也可以通过配置文件来修改Redis服务器dump快照的频率。例如,在打开redis.windows.conf文件之后,我们搜索save,可以看到下面的配置信息:
################################ SNAPSHOTTING ################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1
save 300 10
save 60 10000
备注:save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘中。上面代码中,说明官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的数据快照写入磁盘。
若不想用RDB方案,可以把 save "" 的注释打开,下面三个注释。
指定本地数据库文件名,一般采用默认的 dump.rdb:
dbfilename dump.rdb
指定本地数据库存放目录,一般也用默认配置:
dir ./
默认开启数据压缩:
rdbcompression yes
配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。若关闭该选项,但会导致数据库文件变的巨大。建议开启。
【1】触发RDB快照
1 在指定的时间间隔内,执行指定次数的写操作。
2 执行save(阻塞, 只管保存快照,其他的等待) 或者是bgsave (异步)命令。
3 执行flushall 命令,清空数据库所有数据,意义不大。
4 执行shutdown 命令,保证服务器正常关闭且不丢失任何数据,意义也不大。
【2】通过RDB文件恢复数据
将dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。在实际开发中,一般会考虑到物理机硬盘损坏情况,选择备份dump.rdb 。可以从下面的操作演示中可以体会到。
(二)AOF持久化配置
在Redis的配置文件中存在三种同步方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
五、可能的问题
(一)redis启用持久化 aof 之后 报错
Can’t open the append-only file: Input/output error
原因:在Windows下 没用管理员权限 (一个坑)。
(二)同时开启RDB和AOF时
如果redies重启之后,需要加载一个持久化文件,有限会选择AOF文件。
如果先开启了RDB,再开启AOF,RDB先执行了持久化,那么RDB文件中的内容会被AOF覆盖掉。
引用
-
- https://blog.csdn.net/hellozpc/article/details/81267030
- https://baijiahao.baidu.com/s?id=1710298342948847264&wfr=spider&for=pc
- https://www.cnblogs.com/itdragon/p/7906481.html
- https://baike.baidu.com/item/Redis/6549233?fr=aladdin
- https://zhuanlan.zhihu.com/p/48535300