目录
首先redis的持久化分为两种RDB与AOF。
RDB的话他是基于快照的方式来存储的,将数据直接存储在物理磁盘中。
他的优点是存储效率高、恢复速度快、占用空间小,缺点是版本不兼容、并且无法做到实时存储、容易丢失数据。
而AOF则是通过AOF重写将最终结果数据转换为对应的命令来进行命令存储,通过执行指令来恢复数据。AOF可以通过每秒、每次、或者由操作系统来决定redis持久化。
他的优点是可以最快每秒进行一次持久化,保存的数据更完整,不容易丢失,消耗资源少,缺点是占用内存大、恢复速度慢。
在redis 4.0后还有一个RDB+AOF的混合持久化,结合了RDB和AOF的优点,在写入时先把数据以RDB的形式写入文件的开头,再将后续的操作以AOF的格式存储,这样既保证了Redis重启的速度,又能减低数据丢失的风险。
但缺点是实现复杂度高、可读性差、兼容性差(如果使用混合持久化,则只能用于redis 4.0以上版本)。
Redis是一种内存级数据库,所有的数据都存放在内容中,内存中的数据可以通过TTL指令来获取其状态。
Redis的删除策略一共分为三种:
定时删除:是创建一个定时器,当key的过期时间到达后,会立即删除执行删除操作。
优点是能够很快的删除掉过期数据,不会再占用空间。
缺点是对cpu的压力很大,无论此时cpu负载多高,都会立即执行删除操作,占用cpu,会影响响应时间和指令的吞吐量。
惰性删除:是指当访问到这个数据时,发现该数据已经过期,才会去执行删除操作。
优点是cpu没有什么压力,节约cpu性能。
缺点是如果长时间没有访问过期数据的话,就会占用很多空间。
定时删除:是周期性的采用随机收取的策略对数据进行检查,如果过期则删除。
逐出算法的删除策略一共有 8种
检查易失数据
挑选最近使用时间最少的数据淘汰
挑选最近使用次数最少的数据淘汰
挑选即将过期的数据淘汰
任意选择数据淘汰
检查所有数据
挑选最近使用时间最少的数据淘汰
挑选最近使用次数最少的数据淘汰
任意选择数据淘汰
放弃驱逐数据
放弃驱逐数据
缓存雪崩是指在同一时间有大量缓存过期或者服务器宕机,导致大量请求都传至去数据库中。
解决方案:
给不同key的TTL值添加随机值
使用多级缓存
使用redis集群
使用流量限流策略
缓存穿透是指某一个高并发的缓存过期了,导致同一时间大量请求访问数据库。
解决方案:
使用互斥锁,就是当一个请求访问缓存时发现缓存过期了,这是会获取一个互斥锁,然后去访问数据库,获取数据并将数据存放缓存中,释放锁,在这个期间其他请求就会获取锁失败,进行休眠一会,重新请求,直到获取到数据为止。
使用逻辑过期方案,就是在请求到数据发现失效了,则获取互斥锁,然后创建一个新线程,并返回过期数据,而新线程则去访问数据库,并将数据存储到缓存中,释放锁。在这期间如果有其他线程访问时,获取锁失败,则直接返回过期数据。
缓存击穿是指客户端的请求在缓存中没有找到数据,在数据库中也没有找到数据,最终这些请求都会到数据库中。
解决方案:
返回空对象就是哪怕这个数据不存在,也会将他存在缓存中,到时候再有请求就会返回一个空对象。
布隆过滤器是一个基于哈希冲突的思想来判断这个数据是否存在,如果判断不存在,直接拒绝这个请求,如果存在,则进入缓存中找,没有进入数据库中找,并存入缓存。
因为redis的读取速度很快,他是直接存储在内存中的,相对于传统数据库,redis的读取速度可以提高几十倍甚至上百倍。
而且redis支持持久化便于数据的备份、恢复。
支持事务,操作满足原子性。
并且缓存有过期机制。
高效的数据结构:String、Hash、Set、List、ZSet,并且大部分操作都在内存中完成。
多路复用IO模型:是指一个线程处理多个IO流,它是指将所有建立成功的连接陆续放入event_poll,event_poll会为这些长连接进行注册回调函数,当某一个长连接准备就绪后(建立连接成功、数据读取完成),就会通过回调函数写入event_poll的就绪队列rdlist,这样这个单线程就可以通过rdlist获取需要的数据。
redis集群其实就是将原来的单服务器变为多服务器,这样即使有一台服务器出问题了,其他服务器还会有备份数据,redis集群一共有三个运行方案:
主从同步
这是多机运行中最基础的一个,就是把主要存储数据的节点叫做主节点,把其他复制主节点的副本节点叫做从节点。类似于树状结构。
哨兵模式
因为主从同步有一个致命问题,就是如果主节点奔溃了,则需要人工干预才能恢复redis的正常使用,所有需要有一个自动的工具,Redis Sentinel(哨兵模式)来把手动过程变成自动的,让reids有自动恢复的能力。
Redis Cluster
Redis Cluster是Redis 3.0版本推出的集群方案,他是将数据分布在不同的服务区上,以此来降低对单主节点的依赖,就是可以有多个主节点,每个主节点也能有多个从节点,各个主节点不相互依赖,并且Redis Cluster也有自动恢复的机制。
q注:本篇文章都是我自己的理解,可能用词和语句不够严谨,如有错误请评论指正,谢谢!(持续更新中......)