Redis持久化机制总结

目录

1. 简介

2. 为什么要用redis?

3. 为什么要用 redis 而不用 map/guava 做缓存?

4. redis相比memcached有哪些优势?

5. 应用场景

6. 特点

7. 优缺点

8. Redis 为什么是单线程?

9.  redis主从同步原理

10.  redis 持久化机制

11. 缓存雪崩和缓存穿透问题解决方案

12. redis常见性能问题和解决方案


1. 简介

Redis 是一个基于内存的高性能key-value非关系型数据库。也是基于内存运行支持持久化的NoSQL数据库,也称为数据结构服务器。

简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以存写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。

2. 为什么要用redis?

(1) 高性能

(2) 高并发

3. 为什么要用 redis 而不用 map/guava 做缓存?

缓存分为本地缓存和分布式缓存。

map 或者 guava 实现的是本地缓存,特点是轻量、快速,生命周期随着 jvm 的销毁而结束,在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。

edis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性

4. redis相比memcached有哪些优势?

memcache定义:一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)使用key-value存储。

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型;

(2) redis的速度比memcached快很多;

(3) redis可以持久化其数据;

5. 应用场景

(1) 会话缓存(Session Cache)

(2) 全页缓存(FPC)

(3) 队列

(4) 排行榜/计数器

(5) 发布/订阅

6. 特点

(1) 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

(2) 支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

(3) 支持数据的备份,即master-slave模式的数据备份。

(4) 支持事务

7. 优缺点

优点:

(1) 速度快:因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string(字符串),list(列表),Set(集合)、Sorted Set(有序集合)、Hash(哈希)

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

缺点:

数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上

8. Redis 为什么是单线程?

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,瓶颈最有可能是机器内存的大小或者网络带宽,故采用单线程的方案。

Redis 单线程为什么快?

(1) 纯内存操作

(2) 单线程操作,避免了频繁的上下文切换

(3) 采用了非阻塞I/O多路复用机制

9.  redis主从同步原理

Redis主从复制可以根据是否是全量分为全量同步和增量同步。

初次全量同步:

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
  1)从服务器连接主服务器,发送SYNC命令;
  2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
  4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
  5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
  6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

增量同步:

Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。

增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

10.  redis 持久化机制

redis持久化分为:RDB持久化(快照持久化)、AOF持久化

RDB持久化:

Redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis性能),还可以将快照留在原地以便重启服务器的时候使用(Redis默认采用的持久化方式)

AOF持久化:

将每条写命令作为日志,以append-only模式写入一个日志文件,在Redis重启时,通过回放日志中的写入指令来重构整个数据

与快照持久化相比,AOF持久化 的实时性更好,因此已成为主流的持久化方案。默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启。

11. 缓存雪崩和缓存穿透问题解决方案

1) 缓存雪崩:

定义:缓存同一时间大面积的失效,导致后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决办法:

(1)给缓存的失效时间,加上一个随机值,避免集体失效。

(2)使用互斥锁,但是该方案吞吐量明显下降了。

(3)双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。

2) 缓存穿透

定义一般是黑客故意去请求缓存中不存在的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决办法:

(1)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

(2)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。

(3)提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出请求所携带的Key是否合法有效。如果不合法,则直接返回。

12. redis常见性能问题和解决方案

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值