redis 集群

Redis突然变慢,排查发现是BigKey惹的祸 现象可能原因所有命令都变慢BigKey阻塞特定命令变慢该命令操作了BigKey内存突然增长写入了BigKey主从同步延迟BigKey传输这次的坑:Session数据只写不删,时间一长变成了18万字段的BigKey。教训Redis的Key一定要设置过期时间避免使用HGETALL等全量命令定期扫描BigKey,加入监控有问题评论区交流~ 阅读详情

应用
我们的Redis集群主要承担了以下服务:
1. 实时推荐
2. 用户画像
3. 诚信分值服务

集群状况
集群峰值QPS 1W左右,RW响应时间999线在1ms左右
整个集群:
1. Redis节点: 8台物理机;每台128G内存;每台机器上8个instance
2. Sentienl:3台虚拟机

集群方案

Redis Node由一组Redis Instance组成,一组Redis Instatnce可以有一个Master Instance,多个Slave Instance

Redis官方的cluster还在beta版本,参看Redis cluster tutorial
在做调研的时候,曾经特别关注过KeepAlived+VIP 和 Twemproxy
不过最后还是决定基于Redis Sentinel实现一套,整个项目大概在1人/1个半月

整体设计
1. 数据Hash分布在不同的Redis Instatnce上
2. M/S的切换采用Sentinel
3. 写:只会写master Instance,从sentinel获取当前的master Instane
4. 读:从Redis Node中基于权重选取一个Redis Instance读取,失败/超时则轮询其他Instance
5. 通过RPC服务访问,RPC server端封装了Redis客户端,客户端基于jedis开发
6. 批量写/删除:不保证事务

RedisKey
[java] view plaincopy
public class RedisKey implements Serializable{
private static final long serialVersionUID = 1L;

//每个业务不同的family  
private String family;  

private String key;  

......    
//物理保存在Redis上的key为经过MurmurHash之后的值  
private String makeRedisHashKey(){  
    return String.valueOf(MurmurHash.hash64(makeRedisKeyString()));  
}  

//ReidsKey由family.key组成  
private String makeRedisKeyString(){  
    return family +":"+ key;  
}  

//返回用户的经过Hash之后RedisKey  
public String getRedisKey(){  
    return makeRedisHashKey();  
}  
.....  

}

Family的存在时为了避免多个业务key冲突,给每个业务定义自己独立的Faimily
出于性能考虑,参考Redis存储设计,实际保存在Redis上的key为经过hash之后的值

接口
目前支持的接口包括:
[java] view plaincopy
public interface RedisUseInterface{
/**
* 通过RedisKey获取value
*
* @param redisKey
* redis中的key
* @return
* 成功返回value,查询不到返回NULL
*/
public String get(final RedisKey redisKey) throws Exception;

/** 
 * 插入<k,v>数据到Redis 
 *  
 * @param redisKey 
 *           the redis key 
 * @param value 
 *           the redis value 
 * @return  
 *           成功返回"OK",插入失败返回NULL 
 */  
public String set(final RedisKey redisKey, final String value) throws Exception;  

/** 
 * 批量写入数据到Redis 
 *  
 * @param redisKeys 
 *           the redis key list 
 * @param values 
 *           the redis value list 
 * @return  
 *           成功返回"OK",插入失败返回NULL 
 */  
public String mset(final ArrayList<RedisKey> redisKeys, final ArrayList<String> values) throws Exception;  


/** 
 * 从Redis中删除一条数据 
 *  
 * @param redisKey 
 *           the redis key 
 * @return  
 *           an integer greater than 0 if one or more keys were removed 0 if none of the specified key existed 
 */  
public Long del(RedisKey redisKey) throws Exception;  

/** 
 * 从Redis中批量删除数据 
 *  
 * @param redisKey 
 *           the redis key 
 * @return  
 *           返回成功删除的数据条数 
 */  
public Long del(ArrayList<RedisKey> redisKeys) throws Exception;  

/** 
 * 插入<k,v>数据到Redis 
 *  
 * @param redisKey 
 *           the redis key 
 * @param value 
 *           the redis value 
 * @return  
 *           成功返回"OK",插入失败返回NULL 
 */  
public String setByte(final RedisKey redisKey, final byte[] value) throws Exception;  

/** 
 * 插入<k,v>数据到Redis 
 *  
 * @param redisKey 
 *           the redis key 
 * @param value 
 *           the redis value 
 * @return  
 *           成功返回"OK",插入失败返回NULL 
 */  
public String setByte(final String redisKey, final byte[] value) throws Exception;  

/** 
 * 通过RedisKey获取value 
 *  
 * @param redisKey 
 *           redis中的key 
 * @return  
 *           成功返回value,查询不到返回NULL 
 */  
public byte[] getByte(final RedisKey redisKey) throws Exception;  

/** 
 * 在指定key上设置超时时间 
 *  
 * @param redisKey 
 *           the redis key 
 * @param seconds 
 *           the expire seconds 
 * @return  
 *           1:success, 0:failed 
 */  
public Long expire(RedisKey redisKey, int seconds) throws Exception;  

}

