广告
返回顶部
首页 > 资讯 > 数据库 >如何保证Redis的高并发
  • 315
分享到

如何保证Redis的高并发

2024-04-02 19:04:59 315人浏览 安东尼
摘要

小编给大家分享一下如何保证Redis的高并发,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!  单机的redis几乎不太可能说QPS超过10万+,一般在几万。  除非一些特殊情况,比如你的机器性

小编给大家分享一下如何保证Redis高并发,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

如何保证Redis的高并发

  单机的redis几乎不太可能说QPS超过10万+,一般在几万。

  除非一些特殊情况,比如你的机器性能特别好,配置特别高,物理机,维护做的特别好,而且你的整体的操作不是太复杂。

如何保证Redis的高并发

  Redis通过主从架构,实现读写分离,主节点负责写,并将数据同步给其他从节点,从节点负责读,从而实现高并发

  Redis高并发的同时,还需要容纳大量的数据:一主多从,每个实例都容纳了完整的数据,比如redis主就10G的内存量,其实你就最对只能容纳10g的数据量。如果你的缓存要容纳的数据量很大,达到了几十g,甚至几百g,或者是几t,那你就需要redis集群,而且用redis集群之后,可以提供可能每秒几十万的读写并发。

replication的核心机制

  redis采用异步方式复制数据到slave节点,不过redis 2.8开始,slave node会周期性地确认自己每次复制的数据量
  一个master node是可以配置多个slave node的
  slave node也可以连接其他的slave node
  slave node做复制的时候,是不会block master node的正常工作的
  slave node在做复制的时候,也不会block对自己的查询操作,它会用旧的数据集来提供服务; 但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了
  slave node主要用来进行横向扩容,做读写分离,扩容的slave node可以提高读的吞吐量

master持久化对于主从架构的安全保障的意义

  如果采用了主从架构,那么建议必须开启master node的持久化!

  不建议用slave node作为master node的数据热备,因为那样的话,如果你关掉master的持久化,可能在master宕机重启的时候数据是空的,然后可能一经过复制,salve node数据也丢了

  第二个,master的各种备份方案,要不要做,万一说本地的所有文件丢失了; 从备份中挑选一份rdb去恢复master; 这样才能确保master启动的时候,是有数据的

如何保证Redis的高并发

master同步数据给slave的过程

  当启动一个slave node的时候,它会发送一个PSYNC命令给master node

  如果这是slave node重新连接master node,那么master node仅仅会复制给slave部分缺少的数据; 否则如果是slave node第一次连接master node,那么会触发一次full resynchronization

  开始full resynchronization的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端收到的所有写命令缓存在内存中。

  RDB文件生成完毕之后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中。然后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。

  slave node如果跟master node有网络故障,断开了连接,会自动重连。master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有slave node。

主从复制的断点续传

  从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份

  master node会在内存中常见一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。

  如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制

  但是如果没有找到对应的offset,那么就会执行一次resynchronization

无磁盘化复制

  master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了

  repl-diskless-sync
  repl-diskless-sync-delay,等待一定时长再开始复制,因为要等更多slave重新连接过来

过期key处理

  slave不会过期key,只会等待master过期key。

  如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。

复制的完整流程

  slave node启动,仅仅保存master node的信息,包括master node的host和ip(redis.conf里面的slaveof配置的),但是复制流程没开始

  slave node内部有个定时任务,每秒检查是否有新的master node要连接和复制,如果发现,就跟master node建立Socket网络连接
  slave node发送ping命令给master node
  口令认证,如果master设置了requirepass,那么salve node必须发送masterauth的口令过去进行认证
  master node第一次执行全量复制,将所有数据发给slave node
  master node后续持续将写命令,异步复制给slave node

数据同步相关的核心机制

指的就是第一次slave连接msater的时候,执行的全量复制,那个过程里面你的一些细节的机制

