Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis需要代理吗?

Redis需要代理吗?

作者头像
灬沙师弟
发布于 2023-07-08 08:57:41
发布于 2023-07-08 08:57:41
3770
举报
文章被收录于专栏:Java面试教程Java面试教程

引言

大家好,我是了不起。

前面我们聊到redis根据AKF拆分理论根据Y、Z轴拆分的相关知识,相信大家对redis扩展有了一定认识。

没有看过往期的建议先挨个看了在看本文。

往期期文章:

剑指 Offer:一文带你吃透麻辣鲜香的redis数据类型!

下馆子也能造成redis缓存雪崩?redis缓存击穿?

天啦!成都8月限电,突然拉闸,几十亿数据丢了...

大环境不好?前同事斩获30K的Offer就是用的这套redis谈资

[大环境不好]那是因为你没有掌握这项redis技术二!

大环境不好?来看看前同事30K月薪掌握了什么技术!

上期说到redis扩展,我们可以通过在Client端增加取模、随机、一致性哈希算法去实现,我们来做个大胆的实践推论。

客户端实现有问题吗

了不起上期所画的原理图中,可以清晰的看到,我们所实现的算法都在客户端。

现在假设我们有2个redis实例。

在真正的项目中,我们的微服务Client一般都有多个,有的甚至几十个,我们这里不说多了,就拿4个客户端。

client01、client02、client03、client04,这4个客户端是不是都要和后面的redis进行连接。client01和redis01连接、redis02连接,02、03、04同样也需要连接。

那么势必造成redis端的连接成本维护,只要客户端一多,连接成本直线上升。

增加代理层

如果你用过Nginx反向代理,那么你应该很轻松的就能联想到用代理来解决这个连接的问题。

每个redis实例只需要和代理进行连接就可以了。

而在代理层,我们只需要关注它的性能即可。

当大量client并发过来的时候,1台代理也撑不住了。

我们可以将代理层也反向代理了,加多一层负载均衡器

通过使用LVS这个负载均衡器,在结合keepailved对LVS做一个主备,并且能监控到后端代理的健康状况。

这不过仅仅是我们自己的想法,这样一来反而有点因为技术而技术的赶脚了。

Redis作者本身也没有把Redis搞成多线程的,也不希望我们搞得更加复杂,那么我们前面讲了那么多,就是找一个代理层就可以了。

代理层应该是什么样

上期我们说到client端是有拆分算法的,那么我们就应该将算法放到代理层。

并且这个代理是无状态的。

我们去回忆下nginx,它就是无状态的,不管你前边和后边有多么复杂,有怎么样的数据逻辑交互,它都不关心。

也不需要关心,就只管做好自己代理转发的这个事情。

代理层应该具备的算法是:

  • modula
  • random
  • kemata

在kemata一致性哈希算法中,又有多个可以实现的方式:

  • one_at_a_time
  • md5
  • crc16
  • crc32 (crc32 implementation compatible with libmemcached)
  • crc32a (correct crc32 implementation as per the spec)
  • fnv1_64
  • fnv1a_64 (default)
  • fnv1_32
  • fnv1a_32
  • hsieh
  • murmur
  • jenkins

实现redis代理的有哪些

  • twemproxy
  • predixy
  • cluster
  • codis

预分区

那么我们在思考下,这三种代理层算法或者模式好像都会有一个问题。

那就是不能作为数据库使用。

还有一种情况就是在我们使用过程中,redis实例的数量会随着我们业务的变化增加或者减少。

比如现在5月份有2台redis实例,到了年底由于业务的增加我们要扩展一台redis。

这个时候势必我们要迁移数据,就会对代理层的算法带来挑战,比如你之前使用的是hash,那么此次肯定就要所有数据重新hash了,也就是大家常听的rehash,要将数据重新分片。

那我们是不是也可以解决这种问题,比如我一开始就计划分区10个,至少到我业务增加到10台redis实例的时候,我都不用去改动,这个就叫做预分区。

什么意思,我来举个例子。

比如我们使用的是取模算法,我就取10个节点,数据分片是0.1.2.3.4.5.6.7.8.9。

