分布式缓存
单节点redis的问题:
1)数据丢失的问题,redis是基于内存来进行存储的,当服务器重启的时候可能会丢失数据
2)无法满足高并发场景
3)如果redis宕机,那么这个服务不可用,所以就需要有一种自动的故障恢复手段,必须保证redis集群出现故障,是不能影响其他集群的使用的,边服务边修复
4)Redis是基于内存来进行存储的,单个节点存储的数据是很难满足海量数据的需求的
4.1)数据丢失问题:实现Redis持久化
4.2)并发能力问题:搭建主从集群,实现读写分离,从节点是具有很多个的,那么从节点之间就是一种负载均衡的策略,而主从之间又需要做读写分离,是应对数据库中读和写的这种互斥,读和写之间就不会相互影响,还要依靠哨兵机制来做健康检测和故障恢复;
4.3)存储能力问题:搭建分片集群,利用插槽机制来实现动态扩容
一)Redis持久化方式---RDB
RDB全称为Redis Database Backup file也被称之为是Redis数据快照,简单来说就是把内存中的所有数据都保存到磁盘里面,当Redis进行实例故障重启之后,再从磁盘读取快照文件,恢复数据,快照文件又被称为是RDB文件,默认是保存在Redis的当前运行目录
1)save:就成功完成了RDB操作,这个操作是由Redis的主进程来执行命令的,此时他会阻塞所有命令,这个时候如果由用户来进行读操作,无法执行成功,RDB是将数据写入到磁盘里面,但是磁盘的IO往往是比较慢,如果你的数据量比较大,那么执行这个操作的耗时就会比较久,等待他执行完成,最终才会返回一个OK,此时才算结束,主进程才有能力处理其他的命令;主要是适用于Redis用完了,马上就要停机,不想玩了,提及时会自动进行RDB;
2)bgsave:redis此时会立即返回一个Background saving started,后台保存开始了,redis会是开启一个子进程来进行执行RDB操作,避免主进程来受到影响,这种方式比较适用于Redis在进行运行的时候去做;
3)Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:
save 5 1代表5s内只要有一个Key被修改就会自动执行RDB操作,这样每隔一段时间就进行一次RDB那么数据的持久性就可以得到保障了,在服务器关机前会执行RDB操作;
4)但是如果说在5s之内我进行数据的保存工作,这时刚好没持久化,服务器宕机,那么数据会丢失,如果你RDB设置时间太长你没有及时在服务器宕机之前进行持久化操作,那么数据会丢失,但是太短也不行,RDB执行频率过高,如果数据量特别大,10G写入到磁盘,时间IO会吃满,所以使用RDB是存在问题的;
5)RDB中的其他配置也是可以在redis.conf中进行配置的
1)在bgsave开始的时候,会fork主进程得到子进程,子进程共享主进程中的内存数据,完成fork之后读取内存数据写入到RDB文件里面,主进程会开启一个子进程来完成对内存数据的读取并写入到RDB文件中,几乎做到对主进程的0阻塞,fork主进程得到子进程的过程是阻塞的,此时主进程只能创建子进程,不能接受用户发送的其他命令,所以说fork的速度要足够快,避免阻塞太长时间,才能让主进程尽快地去完成用户的请求