写Redis流程
1. 计算Redis Key Hash值
2. 根据Hash值获取Redis Node编号
3. 从sentinel获取Redis Node的Master
4. 写数据到Redis
[java] view plaincopy
//获取写哪个Redis Node
int slot = getSlot(keyHash);
RedisDataNode redisNode = rdList.get(slot);

//写Master
JedisSentinelPool jp = redisNode.getSentinelPool();
Jedis je = null;
boolean success = true;
try {
je = jp.getResource();
return je.set(key, value);
} catch (Exception e) {
log.error(“Maybe master is down”, e);
e.printStackTrace();
success = false;
if (je != null)
jp.returnBrokenResource(je);
throw e;
} finally {
if (success && je != null) {
jp.returnResource(je);
}
}

读流程
1. 计算Redis Key Hash值
2. 根据Hash值获取Redis Node编号
3. 根据权重选取一个Redis Instatnce
4. 轮询读
[java] view plaincopy
//获取读哪个Redis Node
int slot = getSlot(keyHash);
RedisDataNode redisNode = rdList.get(slot);

//根据权重选取一个工作Instatnce
int rn = redisNode.getWorkInstance();

//轮询
int cursor = rn;
do {
try {
JedisPool jp = redisNode.getInstance(cursor).getJp();
return getImpl(jp, key);
} catch (Exception e) {
log.error(“Maybe a redis instance is down, slot : [” + slot + “]” + e);
e.printStackTrace();
cursor = (cursor + 1) % redisNode.getInstanceCount();
if(cursor == rn){
throw e;
}
}
} while (cursor != rn);

权重计算
初始化的时候,会给每个Redis Instatnce赋一个权重值weight
根据权重获取Redis Instance的代码:
[java] view plaincopy
public int getWorkInstance() {
//没有定义weight,则完全随机选取一个redis instance
if(maxWeight == 0){
return (int) (Math.random() * RANDOM_SIZE % redisInstanceList.size());
}

//获取随机数  
int rand = (int) (Math.random() * RANDOM_SIZE % maxWeight);  
int sum = 0;  

//选取Redis Instance  
for (int i = 0; i < redisInstanceList.size(); i++) {  
    sum += redisInstanceList.get(i).getWeight();  
    if (rand < sum) {  
        return i;  
    }  
}  

return 0;  

}

Redis集群 本章是基于CentOS7下的Redis集群教程,包括:单机安装RedisRedis主从Redis分片集群。 阅读详情

相关推荐

Redis搭建集群模式

Redis 搭建集群的优缺点优点:支持数据的水平扩展,可以处理大规模数据提供高可用性,节点失效时能够自动进行故障转移高并发性能缺点:配置和管理复杂度较高不支持多键操作,某些命令在集群模式下受到限制需要更多的资源和节点来维持高可用性和性能。

小李同学的博客 1万+

Redis-benchmark源码修改笔记——吞吐率(RPS)、平均响应时间、99%响应时间深入探究

这篇文章总结的是Redis的benchmark源码修改中增加一些性能测试指标所应思考的问题,以及解决问题的方法,权当本渣渣一篇笔记,如果您发现有疏漏错误之处,烦请留言指出! 如不清楚吞吐率(RPS)、平均响应时间、99%响应时间的概念请参考:性能测试的几个指标(并发数、吞吐率、响应时间、平均响应时间、99%响应时间) 1、原生Redis的两种主要性能测试指标 在原生的Redis benchm...

Magnum的博客 4503

超详细,多图文介绍redis集群方式并搭建redis伪集群

超多图文,对新手友好度极好。敲命令的过程中,难免会敲错,但为了截好一张合适的图,一旦出现一点问题,为了好的演示效果,就要从头开始敲。且看且珍惜。再认识redis集群前,若想先知道redis单机版的可查看,springboot整合redis。好了,下面开始了。每个redis实例可称为一个节点,安装redis并以默认端口启动是节点,不关闭,以另一个端口启动,是一个新节点。在另一台机器安装redis并启动,也是一个新节点。

caihuayuan5的博客 1204

如何评估Redis的性能

