赞
踩
在使用Redis时,有几个常见的问题可能会出现,包括但不限于以下几点:
以上是一些常见的在使用Redis时可能遇到的问题,解决这些问题需要综合考虑系统架构、应用场景、硬件资源等因素,并进行相应的配置、优化和调整。
1、缓存雪崩解决
(并发,流量在几百万)
互斥锁:会使吞吐量下降
给缓存加失效时间:随机值,避免集体失效
随机的过期时间、高可用集群、熔断、降级,防止系统崩溃
双缓存
2、缓存穿透解决
(并发,流量百万)
互斥锁
异步更新策略,论Key是否取到值都直接返回
提供个能迅速判断请求是否有效的拦截机制(布隆过滤器)
2、缓存击穿解决
Redis中的大key问题通常是指存储了大量数据的单个key,这可能导致一些性能问题,如影响Redis的内存利用率、增加数据读取的时间等。以下是处理Redis大key问题的一些建议:
什么是热Key呢?在Redis中,我们把访问频率高的key,称为热点key。
如果某一热点key的请求到服务器主机时,由于请求量特别大,可能会导致主机资源不足,甚至宕机,从而影响正常的服务。
Redis热key问题通常是指在Redis中某些键(key)被频繁访问,导致对这些热点数据的访问压力过大,可能引起Redis性能问题
原因
热点Key是怎么产生的呢?主要原因有两个:
● 用户消费的数据远大于生产的数据,如秒杀、热点新闻等读多写少的场景。
● 请求分片集中,超过单Redi服务器的性能,比如固定名称key,Hash落入同一台服务器,瞬间访问量极大,超过机器瓶颈,产生热点Key问题。
那么在日常开发中,如何识别到热点key呢?
● 凭经验判断哪些是热Key;
● 客户端统计上报;
● 服务代理层上报
解决方法
● Redis集群扩容:增加分片副本,均衡读流量;
● 将热key分散到不同的服务器中;
● 使用二级缓存,即JVM本地缓存,减少Redis的读请求。
前提是对数据有强一致性要求,不能放缓存;
只能降低概率,法完全避免
只能保证最终一致性
1)采用正确的更新策略,先更新数据库,再删缓存
2)可能存在删除缓存失败的问题,提供个补偿措施:如利用消息队列
不要求顺序时,准备个分布式锁,同时去抢锁,然后在set操作
要求顺序时,在数据写⼊数据库时,需要保存个时间戳
利用队列,将set操作变成串行访问
指令阻塞其他指令
因为Redis执行指令是单线程的,因为单次执行速度会非常快,但是如果你让单次执行变慢了,那么也会阻塞后续的指令执行。
哪些情况会让指令变慢:
1.指令获取的数据很多,比如大数据量下执行keys、hgetall、smembers等指令。我们可以通过查看Redis的慢查找到问题,不要去执行慢查操作
2.大Key,我单次查询的的数据过大,也会导致单次执行变慢。所以我们需要拆分大key。
CPU扛不住了
因为Redis处理命令只用到一个cpu,所以当cpu超过我们负荷的时候,也会导致阻塞。
1.Redis是否有牺牲cpu去换取内存的一些配置,比如数据类型底层数据结构的配置。有些数据类型是去追求极致空间,所以会牺牲CPU。
2.如果也没有,那就是需要加机器了
持久化阻塞
1.虽然说Redis的持久化是异步做的,但是for子进程的时候就慢,那么也会导致问题。
2.AOF刷盘的时候,由于磁盘压力,导致操作时间够久,主线程为了数据一致性会阻塞指令。
其他原因
1.其他的程序跟Redis部署在一台机器,导致cpu之间的相互影响
2.网络问题 包括网络是否稳定,是否有延迟、带宽是否足够
3.客户端连接数是否达到了Redis的最大连接数
阻塞问题,一般线上都是有搭监控的,看redis命令的rt有没有上涨,估计是考察big key问题吧,阿里云官网对big key的处理有一份文档,说的还是比较全面的
(1)Master 写内存快照,save 命令调度 rdbSave 函数,会阻塞主线程的工作,当快照比较大时对性能影响是
非常大的,会间断性暂停服务,所以 Master 最好不要写内存快照
(2)Master AOF 持久化,如果不重写 AOF 文件,这个持久化方式对性能的影响是最小的,但是 AOF 文件会不断增大,AOF 文件过大会影响 Master 重启的恢复速度。Master 最好不要做任何持久化工作,包括内存快照和 AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个 Slave 开启 AOF 备份数据,策略为每秒同步一次
(3)Master 调用 BGREWRITEAOF 重写 AOF 文件,AOF 在重写的时候会占大量的 CPU 和内存资源,导致服务 load 过高,出现短暂服务暂停现象
(4)Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave 和 Master 最好在同一个局域
网内
redis常见性能问题和解决方案
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
你用了java那些内存管理工具
内存优化方案
尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户的所有信息存储到一张散列表里面
Redis数据倾斜主要是由于数据访问热点导致的,通常在执行事务操作或范围查询时发生。这会导致大量数据集中在某个实例上,使得集群负载不均衡。以下是一些解决Redis数据倾斜的方法:
避免在同一个键值对上保存过多的数据。可以将大的键值对拆分成小的集合类型数据,并分散存储在不同的实例上。例如,如果有一个大的哈希集合保存了100万个用户信息,可以将它拆分成10个小的哈希集合,每个集合只保存10万用户信息。
采用热点数据多副本方案。如果热点数据是只读的,可以在每个副本的键中增加一个随机前缀,这样可以让不同的副本数据不会映射到同一槽位中。
使用分布式锁。当有多个实例同时访问同一个数据时,可以使用分布式锁来确保数据的一致性,避免数据出现倾斜。
使用Hash Tag进行数据切片。Hash Tag可以将数据分散到不同的实例上,从而避免数据倾斜。
使用KEYS选项进行批量迁移。从Redis3.0.6开始,可以使用KEYS选项一次迁移多个键,从而提高迁移效率。
总之,解决Redis数据倾斜需要针对具体情况采取不同的策略,包括合理设计数据结构、避免热点数据的产生、使用分布式锁、使用Hash Tag进行数据切片以及使用KEYS选项进行批量迁移等。
Redis数据倾斜的解决方法有以下几种:
使用哈希散列:将数据分到不同的哈希槽中,使得数据分布更均匀。可以通过CLUSTER ADD-HASHSLOT命令动态添加或删除哈希槽。
使用集群:将数据分布在多个Redis节点上,通过节点之间的数据迁移和负载均衡来平衡数据分布。可以使用redis-cluster工具创建集群。
使用分区键:为数据设置一个分区键,根据分区键的值将数据存储到不同的Redis实例上。例如,可以使用用户ID作为分区键,将不同用户的数据存储到不同的Redis实例上。
使用预分区:在创建Redis实例时,预先分配好哈希槽,使得数据在一开始就能均匀分布。可以使用CLUSTER REPLICATE命令进行预分区。
使用客户端分片:在客户端实现数据的分片逻辑,根据需要将数据存储到不同的Redis实例上。例如,可以使用一致性哈希算法来实现客户端分片。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。