redis全内存运行

原创
2015/01/04 12:04
阅读数 7.5K

在某些使用场景中,我们并不需要使用redis的持久化,反而需要发挥redis的内存数据库特性,实现完全内存运行,达到需要的高性能。

Redis 本身支持持久化,通过在一定时间间隔或触发操作,将内存中的数据同步到磁盘来保证持久化。Redis 支持两种持久化方式,一种是  Snapshotting(快照),保存为dump.rdb文件,也是默认方式,另一种是 Append-only file(缩写aof)的方式,保存为 .aof 文件。

Snapshot 快照 通过save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有客户端的请求,这种方式会阻塞所有客户端请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较多,必然会引起大量的磁盘IO操作,可能会严重影响性能。

在默认的快照 rdb保存方式中,redis.conf 里面的配置如下

save 900 1   #900秒内如果超过1 个key 被修改,则发起快照保存 
save 300 10  #300秒内容如超过10个key 被修改,则发起快照保存 
save 60 10000

如果我们需要关闭快照,只需要将这几行注释了,然后重启 redis 即可。

如果是正在运行的实例,可以使用 redis-cli的命令

# 查看当前配置
config get save
# 关闭快照
config set save ""

来在线更新配置,输出OK表示设置成功。


AOF  比快照方式有更好的持久化性,是由于在使用aof 持久化方式时, redis 会将每一个收到的写

命令都通过write函数追加到文件中(默认是appendonly.aof) 。当redis 重启时会通过重新执行文件中

保存的写命令来在内存中重建整个数据库的内容

默认配置如下:

appendonly yes      //启用日志追加持久化方式
#appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
#appendfsync no //完全依赖操作系统,性能最好,持久化没保证

我们需要更新配置文件为:

appendfsync no

在线更新配置使用

# 查看当前配置
config get appendfsync
# 关闭快照
config set appendfsync no

通过这两个配置,redis就可以完全在内存运行。

如果想手动进行持久化,可以使用Redis的 bgsave 和 bgrewriteaof 来手动进行持久化。


展开阅读全文
打赏
25
193 收藏
分享
加载中

引用来自“wuxian_Abs”的评论

写的很好,但我印象中使用rdb方式持久化不是在主线程操作的

引用来自“irfen”的评论

对,我也记得持久化,以及键的失效之类的都有专门的线程处理。单一线程只是指的是读写那边

引用来自“zcool321”的评论

save方法是主线程处理,bgsave是单独一个线程处理。应该是这样的

引用来自“非仙”的评论

也不对,是fork一个进程来保存的,rdb方式redis的内存一定要设置对,如果fork后copyonwrite导致内存超过服务器内存,服务器就会崩溃
fork 一个单独的进程处理 这个才是正解
2015/01/07 11:14
回复
举报

引用来自“wuxian_Abs”的评论

写的很好,但我印象中使用rdb方式持久化不是在主线程操作的

引用来自“irfen”的评论

对,我也记得持久化,以及键的失效之类的都有专门的线程处理。单一线程只是指的是读写那边

引用来自“zcool321”的评论

save方法是主线程处理,bgsave是单独一个线程处理。应该是这样的
也不对,是fork一个进程来保存的,rdb方式redis的内存一定要设置对,如果fork后copyonwrite导致内存超过服务器内存,服务器就会崩溃
2015/01/07 09:48
回复
举报
fork process , save rdb file
2015/01/07 09:46
回复
举报

引用来自“wuxian_Abs”的评论

写的很好,但我印象中使用rdb方式持久化不是在主线程操作的

引用来自“irfen”的评论

对,我也记得持久化,以及键的失效之类的都有专门的线程处理。单一线程只是指的是读写那边
RDB的时候如果 save的话是在主进程 阻塞执行的,如果bgSave是 fork进程后在子进程执行的,aof是在主进程的buf中增量写到硬盘的,bgrewriteaof 是fork进程后写到硬盘上的
2015/01/07 09:46
回复
举报

引用来自“wuxian_Abs”的评论

写的很好,但我印象中使用rdb方式持久化不是在主线程操作的

引用来自“irfen”的评论

对,我也记得持久化,以及键的失效之类的都有专门的线程处理。单一线程只是指的是读写那边
save方法是主线程处理,bgsave是单独一个线程处理。应该是这样的
2015/01/07 09:43
回复
举报

引用来自“wuxian_Abs”的评论

写的很好,但我印象中使用rdb方式持久化不是在主线程操作的
对,我也记得持久化,以及键的失效之类的都有专门的线程处理。单一线程只是指的是读写那边
2015/01/07 09:21
回复
举报
cool,不错的教程,更深入的可以看redis官方文档~
2015/01/07 09:09
回复
举报
写的很好,但我印象中使用rdb方式持久化不是在主线程操作的
2015/01/07 09:03
回复
举报
更多评论
打赏
8 评论
193 收藏
25
分享
返回顶部
顶部