如果系统中出现了大 key、热 key 等,往往会导致 Redis 变慢,但是这个慢该如何界定?多久算慢?1秒还是3秒?这个肯定是没有标准答案,因为这个和你的硬件设备有关。硬件差一些,平时响应时间都是 1s,突然有个响应 3s,那肯定算慢。硬件好一些,平时响应都是 0.2s,突然有个响应 1s,那这个 1s 肯定算慢。所以这个没有固定数据。但是这个问题是有答案的。所以今天我就想来和大家聊一聊这个话题,我们该如何去评估自己 Redis 的性能。

Admans的专栏 1434

高通QCS2290 SecureBoot全流程实战:从密钥生成到NON-HLOS.bin生成

本文详细拆解了高通QCS2290平台SecureBoot安全启动技术的端到端实战流程。从开发环境搭建、RSA密钥对生成与证书链构建,到关键XML配置文件修改、固件编译与数字签名,最终完成NON-HLOS.bin集成打包,为嵌入式开发者提供了一份清晰、可操作的安全启动部署指南。

weixin_28273593的博客 299

扫地机器人全场景测试实战:从实验室到真实家庭的可靠性验证

本文深入探讨了扫地机器人从实验室到真实家庭的全场景测试方法,揭示了软硬件测试中的关键挑战。通过分析场景化测试的重要性,文章详细介绍了硬件耐久性、软件稳定性和环境适应性三大测试维度,并提供了真实家庭测试的实用方法论。消费者可重点关注清洁率、覆盖率等核心指标,同时了解测试工程师的私房建议,帮助选择更可靠的扫地机器人产品。

hhh00的博客 1076

如何监控Redis性能指标

在这篇文章中,我们提到了一些最有用的指标,您可以监控这些指标以密切关注您的Redis服务器。如果您刚刚开始使用Redis,那么监控下面列表中的指标将提供对数据库基础结构的运行状况和性能的良好可见性:LatencyEvictions最终,您将认识到与您自己的设备和用例特其他指标。当然,您监控的内容取决于您拥有的工具和可用的指标。有关收集Redis指标的分步说明,请参阅随附文章。

qq_31432773的博客 2416

42页Claude 3技术报告解读(Opus, Sonnet, Haiku)

在Claude 3模型中,增加了一个额外的原则到Claude的宪法中,以鼓励尊重残疾人权利,这一原则源自对集体宪法AI的研究。Claude 3模型的训练基于专有的混合数据集,包括截至2023年8月互联网上公开可用的信息,以及第三方提供的非公开数据、数据标注服务和付费承包商提供的数据,还有内部生成的数据。这些初始响应通常包含有害和有毒的内容。Claude 3模型家族在推理、编码和问答任务上展现出卓越的性能,特别是在行业标准基准测试中取得了显著的提升,证明了其在处理复杂问题和提供准确答案方面的能力。

具身机器人和通用AI 2436

测试redis响应时间

【代码】测试redis响应时间。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 234

为YOLOv11引入自适应特征融合模块(ASFF)

本文探讨了在YOLOv11中引入ASFF(自适应空间特征融合)模块以解决多尺度目标检测性能不均衡的问题。作者分析了传统FPN固定融合策略的缺陷,详细介绍了ASFF模块的实现原理,包括动态权重生成网络设计和特征融合机制。通过将ASFF集成到YOLOv11颈部网络,实现了特征在双向流动时的自适应融合,在复杂场景下mAP提升1.2%而推理时间仅增加3-5ms。文章还分享了训练调参技巧和部署注意事项,指出ASFF特别适合交通监控等目标尺度变化大的场景,但强调需根据实际需求平衡模型复杂度与性能。最后提供了工程实践建议

as1225120794的博客 320

记录:解决Ubuntu20.04安装ros报错E: Unable to locate package ros-kinetic-desktop-full【亲测有效】

报错:E: Unable to locate package ros-kinetic-desktop-full.尝试好久一直都无法下载,最后得知真相的我眼泪哗哗的直流。

**My Coding Family** 6万+

Redis 篇-初步了解 Redis 持久化、Redis 主从集群、Redis 哨兵集群、Redis 分片集群

在子进程写入磁盘过程中,主进程有可能会进行写操作,所有为了防止脏读的情况,在写数据的时候,将内存的数据进行拷贝,再来进行写操作。在 slave 加载 RDB 文件的时候,master 也会不断接收写操作的请求命令,这些命令会先保存到 repl_baklog 文件中,等待 slave 加载完成之后,master 发送 repl_baklog 中的命令到 slave 节点中,而 slave 节点接收到命令就会执行。重新启动该 Redis 服务之后,会自动从 RDB 文件中获取数据,重新将数据放到内存中。

小扳手 2584

开放平台实现安全的身份认证与授权原理与实战:使用OAuth 2.0实现授权码模式