(1)master和slave都会维护一个offset

  master会在自身不断累加offset,slave也会在自身不断累加offset
  slave每秒都会上报自己的offset给master,同时master也会保存每个slave的offset

  这个倒不是说特定就用在全量复制的,主要是master和slave都要知道各自的数据的offset,才能知道互相之间的数据不一致的情况

(2)backlog

  master node有一个backlog,默认是1MB大小
  master node给slave node复制数据时,也会将数据在backlog中同步写一份
  backlog主要是用来做全量复制中断候的增量复制的

(3)master run id

  info server,可以看到master run id
  如果根据host+ip定位master node,是不靠谱的,如果master node重启或者数据出现了变化,那么slave node应该根据不同的run id区分,run id不同就做全量复制
  如果需要不更改run id重启redis,可以使用redis-cli debug reload命令

(4)psync

  从节点使用psync从master node进行复制,psync runid offset
  master node会根据自身的情况返回响应信息,可能是FULLRESYNC runid offset触发全量复制,可能是CONTINUE触发增量复制

全量复制

  master执行bgsave,在本地生成一份rdb快照文件
  master node将rdb快照文件发送给salve node,如果rdb复制时间超过60秒(repl-timeout),那么slave node就会认为复制失败,可以适当调节大这个参数
  对于千兆网卡的机器,一般每秒传输100MB,6G文件,很可能超过60s
  master node在生成rdb时,会将所有新的写命令缓存在内存中,在salve node保存了rdb之后,再将新的写命令复制给salve node
  client-output-buffer-limit slave 256MB 64MB 60,如果在复制期间,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么停止复制,复制失败
  slave node接收到rdb之后,清空自己的旧数据,然后重新加载rdb到自己的内存中,同时基于旧的数据版本对外提供服务
  如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF

增量复制

  如果全量复制过程中,master-slave网络连接断掉,那么salve重新连接master时,会触发增量复制
  master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB
  msater就是根据slave发送的psync中的offset来从backlog中获取数据的

heartbeat

  主从节点互相都会发送heartbeat信息

  master默认每隔10秒发送一次heartbeat,salve node每隔1秒发送一个heartbeat

异步复制

  master每次接收到写命令之后,现在内部写入数据,然后异步发送给slave node

看完了这篇文章,相信你对如何保证Redis的高并发有了一定的了解,想了解更多相关知识,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: 如何保证Redis的高并发

