redis
文章平均质量分 85
redis
aidanzheng
毕业于西北大学数学系,13年软件开发经验的老程序员。10000小时定律是我的座右铭,不断的学习,不断突破自我
展开
-
缓存设计
缓存更新方式很多研发同学是这么用缓存的:在查询数据的时候,先去缓存中查询,如果命中缓存那就直接返回数据。如果没有命中,那就去数据库中查询,得到查询结果之后把数据写入缓存,然后返回。在更新数据的时候,先去更新数据库中的表,如果更新成功,再去更新缓存中的数据。流程如下图这样使用缓存的方式有没有问题?绝大多数情况下都没问题。但是,在并发的情况下,有一定的概率会出现“脏数据”问题,缓存中的数据可能会被错误地更新成了旧数据。比如1,对同一条记录,同时产生了一个读请求和一个写请求,这两个请求被分配到两个不同的线程原创 2020-07-03 00:23:34 · 534 阅读 · 0 评论 -
Redis的一些小功能大用处
慢查询日志像很多数据库一样,redis也提供慢查询日志。一条redis命令执行的执行过程包括:1、发送命令2、排队3、执行4、发送结果慢查询命令只统计了命令的执行时间。Redis内部将慢查询日志保存到一个队列中,受2个参数控制:slowlog-max-len=1000 //表示队列的长度slowlog-log-slower-than=1000 //执行时间超过设置的值,则记录到慢查询队列中,以微秒为单位slowlog-slower-than默认为10ms,在高并发的场景,这个值太大了,原创 2021-01-10 23:17:03 · 150 阅读 · 0 评论 -
堵塞--redis的噩耗
由于redis的单线程模型,如果在主线程中执行了耗时的操作,那么之后的所有命令将会被堵塞,响应时间将会增加,整个系统的吞吐量会降低。为此我们需要避免导致redis堵塞的操作,那么redis都有哪些堵塞操作呢?我将redis的堵塞分为内在原因与外在原因。内在原因1、时间复杂度高的操作,如keys、集合的一些聚合操作等。我们可以通过redis的慢查询日志,找到执行慢的日志。2、bigkey的删除操作,如下表所示可以看出删除一个百万级别的bigkey都达到秒级别了。为此删除bigkey需要使用异步删除的原创 2021-01-10 23:07:00 · 484 阅读 · 0 评论 -
Redis集群都有哪些坑
集群完整性检查默认情况下,如果redis的虚拟slot没有全部分配完,那么集群不可提供服务。那么在集群故障转移期间,redis集群没法提供服务,这在有些业务场景下是没法接受的。为此我们一般将参数cluster-require-full-coverage设置为no。这样只有故障的节点负责的slot不可用。pubsub广播Redis集群为了实现所有的订阅的客户端都可以接收到发布的消息,但是不同的客户端可能连接的是不同的主节点,为此redis会广播所有的发布的消息到所有的节点,如果发布的消息较大,网络开销将原创 2021-01-10 17:57:53 · 833 阅读 · 0 评论 -
Redis集群--水平扩展redis的读写性能
当服务出现性能瓶颈时,我们一般有2种方式扩展服务的性能:1、垂直方向,就是通过升级硬件的配置,如内存出现瓶颈了,就使用更大的内存,CPU出现瓶颈了使用更好的CPU,但是硬件的升级总是有上限的,而且更高的硬件配置,往往意味着更高的成本,因为随着硬件成本的提升,对性能的提升并不是线性的。2、水平方向,就是通过将服务部署到更多的机器,让更多的机器提供服务,提升服务的整体性能。理论上水平扩展可以无限的扩展服务的性能,垂直扩展只能是一个临时的方案。Redis原生提供了集群方案redis cluster,用于水平原创 2021-01-10 16:29:15 · 1157 阅读 · 0 评论 -
Redis哨兵机制--redis主从集群的高可用保证
Redis通过主从集群扩充主节点的读能力,同时又一定程度上保证数据的不丢失,但是主从集群由如下的问题:1、如果主节点故障了,需要手动执行主从切换,没法保证高可用;2、主从集群只能扩充读能力,并不能扩充主节点的写能力。本篇博文将介绍redis如果保证主从集群的高可用。哨兵机制的作用Redis通过哨兵机制来保证redis集群的高可用,它主要有如下的作用:监控、故障转移、通知。监控监控指的是监控主从节点的状态,检测他们是否出现故障。它通过每隔1秒给redis节点与哨兵节点周期性的发送PING消息,同原创 2021-01-09 18:37:34 · 218 阅读 · 0 评论 -
Redis主从集群都有哪些坑
主从不一致主从不一致主要有如下的原因主从延迟Redis的主节点收到写命令成功后,会通过网络同步给从节点,但是主节点并不等待同步到从节点完成,而是一旦写入主节点成功就返回给客户端。这主异步模式必然导致主从节点的数据不一致。那么什么原因会影响主从同步的延迟程度呢?主要有如下的原因1、网络环境,如果主从之间的网络环境不是很好,如主从节点部署在不同城异地机房。但是即使主从节点部署在有良好专线连接的同城异地机房或者同机房,但是他们与其他占用大量带宽的服务共享同网络资源,那么还是可能会导致主从延迟过大。为此我原创 2021-01-08 00:07:23 · 827 阅读 · 0 评论 -
Redis 多核CPU与NUMA架构优化
多核CPU架构当今的CPU一般会有多颗核心(我们称为物理核心),每颗核心都有自己的一级缓存(简称L1 Cache)与二级缓存(简称L2 Cache),这两集缓存都比较小,一般都是KB级别,CPU核心访问它们一般只有几纳秒,非常快。一级缓存又可以进一步分为指令缓存与数据缓存。但是一级缓存与二级缓存都比较小,可以保存的指令与数据比较少,如果指令或者数据没有在L1与L2 Cache命中,那么就要访问内存,内存的访问速度就比较慢了,一般是100纳秒左右,为此引入了共所有CPU核心共享的三级缓存,它的大小从几MB到原创 2021-01-06 08:43:47 · 1052 阅读 · 0 评论 -
Redis数据结构及内存优化
内存优化对内存优化前,我们需要知道redis都有哪些类型,都使用了哪些数据结构,每种数据结构的使用场景。下面就分别介绍每种数据类型redisObject对象Redis内部所有存储的数据都使用redisObject 来封装。struct redisObject {unsigned type:4; // 对象类型如 zset/set/hash 等等unsigned encoding:4; // 对象编码如 ziplist/intset/skiplist 等等unsigned lru:24; //原创 2021-01-05 00:36:08 · 1025 阅读 · 0 评论 -
Redis内存及内存管理
虽然现今内存都很便宜了,但是相对廉价的硬盘来说,还是贵了非常多。而且redis使用的很多场景下,往往数据是TB级别甚至PB级别,而我们的服务器的内存容量只有GB级别。为此我们需要优化redis内存的使用,但是优化内存的使用的前提是知道内存都消耗再哪里了。为此本篇博客先从内存消耗入手分析。内存消耗理解内存,首先要知道内存都消耗再哪里了。内存监控Redis提供了命令info memory命令,统计内存消耗分布。其输出如下的内容指标意义used_memoryredis实际使用的内存原创 2020-12-31 00:28:55 · 658 阅读 · 0 评论 -
Redis 持久化----AOF增量日志与RDB快照
AOF增量日志AOF(append only file),是redis的增加日志,其记录的是一条条redis执行的命令。比如执行命令set testkey testvalue,则记录的日志是:*3$3 set$7testkey$9testvalue其中,“*3”表示当前命令有三个部分,每部分都是由“$+数字”开头,后面紧跟着具体的命令、键或值。这里,“数字”表示这部分中的命令、键或值一共有多少字节。例如,“$3 set”表示这部分有 3 个字节,也就是“set”命令。AOF写盘策略A原创 2020-12-16 23:43:25 · 1408 阅读 · 0 评论 -
redis真的是单线程的么
redis单线程模型我们经常说redis是单线程的,这个单线程指的是redis的网络IO的读写与数据库数据的除操作都在一个线程中完成,从而避免多线程编程的一些数据竞争的问题。但是redis的网络IO的读取与数据库操作都在同一个线程中完成,为什么还能够达到如此的高效呢?这就要归功于IO多路复用技术、redis的高效的数据结构、没有数据竞争问题以及所有数据操作都是内存操作。关于redis的高效的数据结构,将在我的其他博客介绍。Redis IO多路复用技术模型,使用的是单reactor模式,其模型图如下:原创 2020-12-09 08:47:05 · 1336 阅读 · 0 评论