作者:禅与计算机程序设计艺术 1.背景介绍 随着互联网应用的飞速发展,各种网站、App、小程序等都将逐渐向用户提供了丰富的功能和服务。在这些应用中,用户通常需要登录才能使用这些服务,这就涉及到用户信息的安全问题。如果用户的信息被泄露或篡改,那么可能造成严重后果。因此,为这些应用提供安全且健壮的身份验

AI天才研究院 494

单机部署Redis集群

我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。修改redis-6.2.4/redis.conf文件,将其中的持久化模式改为默认的RDB模式,AOF保持关闭状态。要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。

shall_zhao的博客 2389

032、准谐振反激变换器(QR-Flyback)原理

文章摘要: 本文以65W PD快充炸管案例切入,解析准谐振反激变换器(QR-Flyback)原理。通过主动利用漏感与MOS结电容的谐振,在Vds波谷开通实现近似ZVS,显著降低开关损耗与电压应力。对比传统反激,QR模式轻载效率提升8%,Vds尖峰减少23%。关键设计要点包括:变压器漏感需<3%、谷底检测电路需抗干扰、启动阶段需防过冲。推荐NCP1340等专用控制芯片,并强调VCC电容优选低ESR陶瓷材质。QR适用于30W-150W场景,其核心优势在于轻载效率优化,但需平衡漏感控制与可靠性。作者结合实测数据与

Jack010169的博客 116

搞定ESD(四):ESD干扰耦合路径深入分析(二)

静电放电过程中静电干扰主要通过三种间接耦合方式干扰敏感源,即电场耦合、磁场耦合、地弹。前文已经深入分析了静电放电过程中的电场耦合,今天就谈谈静电放电过程中的磁场耦合,也可以理解环路耦合。熟话说的好〝人往高处走,水往低处流〞,静电电流也会选择阻抗最低的路径返回到源端。静电电流流会源端的路径实际上就构成了电流环路,当敏感信号形成的电流环路与静电电流环路存在共环路时,就会将静电放电干扰耦合到敏感信号环路内,干扰敏感信号。

记得诚 2795

【Redis】集群

哨兵模式显著提升了 Redis 系统的可用性。然而,其核心数据存储仍然依赖于单个 Master 节点及其 Slave 副本。这意味着所有数据都需要完整地存储在这组主从节点上。当数据量极其庞大,接近甚至超出 Master/Slave 节点所在服务器的物理内存容量时,系统就可能面临严重问题。虽然硬件成本持续下降,大中型互联网公司的服务器内存容量已普遍达到 TB 级别,但在当今的“大数据”时代,1TB 内存也常常显得捉襟见肘。

2301_80224556的博客 970

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Redis集群之Redis分片集群

Redis集群搭建直接一步到位:支持海量数据以及高并发写分片集群顾名思义,将数据分开存储到Redis集群中,这样能够存储更多的数据,避免浪费资源,基础搭建如:三主三从(一拖一)、三主六从(一拖二),本次搭建采用一拖一,一拖二情况可根据文末图文介绍进行添加从节点即可。

AIGUO666666的博客 1546

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Windows下搭建Redis集群

一、首先下载好Redis的Windows版本,注意:Redis只有3.0之后的版本才有集群 1、下载好后直接解压,可看到这些目录   2、在解压的目录启动redis-server.exe启动redis服务,出现下图的效果则说明redis服务启动成功   二、搭建Redis集群   首先构建集群的节点目录,注意:集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强...

青衫 2万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Redis 集群

现今 Redis 在很多业务场景,使用越来越广泛。在互联网发展的今天,网站的稳定性和高可用性不言而喻。随着技术的发展,集群方案层出不穷,目前 Redis 集群的实现方法 一般有客户端分片、代理分片和服务器端分片三种解决方案。

2301_77081516的博客 1177

【Redis】redis集群模式

Redis集群,即Redis Cluster,是Redis 3.0开始引入的分布式存储方案。实际使用中集群一般由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。集群的作用,可以归纳为两点:1、数据分区:数据分区(或称数据分片)是集群最核心的功能。集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;

margu_168的博客 1401

Redis集群总结

Redis自动化检测主节点是否在工作,当主节点宕机后集群自动能够替换上去Cluster由多个主从节点组组成,每个主从节点组上的数据没有交集一个Redis组有多个Slot槽位,整个Cluster由2^14个槽位,经过路由确定在某个实例上每个Master至少有一个Slave。

SS_G_SS的博客 1605

redis集群

集群,即RedisCluster,是Redis3.0开始引入的分布式存储方案。集群由多个节点(Node)组成,Redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负贵读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。redis集群采用master-slave的方式,即1个master节点可以包含多个slave节点,slave节点主要对master节点的数据进行备份,如果master节点挂了,可以启动salve节。

2501_91557222的博客 1442
上一篇: Git 修订版本
下一篇: redis 集群
lobal
博客等级 码龄16年 5粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值