Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 305|回复: 0

redis常见问题和解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-10 22:47:09 | 显示全部楼层 |阅读模式

    转载:https://www.cnblogs.com/aspirant/p/6820262.html

    【原创】那些年用过的Redis集群架构(含面试解析)

    redis常见问题和解决方案

    持久化、主从问题

    (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 

        (a)Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

        (b)Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

        (c)Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

    (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 

    (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 

    (4) 尽量避免在压力很大的主库上增加从库 

    (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3… 
    这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

    Hashtag(可以实现批量操作)

    Redis计算槽时并非只简单的计算键值内容,当键值内容包括大括号时,则只计算括号内的内容(Hashtag)。比如:key为user:{10000}:books,计算hash值只计算10000。

    Redis事务

    Redis事务是一些列redis命令的集合:watch redisKey;multi .......exec。

    生产上采用的是Redis Cluster集群架构,不同的key是有可能分配在不同的Redis节点上的,在这种情况下Redis的事务机制是不生效的。其次,Redis事务不支持回滚操作,简直是鸡肋!所以基本不用!

    Redis的多数据库机制

    Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,单机下的redis可以支持16个数据库(db0 ~ db15)。

    但是,在Redis Cluster集群架构下只有一个数据库空间,即db0。因此,我们没有使用Redis的多数据库功能!

    Redis集群机制不足的地方

    1. 键的批量操作支持有限,比如mset, mget,如果多个键映射在不同的槽,就不支持了

    2. 键事务支持有限,当多个key分布在不同节点时无法使用事务,同一节点是支持事务

    3. 键是数据分区的最小粒度,不能将一个很大的键值对映射到不同的节点

    4. 不支持多数据库,只有0,select 0

    5. 复制结构只支持单层结构,不支持树型结构

    Redis集群模式下,如何进行批量操作

    如果执行的key数量比较少,就不用mget了,就用串行get操作。如果真的需要执行的key很多,就使用Hashtag保证这些key映射到同一台redis节点上。

    如果你用的是Proxy分片集群架构,例如Codis这种,会将mget/mset的多个key拆分成多个命令发往不同得redis实例。

    Redis做读写分离有什么问题

    不做读写分离。我们用的是Redis Cluster的架构,是属于分片集群的架构。而redis本身在内存上操作,不会涉及IO吞吐,即使读写分离也不会提升太多性能,Redis在生产上的主要问题是考虑容量,单机最多10-20G,key太多降低redis性能.因此采用分片集群结构,已经能保证了我们的性能。其次,用上了读写分离后,还要考虑主从一致性,主从延迟等问题,徒增业务复杂度。

    大文本数据必须压缩再存储

    对于大文本【+超过 500 字节】写入到 Redis 时,一定要压缩后存储。大文本数据存入 Redis,除了带来极大的内存占用外,在访问量高时,很容易就会将网卡流量占满,进而造成整个服务器上的所有服务不可用,并引发雪崩效应,造成各个系统瘫痪。

    线上 Redis 禁止使用 Keys 正则匹配操作

    redis 是单线程处理,在线上 KEY 数量较多时,操作效率极低【时间复杂度为 O(N)】,该命令一旦执行会严重阻塞线上其它命令的正常请求,而且在高 QPS 情况下会直接造成 Redis 服务崩溃!如果有类似需求,请使用 scan 命令代替!

    线上禁止使用 monitor 命令

    实时打印出 Redis 服务器接收到的命令,调试用。在高并发条件下,会存在内存暴增和影响 Redis 性能的隐患。

    与tair的对比选型

    1、公司可运维性

    2、数据结构类型,明显redis数据结构多

    3、数据量,redis数据存在内存,肯定没有tair的数据量大

    4、安全性,tair数据有持久化,一般不丢数据。redis的持久化相对差

    5、性能的话,redis好点,毕竟内存读写。redis支持的value的大小更大(理论上1G  256M)

    6、都没有单点。tair的config node也有备份节点

    如何借助  有序集合  实现多维排序

    有序集合默认情况下只能根据一个因子score进行排序。如此一来,局限性就很大。

    例如:热门排行榜需要按照下载量&最近更新时间&其他因子排序,即类似数据库中的ORDER BY downloadcount, updatetime DESC。那这样的需求如果用有序集合该如何实现呢?

    事实上很简单,思路就是将涉及排序的多个维度的列通过一定的方式转换成一个特殊的列,即result = function(x, y, z),即x,y,z是三个排序因子,例如下载量、时间等,通过自定义函数function()计算得到result,将result作为有序集合中的score的值,就能实现任意维度的排序需求了。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 06:29 , Processed in 0.062921 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表