Redis是一个高性能的key-value数据库,完全是开源免费的,而且他还是一个NOSQL数据库(非关系型数据库),支持多种数据类型,如:字符串、链表、哈希表、集合等等,为解决高并发、高扩展、大数据储存等一系列数据问题而产生的数据库解决方案。
优点
读写速度快
支持数据永久化到磁盘
丰富的数据结构
保持原子性,支持事务
支持主从机制,读写分离,主机自动把数据同步到从机
应用场景
数据缓存,把一些需要频繁访问的数据,但是短时间内又不会发生变化的,都放入redis中进行操作,提高用户请求的速度以及降低网站负荷,降低数据库读写次数。
常用的实时计算功能,比如统计,把实时变化和展示功能的相关数据放入redis中,提高效率。
消息队列,构建类似于实时聊天的系统功能,提高应用可用性。
Redis复制流程
Redis复制功能基于内存快照(内存储存和备份)的持久化策略基础上,无论持久化策略选择什么,用到了redis复制功能,都一定有内存快照发生。
Redis在slave端和master端流转流程
1.slave端在配置文件添加slave of指令,slave启动时读取配置文件,初始状态为REDIS_REPL_CONNECT。
2.slave端在定时任务servcron中连接master,发送sync指令,然后阻塞等待master发送回内存快照文件。
3.master端接收到sync命令简单判断是否有正在进行的内存快照子进程,没有则立即开始内存快照,有则等待其结束,快照完成后将文件发送给slave端。
4.slave接收到master端发送过来的内存快照文件,保存到本地,接收完成后,清空内存表,重新读取master端发送过来的内存快照文件,重新构建整个内存表数据结构,更新状态为REDIS_REPL_CONNECTED,slave状态流转完成。
Redis复制流程缺陷
slave从库连接master主库时,master会进行内存快照,把整个内存快照文件发送给slave,如果这时候因为网络或者其他原因与master断开了连接,那么当slave重新连接时,需要重新获取整个master的内存快照文件,slave端所有数据都会跟着清除,重建整个内存表,造成的后果是slave恢复时间慢和主库压力的增加。
Redis可扩展集群之主动复制避开redis复制缺陷
采用主动复制来搭建我们的集群环境,主动复制指的是业务端或者通过代理中间件的方式对redis储存进行双写或者多写,通过数据的多份储存来达到与复制的相同目的,还可以解决mysql主从之间的复制延迟问题,通过主动复制,数据多份储存就不用担心reids单点故障发生,一组redis集群挂掉,可以让业务迅速切换到另一组redis上,降低业务风险,缺点是存在数据一致性的问题,因为数据被写入多次,可以通过时间戳或者vector clock等让客户端对多份数据进行校验,保持数据最终一致性。