一,redis的简介
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
redis支持各种不同方式的排序,与memcached一样,为了保证效率,数据都是缓存在内存中。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis支持主从同步。
数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。
由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
二,redis架构
三,redis数据持久化
什么是持久化
持久化就是将数据保存到可以永久保存的存储设备中,在这里的应用就是将内存的对象保存到数据库中,或者存储在磁盘文件中、 XML 数据文件中等等。
应用层:如果关闭( Close )你的应用然后重新启动则先前的数据依然存在。
系统层:如果关闭( Shutdown )你的系统(电脑)然后重新启动则先前的数据依然存在。
为什么要持久化
数据一般都是缓存在内存的,当重启或者关闭系统的时候,缓存在内存的数据就后消失了,为了避免这种事情发生,让数据可以长期的保存,就需要对redis做数据持久化。
怎样实现持久化
两种方式:RDB和AOF
RDB
这种数据的持久化就是在相隔一个固定的时间里将内存中的数据生成快照并写入磁盘,当然,实际的操作其实是fock一个子进程,写一个临时文件,写入成功后,会替换掉原来的文件,并用二进制压缩存储,RDB是redis默认的一种数据持久化存储方式,会在对应的目录下生成一个dump.rdb文件,重启之后数据就会恢复过来。
优点
1)只有一个文件dump.rdb,方便持久化;
2) 容灾性好,一个文件可以保存到安全的磁盘;
3) 性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化(使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能) ;
4)如果数据集偏大,RDB的启动效率会比AOF更高。
缺点
1)数据安全性低。(RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不是特别严格的时候)
2)由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚至是1秒钟。
AOF
AOF的出现就会为了弥补RDB的不足,它会以日志的形式记录服务器的每一个写,删操作,查询操作会以文本的形式记录,将这些记录的信息追加到文件中,重启redis的时候就是根据日志的内容将写指令执行一次以达到恢复数据的效果。
优点
1)数据安全性更高,AOF持久化可以配置appendfsync属性,其中always,每进行一次命令操作就记录到AOF文件中一次。
2)通过append模式写文件,即使中途服务器宕机,可以通过redis-check-aof工具解决数据一致性问题。
3)AOF机制的rewrite模式。(AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall))
缺点
1)AOF文件比RDB文件大,且恢复速度慢;数据集大的时候,比rdb启动效率低。
2)根据同步策略的不同,AOF在运行效率上往往会慢于RDB。