一、基本概念
1. Redis:属于开源的、键值对型的数据存储系统。支持网络、可基于内存、可持久化的日志型数据库。它可用作数据库、缓存、消息中间件。
2. 分析:正因为Redis是基于内存的,因此对于内存有非常高的要求,会把数据实时写到内存中,再定时同步到文件;作为数据库而言,可靠性没有Oracle关系型数据库那么稳定,但Redis可作为缓存层的Cache层,它可缓存计数、排行榜样和队列(订阅关系)等数据库结构。
二、Redis优缺点
1. 主要优点:
(1).完全基于内存,数据实时读写内存,定时闪回到文件中,性能极高,读写速度快,Redis能支持超过100Kb/s的读写速度
(2).支持高并发,官方宣传支持10万级别的并发读写
(3).支持机器重启后 ,重新加载模式,不会丢失数据
(4).支持主从模式复制,支持分布式
(5).丰富的数据类型——Redis支持Strings、Lists、Hashes、Sets以及Ordered Sets数据类型
(6).原子——Redis的所有操作都是原子性的
(7).丰富的特性——Redis还支持Publish/Subscribe等特性
(8).开源
2.主要缺点
(1).数据库容量受到物理内存的限制,不能实现海量数据的高性能读写
(2).没有原生的可扩展机制,不具备自身可扩展能力,需要依赖客户端来实现分布式读写
(3).Redis使用的最佳方式是全部数据In-Memory,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed功能,和传统意义上的持久化区别较大
(4).Redis适合场景主要局限在较小数据量的高性能操作和运算上
(5).相比于关系型数据库,其存储结构相对简单,因此Redis并不能对复杂的逻辑关系提供很好的支持
(6).Redis不支持复杂逻辑查询,不适合大型项目的要求
三、Redis常见应用场景
1.缓存:现在几乎是所有中大型网站都在用的提升手段,合理的利用缓存能够提升网站的访问速度,大大降低数据库的压力
2.排行榜:借助Redis提供的有序集合(sorted set)能轻松实现排行榜功能
3.计数器:应用在电商网站的浏览量、视频点击量等方面。这时适合使用Redis提供的incr命令来实现计数器功能,由于是单线程的原子操作,保证了统计不会出错,本身又是内存操作,速度非常快。
4.分布式session分享:集群模式下,基于Redis实现session共享
5.分布式锁:在维护库存、“秒杀”购物等一些场合,为保证并发访问时操作的原子性,可利用Redis实现分布式锁来完成这些功能
6.最新列表:Redis列表结构,LPUSH可在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无须查询最新列表,直接根据ID去到对应的内容页即可
7.位操作:用于数据量上千万甚至上亿的场景下,经典应用如上亿用户的活跃度统计等。位操作使用setbit、getbit、bitcount等命令
8.消息队列:Redis提供发布/订阅及阻塞队列功能,能实现一个简单的功能较弱消息队列系统。在一些功能简单的应用系统里可以使用。
四、Redis将所有数据放入内存中的原因
1.Redis为了达到最快的读写速度将所有数据放入内存中,所有客户端访问数据集都在内存中进行。
2.如果开启了持久化则通过异步的方式将数据写入磁盘,在内存中操作本身就比从磁盘操作要快,且不受磁盘I/O速度的影响
3.如果内存使用达到设置的上限,Redis的写命令会返回错误信息(但是读命令仍可以正常返回)
4.如果已开启虚拟内存功能,当内存用尽时,Redis就会把那些不经常使用的数据存储到磁盘;反之,如果Redis里的虚拟内存被禁了,它就会用操作系统的虚拟内存(交换内存),但这时Redis的性能会急剧下降。
五、Redis内存优化建议和高性能原因分析
1.内存优化建议
(1).尽可能使用哈希表(hash数据结构),因为Redis在储存小于100个字段的Hash结构上,其存储效率非常高,在不需要使用集合set或list操作的情况下,尽可能使用hash结构
(2).根据业务场景,考虑使用BITMAP
(3).充分利用共享对象池:Redis在启动时会自动创建0-9999的整数对象池,对于0-999的内部整数类型的元素、整数值对象都会直接引用整数对象池中的对象,因此尽量使用0-9999整数对象可节省内存
(4).合理使用Redis提供的内存回收策略,比如过期数据清除,expire设置数据过期时间等
2.高性能原因分析
(1).完全基于内存
(2).数据结构简单
(3).采用单线程
(4).使用多路I/O复用模型,为非阻塞IO
(5).Redis直接自己构建了VM机制,没有使用OS的Swap,而是自己实现。通过VM功能可以实现冷热数据分离,可避免因内存不足而造成访问速度下降的问题
六、Redis持久化和Key过期删除策略
1.两种持久化方式
(1).RDB持久化:在指定的时间间隔内将内存中的数据以快照写入磁盘,实际操作过程是创建(fork)一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
RDB持久化优点:
I.只有一个文件dump.rdb,方便持久化
II.容错性好,一个文件可以保存到安全的磁盘
III.实现了性能最大化(它创建单独子进程完成持久化,让主进程继续处理命令,主进程不进行I/O操作,从而保证Redis的高性能)
IV.RDB是一个紧凑压缩的二进制文件,RDB重启时加载效率比AOF持久化更高,在数据量大时更加明显
RDB持久化缺点:
I.有可能数据丢失,不适合可用性要求比较高的场景;两次RDB持久化的时间间隔里,系统一旦宕机,则该段时间内的数据因没有写入磁盘将丢失
II.由于RDB是通过创建(fork)子进程协助完成数据持久化工作的,因此,当数据集较大时,可能会导致整个服务器间歇性暂停服务
(2).AOF持久化:以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录
AOF持久化优点:
I.实时持久化,数据安全
II.它通过append模式写文件,即使中途服务器宕机,可以通过Redis-check-aof工具解决数据一致性问题
III.AOF机制的rewrite模式:AOF文件的文件大小触碰到临界点时,rewrite模式会被运行,重写内存中的所有数据,从而大大缩小文件体积
AOF持久化缺点:
I.AOF持久化文件通常比RDB持久化文件大很多
II.比RDB持久化启动效率低,数据集大的时候较为明显
III.AOF文件体积可能迅速变大,需要定期执行重写操作来降低文件体积
2.Key过期删除策略
(1).主节点的过期删除策略
I.定时删除:在设置Key过期时间的同时,创建定时器timer,让定时器在Key过期时间到来时,立即执行对Key的删除操作 (对内存友好,对CPU不友好)
II.惰性删除:不管Key是否过期,每次获取Key时都检查是否过期,如果过期就删除该Key,否则返回该Key (对CPU友好,对内存不友好)
III.定期删除:是上述两种过期策略的折中,即对内存有何和CPU时间友好的折中方法。每隔一段时间执行一次删除过期键任务
说明:惰性删除是被动删除策略,定时删除和定期删除是主动删除策略
(2).从节点的过期删除策略
Redis从节点不会对Key做过期扫描,从节点对过期Key的处理是被动的。主节点在Key到期时,会在AOF文件里增加一条del指令。AOF文件被同步到从节点以后,从节点根据AOF中的这个del指令来执行删除过期Key的操作
从节点的这个过期Key的处理策略,会导致一个问题,主节点已经删除的过期Key,在从节点中还会暂时存在。因为AOF同步del指令是异步的。
标签:AOF,缓存,持久,过期,Redis,基础知识,内存,Key From: https://www.cnblogs.com/codeboy-top/p/17073743.html