一开始我就只有2台,我的数据分片是redis1有0.1.2.3.4,redis2有5.6.7.8.9。当我新增一台redis3时,只需要将redis1中分片3.4和redis2中分片8.9迁移到redis3中,就可以了。

此时重新建立mapping映射关系即可,迁移分片数据这个redis官方有操作,非常简单可靠,这样数据迁移就很方便了。

这种方式就不会影响你之前的算法,就是说你之前的算法找到当前这个数据在哪个分片,它这个数据还是在哪个分片里边,不会因为redis实例变化而重新改变算法。

redis cluster

接着上边的映射关系,其实redis自身连代理层都给你省了,有一个自身实现的无主模型。

也就是说redis客户端连谁都不重要,每个redis服务端的实例都是主。

它每个都有一样的算法比如hash%10,然后每个节点都保存着所有实例的映射关系,如图所示。

假如客户端要来get一个k1这个key,而这个k1经过哈希取模后得知数据存在第4个槽位或者是第四个分片。

当前客户端连着的是中间的redis2,指令到达redis2后经过算法一算,发现数据在分片4,然后发现自己没有分片4,在查询所有映射关系,找到分片4在redis3中。

返回给客户端说你去连接redis3获取,随后客户端切换到redis3,经过一样的步骤拿到分片4中的数据,然后返回。

总结

不过上边给的代理模式还是redis自身的cluster来说,都有一个问题,其实也不是问题,技术必然有取舍。

比如在redis cluster中我想要聚合2个key,一个key在分片3中,一个key在分片1中,你怎么办。

所以数据分治想聚合(取交集、并集、差集等)很难实现,当然了事务也很难实现,所以这就是redis作者的取舍,让计算向数据移动。

redis的特点就是快,要的就是效率,所以有些功能它就不支持,这是合理的。

