首页 > 数据库 >redis - 其他问题

redis - 其他问题

时间:2024-10-25 09:33:16浏览次数:6  
标签:其他 redis 问题 集群 key sentinel 下线 节点

redis集群如何做故障转移

redis sentinel

sentinel对redis数据节点和其他sentinel节点做定时监控,客户端连sentinel节点以获取数据节点的信息。如果心跳超过一段时间没回复,sentinel认为该节点主观下线,只有主节点主观下线,且sentinel之间互相通气发现超过一定数量的sentinel都判定为主观下线,则该主节点客观下线,才会开始故障转移。

  • sentinel节点根据raft协议,先选取一个leader节点来操作本次的故障转移。
  • sentinel leader节点根据从节点的priority,复制偏移量最大等判断选择runid最小的节点作为新的主节点,并通知,该从节点接到升级为主节点恢复后,再通知其他从节点更新主节点。

redis cluster

多个数据主节点也充当sentinel角色,互相之间心跳机制,然后根据主观下线,客观下线,再做failover, 类似。

redis集群主从同步的过程

  • 第一次全量复制,master生成RDB发送给slave
  • 增量复制,master,slave都维护一个环形的数据更新缓冲区,master记录写的位置,slave记录读的位置,两个位置的偏移差就是主从延迟的体现,从库会发送主库自己读的位置,主库会把这个位置到自己写位置间偏移量的数据都发送给从库
    (redis-主从)[https://www.cnblogs.com/rachel-aoao/p/redis_master_slave.html]

redis大key问题如何应对

大key有哪些情况

  • 单个key的value值很大
  • 集合key(list, hash, set, zset)的数量很大(>5000)
  • key本身数量很大(上亿)

大key有哪些危害

  • 内存占用,大量占用内存资源
  • 网络传输,大key在网络传输时需要消耗更多的时间和带宽,增加网络延时
  • 阻塞,大key可能导致redis单线程阻塞,影响其他客户端的请求处理速度

治理方法

拆分:将一个string或者一个hash,根据不同field拆成多个hash,原key作为key前缀,添加其他的为后缀(预分桶);将一个大集合拆成多个小集合。
分页获取:使用lrange命令分页获取列表key的数据
设置过期时间
使用压缩算法,如gzip

redis zset的应用

延时队列

zset按照score进行排序,当score表示该操作预期进行的时间戳时,可用作延时队列。consumer起一个线程循环取zset第一个值,若当前时间戳大于该值,则取出消费。

排行榜

一小时最热门榜单,score是评论点击数。

限流

todo

线上规范,最佳实践

key设计

  • 不要包含特殊字符如空格,换行,单双引号
  • 严格控制key的生命周期,redis不是垃圾桶,设置过期时间,防止集中过期,不过期数据关注idletime
  • 以业务名为前缀防止key冲突,用冒号分割
  • 尽量简洁,key数量大时,内存占用也不容忽视

value设计

  • 不要有bigKey(防止网卡流量和慢查询),字符串控制在10KB,集合控制在5000内
  • 非字符串的bigKey,不要使用DEL删除,使用hscan,sscan,zscan方式渐进式删除

命令使用

  • O(N)命令关注N,如hgetall,lrange,smembers,zrange,sinter,遍历需求使用hscan,sscan,zscan
  • 慎用Pub/Sub机制, 不能保证消息的可靠性,服务器重启,客户端断连都可能造成消息丢失,大集群使用publish消息会在集群间广播,可能形成集群间流量风暴

客户端接入

  • sentinel模式,使用sentinel节点发现数据节点,禁止直连
  • 集群模式,客户端必须配置路由更新规则
  • 集群默认淘汰策略为volatile-lru
  • 避免打开读写分离,redis性能极高,单点qps可达到10w,读写分离只会造成业务同时受到主从节点影响,redis采用异步复制机制,可能数据不一致。
  • jedis资源池配置
    • maxTotal/maxActive:资源池中最大连接数,默认8,建议根据需要设置( qps/主节点数/ (1000/每条命令的预计耗时ms)*(3/2))与maxIdle、minIdle相同,且不超过业务线程数量;原则上不要超过50;例如: 主节点数:10,命令耗时:0.33ms, 10个连接的qps为: 10 * (1000ms/0.33ms) * 10 = 30w
  • connectionTimeout:连接超时,默认500ms,合理配置,连接超时最好不要低于500ms,线上出现多起因为连接超时过短,造成大量建连引发Redis雪崩
    |

标签:其他,redis,问题,集群,key,sentinel,下线,节点
From: https://www.cnblogs.com/rachel-aoao/p/18501797/redis_problems

相关文章

  • windows中mysql遇到的一些小问题
    windows中mysql的一些常见问题初始化时指定defaults-files配置文件初始化失败#windows中使用cmd操作mysql时注意cmd命令自带的编码格式是gbk编码,所以在cmd下操作mysql命令可能回出现问题,例如:初始化mysqld--initialize--defaults-file="配置文件"时遇到系统库初始化失败的情......
  • C语言基础入门(小白)三种方法解决幽灵换行符问题
    首先,相信很多读者读到题目都会产生一个共同的疑问:什么是幽灵换行符???    幽灵换行符是指:在C语言中,当用scanf函数时,想要输入几个字符,比如:当输入‘a’之后按下回车键,运行自动结束,而不是等待输入第二个字符,第二个字符就像幽灵般消失了,这是为什么呢??    其实,原因......
  • 数据库设计过程中,除了3NF,还有哪些其他规范化形式?
    在数据库设计过程中,除了第三范式(3NF)外,还有其他几种重要的规范化形式,它们旨在进一步减少数据冗余和提高数据一致性。以下是对这些规范化形式的详细解释:第一范式(1NF):定义:确保每列都是不可分割的基本数据项,即表中不能再包含表(或称为列表),且表中的每一行都是唯一的(通过主键或其他......
  • IPv4 和 IPv6 是两种不同的网络协议,如果你的计算机仅配置了 IPv4 或仅配置了 IPv6,那么
    IPv4和IPv6是两种不同的网络协议,如果你的计算机仅配置了IPv4或仅配置了IPv6,那么它们之间的通信将会遇到问题,因为这两个协议并不兼容。这意味着如果你在网络中有一台设备仅支持IPv4,而另一台设备仅支持IPv6,它们之间无法直接通信。为了解决这个问题,可以考虑以下几种方法:1.......
  • 静态区间数颜色问题
    P1972[SDOI2009]HH的项链我知道这是很典的题,但是看提交记录发现我是今年1月做的,居然一点印象也没有。看题解(洛谷第一篇)居然看懂了,比较开心。之前都是随便看看然后就开始贺题解,感觉思考的比较少,这次是看着推导过程写出来了。思路:对于询问多个区间[L,R]中出现不同数字个数,......
  • 动态规划之简单多状态 dp 问题(下)
    文章目录买卖股票的最佳时机买卖股票的最佳时机含手续费买卖股票的最佳时机III买卖股票的最佳时机IV买卖股票的最佳时机题目:买卖股票的最佳时机思路状态表示:dp[i]表示第i天结束后,处于某个状态的最大利润,我们可以细分为,处于“买入”、“可交易”、“”三种状......
  • Robat 并发与资源竞争问题的解决
    title:Robat并发与资源竞争问题的解决tags:-Robatcategories:-Robat[toc]理解Robat并发与资源竞争Robat并发是指在Robat系统中,多个任务同时执行。这通常是为了提高系统性能,尤其是在处理大量数据或需要同时响应多个请求时。资源竞争是指多个并发任务同时访问共......
  • 解决数组两数之和问题与逻辑推理找出谋杀案凶手
    给定一个整数数组nums和一个整数目标值target(2<=nums.length<=10^4),请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],t......
  • python爬虫遇到的问题
    python爬虫之获取文本信息时,经常犯的错误如果代码部分不想看的可以直接看后面粗体字1.第一个例子importrequestsfrombs4importBeautifulSoupimportpandasaspdimporttime importrandomheaders={  'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64......
  • Redis 的位图(Bitmap)设计签到系统
    在使用Redis的位图(Bitmap)实现签到系统时,可以通过字符串的位定位(bitposition)来记录用户的签到状态。这是一种高效的存储和检索方式,因为你可以在一个字符串中使用位来表示二进制状态,通常每一位(bit)代表一个用户或一天的状态。以下是如何实现签到系统的思路:设计数据结构:每个......