@zhengyuhong
2015-04-11T12:03:50.000000Z
字数 1805
阅读 1024
redis NoSql 读书笔记
| 文件名 | 说明 |
|---|---|
| redis-server | Redis服务器 |
| redis-cli Redis | Redis命令行客户端 |
| redis-benchmark | Redis性能测试工具 |
| redis-check-aof | AOF文件修复工具 |
| redis-check-dump | RDB文件检查工具 |
Redis官方推荐的Python客户端是redis-py,可以使用pip install redis安装最新版redis-py
Redis的强劲性能很大程度上是由于其将所有数据都存储在内存中,为了使Redis在重启之后仍能保存数据不丢失,需要将数据持久化到硬盘中。
RDB方式的持久化通过快照(snapshotting)方式完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并保存到硬盘当中。进行快照条件可以由用户在配置文件中自定义,由两个参数决定:时间和改动键的个数。当在指定时间内被更改的键的个数大于指定数值就进行快照。RDB是Redis默认的持久化方式。在配置文件中默认指定三个条件:
save 900 1
save 300 10
svae 60 100000
条件之间是“或”关系。如上所说,save 900 1就是在900秒中至少由一个键被修改则进行快照持久化。
Redis默认会将快照文件存储在当前目录的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。
快照的过程如下:
(1)Redis使用fork函数复制一份当前进程的副本
(2)原进程继续接收客户端发来的命令,而子进程则开始将内存中的数据写入硬盘的临时文件。
(3)当子进程写入完所有数据后会使用该临时文件替换旧的RDB文件,至此快照操作完成。(上述其实就是一个copy and swap的过程,在effective C++中由讲到)
默认情况下Reids没有开启AOF方式的持久化,可以通过配置文件中的appendonly yes参数开启。
开启AOF持久化后美之行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘的AOF文件。AOF文件的保存位置于RDB文件的位置相同,同样快通过dir参数设置,默认的文件名是appendonly.aof
需要注意的是虽然每一次更改数据库内存的操作时,AOF都会将命令记录在AOF文件中,但是事实上由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入落系统的硬盘缓存。在默认情况下系统每30秒的过程会执行一次同步操作,以便将缓存中的内容真正写入硬盘,在这里30秒的过程中如果系统异常退出会导致硬盘缓存中的数据丢失。一般来说启用AOF持久化的应用都无法容忍这样的丢失,这就需要Redis在写入AOF文件后主动将系统的缓存内容同步到硬盘中。在Redis中可以通过设置appendfsync参数设置同步时机。
#appendfsync always
appendfsync everysec
#appendfsync no(every 30 seconds)
Redis允许同时启动AOF与RDB
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或者少量损失)数据。但是数据是存储在一台服务器上的,如果这台服务器硬盘出现故障,也会导致数据丢失。为了避免单点故障,我们希望数据库复制多个副本以部署在不同的服务器上,即使一台服务器出现故障,其他服务器依然可以继续提供服务。这就要求一台服务器上的数据库更新后,可以自动将更新的数据同步到其他服务器上,Redis提供落复制功能可以自动实现同步的过程。
同步后的数据库分为两类,一类是主数据库(master),一类是从数据库(slave)。主数据库可以进行读写操作,而发生写操作时自动将数据同步到从数据库。而从数据库一般只能读操作,并接收主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
在Redis中复制功能非常容易,只需要在从数据库的配置文件中加入slaveof <masterip> <masterport>即可,主数据库无须任何配置,如果主数据库由密码认证,也在配置文件中的masterauth <master-passwd>
