目录

  • redis常见问题和解决方案

    • 持久化、主从问题
    • Hashtag(可以实现批量操作)
    • Redis事务
    • Redis的多数据库机制
    • Redis集群机制不足的地方
    • Redis集群模式下,如何进行批量操作
    • Redis做读写分离有什么问题
    • 大文本数据必须压缩再存储
    • 线上 Redis 禁止使用 Keys 正则匹配操作
    • 线上禁止使用 monitor 命令
    • 与tair的对比选型
    • 如何借助  有序集合  实现多维排序

转载: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的值,就能实现任意维度的排序需求了。

redis常见问题和解决方案相关推荐

  1. redis常见问题及解决方案

    redis的性能并不受CPU的运行速度,影响redis性能的是网络带宽和内存大小. redis常见问题及对应解决方案: 一.缓存穿透:就是查询一个压根就不存在的数据,即缓存中没有,数据库中也没有 解决 ...

  2. 消息队列常见问题和解决方案

    一.为什么使用消息队列? 消息队列使用的场景和中间件有很多,但解决的核心问题主要是:异步.解耦.消峰填谷. 二.消息队列的优缺点 异步.解耦.消峰填谷这是消息队列最大的优点,除了这些消息队列还可以会解 ...

  3. Redis 常见问题

    转载自:https://blog.csdn.net/zhangweiwei2020/article/details/80783818 考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候 ...

  4. OpenStack环境搭建(六:常见问题及解决方案总结)

    实验要求: 完成Virtual box平台安装,会应用相关操作: 在virtual box虚拟平台上部署Fuel Master节点: 在virtual box虚拟平台上部署计算节点Computer: ...

  5. ESXi6.5环境搭建(五:常见问题及解决方案实验总结)

    实验目的及要求 完成VMware workstations安装,会应用相关操作: 完成虚拟机中ESXI6.5平台的安装及网络环境配置: 完成VMware vSphere Client 6.0软件在PC ...

  6. C#中使用WCF一些常见问题及解决方案

    C#中使用WCF一些常见问题及解决方案 参考文章: (1)C#中使用WCF一些常见问题及解决方案 (2)https://www.cnblogs.com/52XF/p/3740326.html 备忘一下 ...

  7. gulp几个常见问题及解决方案

    gulp几个常见问题及解决方案 参考文章: (1)gulp几个常见问题及解决方案 (2)https://www.cnblogs.com/hjson/p/10546708.html 备忘一下.

  8. Mycat常见问题与解决方案

    Mycat常见问题与解决方案 参考文章: (1)Mycat常见问题与解决方案 (2)https://www.cnblogs.com/it-deepinmind/p/11913519.html 备忘一下 ...

  9. Codis——分布式Redis服务的解决方案

    Codis--分布式Redis服务的解决方案 参考文章: (1)Codis--分布式Redis服务的解决方案 (2)https://www.cnblogs.com/chenny7/p/5063368. ...

  10. [持续更新]UnsatisfiedLinkError常见问题及解决方案

    [持续更新]UnsatisfiedLinkError常见问题及解决方案 参考文章: (1)[持续更新]UnsatisfiedLinkError常见问题及解决方案 (2)https://www.cnbl ...

最新文章

  1. 让VSCode的快捷键切换为WebStorm/IDEA的快捷键、修改颜色主题(深色模式)、文件图标主题
  2. 项目管理和产品管理绉议
  3. 有关架构图你需要了解的基础知识
  4. XML与JavaBean相互转换工具
  5. 学习Java笔记(一)
  6. 神的战争god无法显示服务器,神的战争god快速升级抢资源攻略
  7. Kotlin学习笔记 第二章 类与对象 第三节接口 第四节 函数式接口
  8. qt 在qtextedit显示数组_Qt开源作品34-qwt无需插件源码
  9. 东大14春学期《计算机应用基础》在线作业1,东大18春学期《计算机应用基础》在线作业...
  10. 3月20日 表单
  11. c 和java用cfb_一文彻底搞懂Java中的环境变量
  12. 奥本海姆信号与系统第2版笔记和课后答案
  13. 烽火fr2600怎么web登录_烽火路由器回收,烽火交换机回收,烽火无线AP回收
  14. 觅鹿影视在线解析源码带后台
  15. 怎么安装光盘并重新启动计算机,如何用光盘重新安装电脑系统
  16. 设置Button图片位置
  17. 做微信小程序需要ICP证书吗
  18. 建个网站需要多少钱?
  19. HttpClient上传文件到微信素材乱码问题解决
  20. 「2019纪中集训Day12」解题报告

热门文章

  1. powershell的stable和preview版本
  2. new方法、定制属性、描述符、装饰器
  3. day22 属性 类方法 静态方法 反射 https://www.cnblogs.com/jin-xin/articles/9214247.html
  4. 9.1.4 前端 - HTML body标签 - 标题,段落,分割线,换行,特殊符号,列表,超链接,图片,div/span,表格,表单,input标签,多行文本,单选/多选,下拉,按钮...
  5. android 动态 添加删除 控件 图片
  6. Spring事务异常回滚
  7. Linux:写一个简单的服务器
  8. 从内存分配分析程序初始化和存储
  9. zjufantasy.com开发日记(1)
  10. linux中c表示字符设备文件符号