首先声明一下Redis是什么
介绍:(照搬百度百科的)
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 [1]
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
我稍稍总结一下:
Redis就是一个非关系型的、基于内存存储的、又支持持久化的高性能数据库。
针对于这些特点:
请参照:https://blog.csdn.net/longxingzhiwen/article/details/53896702 我感觉讲得很明白了。
上述连接部分节选:
Redis有些特殊,临时性和永久性兼具。Redis首先把数据保存在内存中,在满足特定条件(默认是 15分钟一次以上,5分钟内10个以上,1分钟内10000个以上的键发生变更)的时候将数据写入到硬盘中,这样既确保了内存中数据的处理速度,又可以通过写入硬盘来保证数据的永久性,这种类型的数据库特别适合处理数组类型的数据。总结来说:
- 同时在内存和硬盘上保存数据
- 可以进行非常快速的保存和读取处理
- 保存在硬盘上的数据不会消失(可以恢复)
- 适合于处理数组类型的数据
redis持久化方式:
分为两种方式:rdb(redis database)和aof(append of file)
RDB:在指定时间间隔内,将内存中的数据作为一个快照文件(snapshot)写入到磁盘,读取的时候也是直接读取snapshot文件到内存中-----------按照时间周期进行持久化操作!
①持久化过程:redis单独创建(fork)一个进程来持久化,会先将数据写入临时文件中,待上次持久化结束后,会将该临时文件替换上次持久化文件,比aof高效,但是最后一次数据可能会丢失
②Fork:在linux中,fork()会产生一个跟主进程一样的子进程,出于效率考虑,主进程和子进程会公用一段物理内存,当发生改变的时候,才会把主进程“”写时复制”一份给子进程
③Redis备份的文件:在redis.conf中设置,dbfilename默认为:dump.rdb
④rdb保存策略:
- 900s 1 file change
- 300s 10file change
- 60s 10000file change
⑤Rdb的备份:
- config get dir 得到备份的文件夹
- 复制备份文件
⑥Rdb恢复:
- 关闭redis
- 将备份文件复制到工作目录下
- 启动redis,自动加载
AOF : 以日志形式记录每个写操作,启动时通过日志恢复操作
- 开启AOF:默认不开启,进入redis.conf找到appendonly yes打开
- 修复AOF:redis-check-aof –fix appendonly.aof
- 同步频率:每秒记录一次,如果宕机该秒记可能失效
- Rewrite:bgrewriteaof 因为日志是追加方式,文件会越来越大,当超过了设置的阈值时,日志文件会压缩,保留仅可以恢复的日志
RDB和AOF对比
(一) RDB优点:
- 节省磁盘空间
- 恢复速度快
(二) ROD缺点:
- 数据太大时,比较消耗性能
- 一段时间保存一次快照,宕机时最后一次可能没有保存
(三) AOF优点:
- 备份机制更加稳健
- 可读的日志文件,通过aof恢复更加稳健,可以处理失误
(四) AOF缺点:
- 比RDB更占磁盘
- 备份速度较慢
- 每次都同步日志,有性能压力
因此Redis的优点也就出来了:
- 数据库没有关联关系,数据结构简单,拓展表比较容易
- 读取速度快,对较大数据处理快
既然有了优点自然也有其缺点:
- Redis的缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
综上所述Redis的应用场景就框定了出来:
首先对于传统的数据库项目而言,Redis可以改进的方面:
- 解决应用服务器的cpu和内存压力
- 减少io的读操作,减轻io的压力
- 关系型数据库的扩展性不强,难以改变表结构
场景:
- 配合关系型数据库做高速缓存
- 缓存高频次访问的数据,降低数据库io
- 分布式架构,做session共享
- 可以持久化特定数据。
- 利用zset类型可以存储排行榜
- 利用list的自然时间排序存储最新n个数据
- 等等等等
引用:https://blog.csdn.net/u011277123/article/details/78692603/