Redis 是一个高性能的key-value数据库,支持主从同步。适合会话缓存,排行榜,页面缓存等应用场景。
redis的持久化
redis持久化存储支持两种方法:RDB(Redis DataBase)和AOF(AppendOnly File).没有持久化的redis就是纯内存的数据库。
RDB
- 将数据写入一个临时文件;持久化结束后,这个临时文件替换上次的持久化文件,得到新的持久化文件。
- 优点:使用单独的线程进行持久化,主线程不会进行任何的IO操作,保证了redis的高性能;
- 缺点:RDB是间隔一段时间进行持久化,如果持久化期间发生了故障会导致数据丢失,所以适合数据要求不是那么严谨的时候。
RDB是默认开启的,在redis配置文件中有:
dbfilename dump.rdb(保存的文件名) dir ./(保存的路径) save 900 1(更改了1个key,900s后会将数据写入临时文件) save 300 10 (更改了10个key,300s后会将数据写入临时文件) save 60 10000
AOF
- AOF是指出是否在每次更新操作后进行日志记录将执行过的指令记录下来;如果不开启,可能会在断电时导致一段时间内的数据丢失。开启则数据恢复时按照从前到后的顺序再将指令执行一遍,实现数据恢复。
- 优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。
- 缺点:AOF文件比RDB文件大,且恢复速度慢。
- AOF默认关闭
同步方式相关的配置
appendonly yes appendfilename "appendonly.aof"(文件名) appendfsync always (一旦插入命令,立即同步到磁盘,保证了完全的持久化,但是速度慢) appendfsync everysec(AOF每秒进行同步,默认) appendfsync no(表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快)
关于 fsync()方法,配置文件中解释了
The fsync() call tells the Operating System to actually write data on disk instead of waiting for more data in the output buffer.
redis和memcached的比较
- memcached是一个分布式的内存对象缓冲系统,基于key-value存储,用来存储小块的内存数据(对象,字符串);value的最大长度为1MB.
- redis也是一个key-value的存储系统,value的最大长度是1GB,但是支持更多的数据类型存储,比如list,String,set,zset和hash,并且这些操作都是原子性的;与memcached一样,为了保证效率都是缓存在内存中,而不同点是:redis会定期将缓存中的数据刷新到硬盘上或者把修改操作追加到appendonly.aof文件中。
- 二者优点:通过缓存数据库查询结果,减少访问数据库的次数,提高动态web的速度。
redis和Mysql的区别
- mysql是关系型数据库,是持久化存储,查询检索操作会涉及IO操作,数据访问速度慢。
- redis则是非关系型数据库,数据缓存在内存中,但是可以刷新到硬盘上使之持久化,数据访问数据快。
- 在项目中一般是结合redis+mysql.如果数据量大且被频繁用到则用redis缓存,访问数据的时候先访问redis,如果没有再去mysql中查找。
mongoDB
- MongoDB是面向文档存储的数据库,数据结构是键值对组成,Mongodb文档(格式为BJSON)类似与json对象,
- 面向集合存储,易存储对象类型的数据。
- 优点:查询功能强大,支持类似关系型数据库单表查询的绝大部分功能,而且支持索引,能存海量数据;
- 缺点:不支持事务