目录

  • 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. Java项目:在线考试系统(java+SSM+mysql+JSP)
  2. 【37.38%】【codeforces 722C】Destroying Array
  3. python基础6(来自廖雪峰的官方网站)
  4. python基础:try...except...的详细用法
  5. 安卓系统dicom阅读器_懒人追番利器,彩屏阅读器把动漫搬到手中
  6. 【题目解析】1015 Reversible Primes (20 分)_27行代码AC
  7. vue项目没有router文件夹_vueRouter没有报错,但是页面渲染空白
  8. idea远程调试修改代码_IDEA远程调试(Remote Debug)Java代码指南
  9. cas如何实现多系统间的相互认证_统一身份认证和单点登录的区别
  10. 使用SharedPreference保存用户数据的步骤
  11. cgi进程设置多少 宝塔_Python Multiprocessing 多进程、进程守护、锁、队列使用介绍...
  12. 用usbserver实现加密狗共享
  13. 如何为word文档增加脚注
  14. 1×pbs缓冲液配方_PBS缓冲液配方.doc
  15. EMI电磁干扰的来源和分类
  16. 禁用计算机中的u盘功能,怎样禁用U盘的写入功能 -电脑资料
  17. 总有云开日出时候, 万丈阳光照耀你我
  18. centos8下重启网卡命令_Centos 8重启网卡命令
  19. AWS免费服务器申请
  20. 什么是sql注入,怎么防止SQL注入?

热门文章

  1. Mybatis中的DataSource配置
  2. 使用Flink实现索引数据到Elasticsearch
  3. 爬虫之User-Agent
  4. Python学习第五天
  5. DB2 9 根本(730 磨练)认证指南,第 3 部门: 谋面 DB2 数据(4)
  6. 病毒 Worm.Logo.g
  7. Java开发笔记(一百三十八)JavaFX的箱子
  8. Linux设备驱动(转)
  9. [HNOI 2018]道路
  10. iOS蓝牙开发总结-4