经过本文的探讨,相信你对redis代理层、算法、redis自身的cluster模式有了一定的了解,下期我们接着聊。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java面试教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路
知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能。本文作者陈鹏是该系统的负责人,本次文章深入介绍了该系统的方方面面,值得互联网后端程序员仔细研究。
JackJiang
2018/09/18
3.3K0
Redis Cluster深入与实践(续)
前文回顾 上一篇文章基于redis的分布式锁实现写了基于redis实现的分布式锁。分布式环境下,不会还使用单点的redis,做到高可用和容灾,起码也是redis主从。redis的单线程工作,一台物理机只运行一个redis实例太过浪费,redis单机显然是存在单点故障的隐患。内存资源往往受限,纵向不停扩展内存并不是很实际,因此横向可伸缩扩展,需要多台主机协同提供服务,即分布式下多个Redis实例协同运行。 在之前的文章Redis Cluster深入与实践介绍过Redis Cluster的相关内容,之前特地花
aoho求索
2018/04/03
1.2K0
Redis Cluster深入与实践(续)
Redis集群详解
z轴:优先级、逻辑再拆分。比如说某个模块数据过多,可以拆分为多个Redis客户端,全量数据分为多份,每个Redis中存一部分数据。
星哥玩云
2022/08/18
4320
Redis集群详解
Redis分片机制
前两篇文章对Redis主从复制和主从切换的知识点进行了介绍,但是也很明显的有一点小弊端:
创译科技
2019/09/30
6.3K0
初识Redis · 集群
在我们前文介绍的主从复制,主从模式+哨兵模式下,确实能够提高Redis的高可用性,但是不管是主从模式还是加上了哨兵,总的数据容量还是只有一个节点那么大,那么问题来了,在提高高可用的基础上,我们能不能有效的扩展Redis整体的存储容量呢?
_lazy
2025/05/01
730
初识Redis · 集群
Redis 集群演进探讨和总结
Redis单点故障,可以通过主从复制replication,和自动故障转移sentinel哨兵机制。
斯武丶风晴
2020/05/26
3490
Redis+Twemproxy分片存储实现
Redis的安装这里不再多讲,相关步骤可从官网或其它渠道得到。为安装redis多实例,这里简单提前创建完相关文件夹。其中redis存放应用程序,redis1/redis2/redis3仅存储配置文件。
MavenTalker
2019/07/19
7580
【大厂求职必备】Redis分区(分片)技巧
分片,Redis 数据的分布方式,分片就是将数据拆分到多个 Redis 实例,这样每个实例将只是所有键的一个子集。
JavaEdge
2021/10/18
2.5K0
使用 twemproxy 构建 Redis 集群
twemproxy 简介 twemproxy(又称 nutcracker)是 Twtter 贡献的一个 轻量级 高性能 的 redis/memcached 代理 client --> twemproxy --> redis/memcached ... twemproxy 的主要目的是减少与后端缓存服务器的连接数,并通过流水线化的协议与分片功能,方便我们构建可水平扩展的分布式缓存架构 特点 快、轻量 维护持久连接,使缓存服务器的连接数很低 命令请求与响应的流水线化,提升性能 跨服务器自动分片 配置简单 支持一
dys
2018/04/04
8360
使用 twemproxy 构建 Redis 集群
015:Redis-Codis
border="0" width="530" height="96" src="//music.163.com/outchain/player?type=2&id=369265&auto=1&heig
李玺
2021/11/22
4490
015:Redis-Codis
深入剖析Redis客户端Jedis的特性和原理
Redis作为目前通用的缓存选型,因其高性能而倍受欢迎。Redis的2.x版本仅支持单机模式,从3.0版本开始引入集群模式。
2020labs小助手
2021/11/02
1.9K0
4种 Redis 集群方案介绍+优缺点对比
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/05/06
2.3K0
4种 Redis 集群方案介绍+优缺点对比
Redis从入门到放弃(9):集群模式
前面文章我们介绍了Redis的主从模式是一种在Redis中实现高可用性的方式,但也存在一些缺点。
夕阳也是醉了
2023/10/16
3500
Redis从入门到放弃(9):集群模式
Redis入坟(六)分布式集群,概念、原理、实操
可用性、数据安全、性能都可以通过搭建多个 Reids 服务实现。其中有一个是主节点(master),可以有多个从节点(slave)。主从之间通过数据同步,存储完全相同的数据。如果主节点发生故障,则把某个从节点改成主节点,访问新的主节点。
源码之路
2020/09/04
8450
Redis入坟(六)分布式集群,概念、原理、实操
【深入解读Redis系列】Redis系列(五):切片集群详解
假设一台 32G 内存的服务器部署了一个 Redis,内存占用了 25G,会发生什么?
程序员朱永胜
2023/09/01
2.1K0
【深入解读Redis系列】Redis系列(五):切片集群详解
如何快速搭建Redis集群及理解其实现原理
Codis使用Go语言开发,它是一个代理中间件,和Redis一样也使用Redis协议对外提供服务,当客户端向Codis发送指令时,Codis负责将指令转发到后面的Redis实例来执行,并将结果返回给客户端
AI码师
2020/11/19
4370
如何快速搭建Redis集群及理解其实现原理
Redis常见集群方案
随着Redis中保存数据越来越多,单个Redis节点已不堪负重,需要引入Redis集群方案,Redis常见集群方案有:client分片方案、基于代理方案、redis cluster方案。
luoxn28
2019/11/06
1.5K0
Redis常见集群方案
谈谈Redis的各种集群方案、及优缺点对比
在服务开发中,单机都会存在单点故障的问题,及服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出现了,将同一服务部署到多台机器上,即使其中几台服务器宕机,只要有一台服务器可用服务就可用。
业余草
2021/12/06
1.1K0
谈谈Redis的各种集群方案、及优缺点对比
技术分享 | Redis 集群架构解析
当我们只使用一台 Redis 实例也就是 Single 架构时,需要考虑一些非常实际的问题,如:单节点一但宕机则业务停摆、单节点的容量不可能是无限制的、性能同样存在瓶颈等......
爱可生开源社区
2022/12/07
4160
Redis常用集群以及性能压测实战
背景 众所周知,Redis是一款性能强悍的中间件。那么它的性能到底多强,大家也是只拿到的是官方给到的数据,那么真实情况是否真的是这样? 带着这个疑问,挑选了Redis单机与集群做压测,得到性能数据,并
得物技术
2022/08/11
2.8K1
Redis常用集群以及性能压测实战
相关推荐
知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档