六、redis中AKF问题解决方案
导读
前面文章【一、深入理解redis之需要掌握的知识点 】中,我们对redis需要学习的内容框架进行了一个梳理。
【二、redis中String和List两种数据类型和应用场景 】、【二、redis中Hash、Set、SortedSet应用场景 】两篇文章我们对redis中String、List、Hash、Set、SortedSet五种数据类型做了一下讲解,并且对他们各自的应用场景进行了介绍。
【三、redis数据存储之跳跃表(SKIP LIST) 】深入学习了支撑SortedSet排序背后的数据结构,跳跃表;
【四、redis持久化之RDB与AOF 】学习了redis中的两种持久化策略:RDB(快照)和AOF(追加日志);
【五、redis集群进化过程 】文章中我们学习了redis集群的进化过程,包括解决单点故障问题和性能瓶颈问题等。
本章我们将要讲解Redis使用过程中及集群进化过程中AKF问题的解决方案。
如果大家在工作、学习、面试中针对redis还有什么疑问或者其他问题,可以评论区告诉我。
为了保证可以连续不间断地获取最新的技术分析及讲解,建议关注本博客【不吃_花椒】。
图示
解释
AKF(X-Y-Z)问题:
1.X轴:主从复制的全量同步解决了单点故障问题,也就是AKF理论中的X轴。
2.Y轴:按照不同的业务使用不同的redis服务。订单、用户、支付等都使用不同的服务。也就是AKF理论中的Y轴。
3.Z轴:解决单业务中的数据膨胀问题,使用分片模式。使用哈希取摩等散列算法进行散列。例如用户信息、订单信息、商品详情等日请求数据量特别大的问题。
同业务分治需要解决的问题:客户端散列、代理层散列(Twemproxy)、redis集群散列(包含散列路由、无主模型)
1.分区的好处
分区可以让redis管理更大的内存,redis将可以使用所有机器的内存;
分区可以使redis的计算能力通过简单的增加计算机得到成倍的提升,redis的网络带宽也会随着计算机和网卡的增加而成倍的增长;
2.分区的概念
范围分区:
将不同范围的对象映射到不同的redis实例。比如用户ID从0-10000的都被存储到R0,用户ID从10001到20000被存储到R1,依次类推。需要redis中key的形式为object_name:形式。这种分区方案需要维护一张数据到redis实例的映射关系。
-效率较低,要求高。
散列分区:
散列分区分两步进行。
①使用散列然互(如crc32)将redis的键名转换成一个数字。例如:键foobar,使用crc32(foobar)函数将产生散列值93024922.
②对转换后的散列值进行取模运算,以产生一个0-3的数字,以便可以使这个key映射到4个redis实例的其中一个。93024922%4等于2,所以foobar会被存储到第2个redis实例。
-效率高,伸缩性差。
一致性哈希分区:
一致性哈希算法可以按照不同的业务特点进行哈希倾斜或增加虚拟哈希节点形成均匀的一致性哈希环。
一致性哈希算法分为以下几步
① 先计算各个节点(ip:port)的哈希值,哈希值是一个0-Integer.MAX_VALUE之间的值。
②
0-Integer.MAX_VALUE按照顺时针形成一个封闭的哈希环,计算出的哈希值会落到这个hash环的某个点上,至此我们把多个服务器分散映射到了哈希环上。③
当用户在客户端进行请求时,首先根据hash(用户id)计算路由规则(hash值),然后看hash值落到哈希环的那个位置,根据哈希值在哈希环的位置顺时针找距离最近的IP作为路由的服务IP。
一致性哈希算法需要注意以下几个特性:
单调性(如果一些请求通过哈希分派到了相应的服务器进行处理,又有新服务器加入系统时候,应保证原有的请求可以被映射到原有的或者新的服务器中而不会被映射到其他服务器)、分散性(好的哈希算法应该尽量避免尽量降低分散性)、
平衡性(指负载均衡,客户端hash后的请求应该能够分散到不同的服务器上去,并且每个服务器处理的请求数量大致相同)
3.不同的分区实现方案-分区可以在程序的不同层次实现
客户端分区:
在客户端就已经决定了数据会被存储到哪个redis节点。
代理分区:
客户端把请求发送给代理程序,代理程序根据分区规则把数据发送到不同的redis节点,然后根据redis的响应结果返回给客户端。Redis和memcached都使用同一种代理实现Twemproxy。
查询路由:
客户端可以随机的向任何一个redis服务器发送请求,由redis服务器集群内部根据算法把请求转发到正确的redis服务器。RedisCluster实现了一种混合形式的查询路由,但并不是在内部由一个redis转发到正确的redis,而是在客户端的帮助下直接redirected(重定向)到正确的redis节点。
4.分区的缺点
①多个key之间的交集、并集等操作不再刻意进行;
②同时操作多个key时候,不再可以使用事物;
③数据备份会非常复杂,需要到不同的服务器进行RDB文件和AOF文件的备份;
④动态伸缩非常复杂(目前只有在redis集群中才可以实现最大程度的对用户透明的数据再平衡,但是其他一些客户端分区和代理分区则不支持该特性),除了redis集群外,还有预分片技术。
6.使用预分片技术可以解决redis作为持久化存储时的动态扩容/缩容问题。
使用redis主从复制技术可以很快解决数据迁移问题。
7.redis分区实现:
①redis集群技术是自动分片和高可用的首选方案(20150401后可用)。
②twemproxy 是twitter维护的缓存代理系统。代理memcached的ASCII协议和redis协议。
① 支持一致性哈希的客户端如redis-rb和Predis.
如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒
后续redis中将要讲解的内容梳理
往期文章
Redis
一、深入理解redis之需要掌握的知识点
二、redis中String和List两种数据类型和应用场景
二、redis中基础数据类型Hash、Set、SortedSet及其应用场景
三、redis数据存储之跳跃表(SKIP LIST)
四、redis持久化之RDB与AOF
五、redis集群进化过程简单梳理
Java集合
一、深入理解-Java集合初篇
二、Jdk1.7和1.8中HashMap数据结构及源码分析
三、JDK1.7和1.8HashMap数据结构及源码分析-续
四、深入理解Java中的HashMap「网易面试快答」
五、深入理解JDK1.7中HashMap哈希冲突解决方案
六、深入理解JDK1.8中HashMap哈希冲突解决方案
七、JDK1.7中HashMap扩容机制
八、JDK1.8中HashMap扩容机制
Java-IO体系
一、C10K问题经典问答
二、java.nio.ByteBuffer用法小结
三、Channel 通道
四、Selector选择器
五、Centos-Linux安装nc
六、windows环境下netcat的安装及使用
七、IDEA的maven项目的netty包的导入(其他jar同)
八、JAVA IO/NIO
九、网络IO原理-创建ServerSocket的过程
十、网络IO原理-彻底弄懂IO
十一、JAVA中ServerSocket调用Linux系统内核
十二、IO进化过程之BIO
十三、Java-IO进化过程之NIO
十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型
十五、使用Selector(多路复用器)实现Netty中Reactor主从模型
十六、Netty入门服务端代码
十七、IO进化过程之EVENT(EPOLL-事件驱动异步模型)
如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒
六、redis中AKF问题解决方案相关推荐
- Redis中AKF原则的应用
Redis 单机 .单节点.单实例 缺点:1. 单点故障(一台服务如果挂了,整个系统不可用了)2. 容量有限3. 压力 过大 为了解决 单机的 问题 ,引入了AKF 原则 AKF X轴:直接水平复制应 ...
- redis中数据倾斜问题的产生和解决方案
在服务端系统服务开发中,缓存是一种常用的技术,它可以提高系统对请求的处理效率,而redis又是缓存技术栈中的一个佼佼者,广泛的应用于各种服务系统中.在大型互联网服务中,每天需要处理的请求和存储的缓存数 ...
- Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)
一.概述 ① 缓存穿透:大量请求根本不存在的key(下文详解) ② 缓存雪崩:redis中大量key集体过期(下文详解) ③ 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热 ...
- Redis系列之key操作命令与Redis中的事务详解(六)
From: http://www.cnblogs.com/knowledgesea/p/5008594.html 序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查 ...
- 一文详解Redis中BigKey、HotKey的发现与处理
简介: 在Redis的使用过程中,我们经常会遇到BigKey(下文将其称为"大key")及HotKey(下文将其称为"热key").大Key与热Key如果未能及 ...
- Redis中ZSet的底层数据结构跳跃表skiplist,你真的了解吗?
欢迎大家关注我的微信公众号[老周聊架构],Java后端主流技术栈的原理.源码分析.架构以及各种互联网高并发.高性能.高可用的解决方案. 一.前言 老周写这篇文章的初衷是这样的,之前项目中有大量使用 R ...
- 函数指针--Nginx和Redis中两种回调函数写法
1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connectio ...
- redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set?
转载:https://blog.csdn.net/wab719591157/article/details/73379844 redis 中存数据时,到底什么时候用 hset 相比于 set 存数据 ...
- 阿里二面:Redis 中的 AOF 文件太大了怎么办?
一.前言 写这篇文章的目的是来自我的一位粉丝的投稿,说面试阿里被问到了这个问题.不得不说阿里的面试问的都挺有质量,一般的我们只会关注 Redis 的两种持久化方式 RDB 和 AOF.但老周这里盲猜面 ...
最新文章
- karyoploteR: 基因组数据可视化 R 包
- centos linux 系统上 log4j打印的时间与CST时间差8小时的解决方法
- Win2003配置邮件服务器
- yolov3yolov4yolov5比较
- Python脚本模拟登录网页之CSDN篇
- python蟒蛇代码_011 实例2-Python蟒蛇绘制
- (int),Int32.Parse,Convert.ToInt3…
- 555定时器回差电压计算公式_555定时器及其应用
- 新浪微博客户端(26)-添加转发评论工具条
- 聊聊V8引擎的垃圾回收
- yagmail发送带图片和链接的邮件
- vc2005运行库彻底卸载_VC2005运行库-解决方案
- ipixsoft swf to html5 converter,iPixSoft SWF to Video Converter(视频转换软件)
- 计算机基础——网卡(网络适配器network adaptor)
- 宇枫资本工薪族理财启发
- Acrel-1200分布式光伏运维平台
- 高中英语选修计算机,高中英语课堂
- 螺栓、螺柱、螺钉的分类
- Typora+gitee+PicGo+坚果云 实现Typora文件的保存完整保存
- Node.js详细下载与安装