本文链接: https://www.lsjlt.com/news/53245.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何保证Redis的高并发
    小编给大家分享一下如何保证Redis的高并发,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!  单机的redis几乎不太可能说QPS超过10万+,一般在几万。  除非一些特殊情况,比如你的机器性...
    99+
    2022-10-18
  • 高并发如何保证数据安全
    高并发保证数据安全的方法:在java中我们可以使用 setnx 的原子性来实现分布式锁保证数据唯一性。尽量让HTML静态化。将图片与页面进行分离。使用缓存、镜像、负载均衡的方法。需要使用数据库集群或者库表散列。...
    99+
    2022-10-07
  • 高并发下的接口如何保证幂等性
    一、背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也...
    99+
    2023-07-26
  • redis高并发如何处理
    Redis的高并发处理可以通过以下几个方面来进行优化: 集群部署:将Redis分片部署在多台服务器上,通过搭建Redis集群来实...
    99+
    2023-10-28
    redis
  • 高并发怎么保证线程安全
    线程安全有原子性、可见性、有序性这3个方面,我们可以从这三个方面入手,可以通过加锁来保证线程安全,如果对象是immutable,则是线程安全,可放心使用,也可以使用synchronized关键字来保证线程安全。...
    99+
    2022-10-13
  • 高并发怎么保证数据的准确性
    高并发保证数据准确性的方法:在DB层开启事务,然后select 一行for update给这一行加上排它锁,再去更新行,然后提交,其他事务就会阻塞在select for update。在业务层面乐观锁CAS,使用版本号解决ABA问题,实际使...
    99+
    2022-10-11
  • 高并发怎么保证数据一致性
    使用redis本身的原子性操作库储存。// redis会返回操作之后的结果,这个过程是原子性的Long currStock = redisTemplate.opsForHash().increment...
    99+
    2022-10-04
  • 如何使用Redis解决高并发
    这篇文章主要介绍了如何使用Redis解决高并发的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Redis解决高并发文章都会有所收获,下面我们一起来看看吧。NoSQLNot Only SQL的简称。NoSQ...
    99+
    2023-07-05
  • Redis如何解决高并发问题
    这篇文章主要介绍Redis如何解决高并发问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:redis为什么会有高并发问题redis的出身决定 redis是一种单线...
    99+
    2022-10-18
  • PHP打包的同时如何保证并发性?
    PHP是一种广泛使用的编程语言,用于开发各种类型的应用程序。在开发过程中,打包是一个必不可少的步骤。打包可以将多个文件或目录压缩成一个单独的文件,以便在不同的环境中进行部署。但是,在打包的同时保证并发性也是一个关键问题,因为在高并发环境下,...
    99+
    2023-07-27
    打包 并发 面试
  • 高并发下Redis如何保持数据一致性(避免读后写)
    “读后写” 通常意义上我们说读后写是指针对同一个数据的先读后写,且写入的值依赖于读取的值。 关于这个定义要拆成两部分来看,一:同一个数据;二:写依赖于读。(记...
    99+
    2022-11-13
  • redis如何保证数据一致
    Redis通过以下方式来保证数据一致性:1. 写操作的原子性:Redis的写操作是原子性的,即对于一个键的写操作要么成功,要么失败,...
    99+
    2023-08-30
    redis
  • Redis的查询很快的原因解析及Redis如何保证查询的高效
    目录Redis如何保证高效的查询效率为什么Redis比较快Redis中的数据结构1、简单动态字符串2、链表3、字典4、跳表5、整数数组6、压缩列表为什么单线程还能很快基于多路复用的高...
    99+
    2022-11-13
  • Redis的高并发和快速原因
    这篇文章给大家分享的是Redis的高并发和快速原因。小编觉得挺实用的,因此分享给大家学习。如下资料是关于Redis的高并发和快速原因的内容。1.redis是基于内存的,内存的读写速度非常快;2.redis是...
    99+
    2022-10-18
  • ASP IDE路径并发:如何保证数据安全?
    在ASP IDE开发中,有时候会出现路径并发的问题,这可能会导致数据被多个请求同时读写,从而引发数据安全问题。本文将介绍ASP IDE路径并发的概念及其解决方法,帮助开发者更好地保证数据安全。 一、什么是路径并发? 路径并发是指多个请求同...
    99+
    2023-10-11
    ide path 并发
  • redis如何保证key均匀分布
    Redis 通过使用哈希函数以及虚拟槽(slot)来保证 key 的均匀分布。首先,Redis 使用一致性哈希算法来选择服务器节点。...
    99+
    2023-08-24
    redis key
  • redis在高并发下的性能讲解
    这篇文章主要介绍“redis在高并发下的性能讲解”,在日常操作中,相信很多人在redis在高并发下的性能讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis在高并发下...
    99+
    2022-10-18
  • 数据库高并发请求怎么保证数据完整性
    小编给大家分享一下数据库高并发请求怎么保证数据完整性,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!存储引擎查看MySQL给开发者提供了查询存储引擎的功能,我这里使用的是MySQL5.6.4,可...
    99+
    2022-10-18
  • 如何使用Go语言和Redis开发高并发系统
    如何使用Go语言和Redis开发高并发系统引言:随着互联网的快速发展,高并发系统的需求也越来越大。在这样的背景下,Go语言和Redis作为高性能的工具,成为了众多开发者的首选。本文将介绍如何使用Go语言和Redis开发高并发系统,包括详细的...
    99+
    2023-10-26
    Go语言 redis 高并发系统
  • redis宕机如何保证业务正常
    redis宕机可通过实现Redis缓存切面来保证业务正常,示例代码:package com.raymon.hcp.security.aspect;import com.raymon.hcp.security.annotation.Cache...
    99+
    2022-10-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作