精华内容
下载资源
问答
  • Redis如何支持高并发 Redis 主从架构(master-slave) + Redis 读写分离 Redis 集群架构做成主从架构,一主多从。主负责写,并负责将数据同步到其他的salve 节点上,从负责读,所有的读请求走从节点 这样不仅能支持...

    Redis如何支持高并发

    Redis 主从架构(master-slave) + Redis 读写分离

    Redis 集群架构做成主从架构,一主多从。主负责写,并负责将数据同步到其他的salve 节点上,从负责读,所有的读请求走从节点

    这样不仅能支持高并发还能很轻易的进行水平扩容,只需要在扩容 slave 节点就好了

    Redis replication 主从同步基本原理

    1. redis 采用异步复制的方法进行复制,现在好像是 slave node 会周期性的确认一下自己每次复制的数据量
    2. 一个master node 可以有多个 salve node
    3. slave node 可以链接其他的 slave node
    4. slave node 做复制的时候不会阻塞 master的工作
    5. slave node 进行复制的时候不会阻塞自己的读操作,会使用旧数据,等同步完成删除旧数据,在使用新数据
    6. slave node 可以做水平扩容进而支持高并发

    为什么主从架构必须要开启持久化机制

    当master 宕机之后,如果没=没有开启持久化,那么master上的数据是空的,如果在经过复制之后 slave 节点的数据也全部为空

    就算是哨兵自主选择了 master,在启动之后原 master节点也会丢失部分数据,即便是这样,还是会存在哨兵还没有检测到 master failure,master 自己重启了,还是会导致所有的数据清空

    Redis 如何将 master 数据复制到 slave 上

    master 将数据复制到 slave 上一般有全量复制和增量复制两种操作

    全量复制一般出现在 slave 初始化节点
    增量复制一般是 slave 中已经有了 master 的部分数据,但是因为某种原因和master 断开了链接,之后又重连上了

    主从复制原理:

    1. 一个slave 链接到 master 的时候会给 master 发送一个 sync 命令
    2. master 接收到命令之后就会将数据生成快照文件,并且在缓冲区记录之后的写操作
    3. master 将生成的快照文件发送给所有的从节点
    4. 从节点接收到新的快照文件之后丢弃旧数据,载入新数据
    5. 主节点快照发送完成之后就会将之后的写操作发送给从服务器
    6. 从服务器执行主节点发送过来的写命令

    在这里插入图片描述

    主从复制的断点续传

    中途断网导致没有一次性传输完成,在连接之后还会在断点处继续传输

    原理: master 节点会在内存中创建一个 backlog 的日志文件,backlog 文件中会有一个 raplica offset 来记录传输到哪里,当链接之后,salve 就会要求 master 从 replica offset 出传输

    过期 key 的处理

    slave 不会过期 key,只有当 master 过期 key 之后,master 会模拟一条del命令发送给slave

    Redis 如何实现高可用

    通过哨兵 + Redis 主从架构 进行故障转移


    参考博客:https://www.cnblogs.com/daofaziran/p/10978628.html

    展开全文
  • Redis高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快; 2.redis是单线程的,省去了很多上下文切换线程的时间; 3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用...

    转自:https://www.jianshu.com/p/0bf46dd0aaf5

    参考:https://youzhixueyuan.com/reasons-for-redis-fast.html

    Redis的高并发和快速原因

    1.redis是基于内存的,内存的读写速度非常快;

    2.redis是单线程的,省去了很多上下文切换线程的时间;

    3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。

    下面重点介绍单线程设计和IO多路复用核心设计快的原因。

    为什么Redis是单线程的

    1.官方答案

    因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

    2.性能指标

    关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

    3.详细原因

    1)不需要各种锁的性能消耗

    Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除
    一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。
    总之,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。

    2)单线程多进程集群方案

    单线程的威力实际上非常强大,每核心效率也非常高,多线程自然是可以比单线程有更高的性能上限,但是在今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,这些方案中多线程的技术照样是用不上的。

    所以单线程、多进程的集群不失为一个时髦的解决方案。

    3)CPU消耗

    采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。

    但是如果CPU成为Redis瓶颈,或者不想让服务器其他CUP核闲置,那怎么办?

    可以考虑多起几个Redis进程,Redis是key-value数据库,不是关系数据库,数据之间没有约束。只要客户端分清哪些key放在哪个Redis进程上就可以了。

    Redis单线程的优劣势

    1.单进程单线程优势

    1. 代码更清晰,处理逻辑更简单
    2. 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
    3. 不存在多进程或者多线程导致的切换而消耗CPU

    2.单进程单线程弊端

    1. 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;

    IO多路复用技术

    redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。

    多路-指的是多个socket连接,复用-指的是复用一个线程。多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术。

    这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路
    I/O
    复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。

    Redis高并发快总结

    1. Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快。

    2. 再说一下IO,Redis使用的是非阻塞IO,IO多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。

    3. Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。

    4. 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。

    5. 还有一点,Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

    展开全文
  • 1.单线程,不存在进程切换影响cpu速度 2.纯内存操作 3.使用多路I/O复用模型,非阻塞IO 多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当...

    1.单线程,不存在进程切换影响cpu速度

    2.纯内存操作

    3.使用多路I/O复用模型,非阻塞IO

          多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。

     

    展开全文
  • 1、基本原理 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗) (1)为什么不采用多进程或多线程处理? 多线程处理可能涉及到锁 ...Redis采用了线程封闭的方式,把任...

    1、基本原理 
    采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗) 
    (1)为什么不采用多进程或多线程处理?

    多线程处理可能涉及到锁 
    多线程处理会涉及到线程切换而消耗CPU

    (2)单线程处理的缺点?

    无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善

    2、Redis不存在线程安全问题? 
    Redis采用了线程封闭的方式,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁

    3、什么是多路I/O复用(Epoll) 
    (1) 网络IO都是通过Socket实现,Server在某一个端口持续监听,客户端通过Socket(IP+Port)与服务器建立连接(ServerSocket.accept),成功建立连接之后,就可以使用Socket中封装的InputStream和OutputStream进行IO交互了。针对每个客户端,Server都会创建一个新线程专门用于处理 
    (2) 默认情况下,网络IO是阻塞模式,即服务器线程在数据到来之前处于【阻塞】状态,等到数据到达,会自动唤醒服务器线程,着手进行处理。阻塞模式下,一个线程只能处理一个流的IO事件 
    (3) 为了提升服务器线程处理效率,有以下三种思路

    复制代码

    (1)非阻塞【忙轮询】:采用死循环方式轮询每一个流,如果有IO事件就处理,这样可以使得一个线程可以处理多个流,但是效率不高,容易导致CPU空转
    
    (2)Select代理(无差别轮询):可以观察多个流的IO事件,如果所有流都没有IO事件,则将线程进入阻塞状态,如果有一个或多个发生了IO事件,则唤醒线程去处理。但是还是得遍历所有的流,才能找出哪些流需要处理。如果流个数为N,则时间复杂度为O(N)
    
    (3)Epoll代理:Select代理有一个缺点,线程在被唤醒后轮询所有的Stream,还是存在无效操作。 Epoll会哪个流发生了怎样的I/O事件通知处理线程,因此对这些流的操作都是有意义的,复杂度降低到了O(1)

    复制代码

    4、其它开源软件采用的模型

    Nginx:多进程单线程模型 
    Memcached:单进程多线程模型

     

    Redis为什么是单线程的?

    因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽。(以上主要来自官方FAQ)既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求,参见:How fast is Redis?

     

    如果万一CPU成为你的Redis瓶颈了,或者,你就是不想让服务器其他核闲置,那怎么办?

    那也很简单,你多起几个Redis进程就好了。Redis是keyvalue数据库,又不是关系数据库,数据之间没有约束。只要客户端分清哪些key放在哪个Redis进程上就可以了。redis-cluster可以帮你做的更好。

     

    单线程可以处理高并发请求吗?

    当然可以了,Redis都实现了。

    有一点概念需要澄清,并发并不是并行。

    (相关概念:并发性I/O流,意味着能够让一个计算单元来处理来自多个客户端的流请求。并行性,意味着服务器能够同时执行几个事情,具有多个计算单元)

     

    Redis总体快速的原因:

    采用队列模式将并发访问变为串行访问(?)

     

    单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),其他模块仍用了多个线程。

     

     

    总体来说快速的原因如下:

    1)绝大部分请求是纯粹的内存操作(非常快速)

    2)采用单线程,避免了不必要的上下文切换和竞争条件

    3)非阻塞IO

    内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间

    这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。

     

    ======

     

    1. Redis服务端是个单线程的架构,不同的Client虽然看似可以同时保持连接,但发出去的命令是序列化执行的,这在通常的数据库理论下是最高级别的隔离(serialize)
    2. 用MULTI/EXEC 来把多个命令组装成一次发送,达到原子性
    3. 用WATCH提供的乐观锁功能,在你EXEC的那一刻,如果被WATCH的键发生过改动,则MULTI到EXEC之间的指令全部不执行,不需要rollback
    4. 其他回答中提到的DISCARD指令只是用来撤销EXEC之前被暂存的指令,并不是回滚


     

    多线程对同一个Key操作时,Redis服务是根据先到先作的原则,其他排队(可设置为直接丢弃),因为是单线程。

    修改默认的超时时间,默认2秒。但是大部份的操作都在30ms以内。

    ========

     

     

     

    1. 使用Redis有哪些好处?

    (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

    (2) 支持丰富数据类型,支持string,list,set,sorted set,hash

    (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

    (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

     

    2. Redis相比memcached有哪些优势?

    (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

    (2) redis的速度比memcached快很多

    (3) redis可以持久化其数据

    (4)Redis支持数据的备份,即master-slave模式的数据备份。

     

     

    (5)、使用底层模型不同

    它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。

    Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

    (6)value大小:redis最大可以达到1GB,而memcache只有1MB

     

     

     

    3. redis常见性能问题和解决方案:

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

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

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

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

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

    (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

    这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

     

    redis的一些其他特点:

     

    (1)Redis是单进程单线程的

     

    redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

     

    (2)读写分离模型

     

    通过增加Slave DB的数量,读的性能可以线性增长。为了避免Master DB的单点故障,集群一般都会采用两台Master DB做双机热备,所以整个集群的读和写的可用性都非常高。
    读写分离架构的缺陷在于,不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力还是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。

     

    (3)数据分片模型

     

    为了解决读写分离模型的缺陷,可以将数据分片模型应用进来。

    可以将每个节点看成都是独立的master,然后通过业务实现数据分片。

    结合上面两种模型,可以将每个master设计成由一个master和多个slave组成的模型。

    (4)Redis的回收策略

     

      • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

      • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

      • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

      • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

      • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

      • no-enviction(驱逐):禁止驱逐数据

      •  

        注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。

          使用策略规则:

          1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru

          2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random

     

    展开全文
  • 3. Redis如何支持高并发? 1. 学习内容 (1)Redis高并发和系统的高并发有什么关系? (2)Redis如何支撑高并发? 2. Redis高并发和系统的高并发有什么关系? 大型电商系统中,像商城首页,商品详情页,高峰时期,...
  • 1、主从结构支持高并发 我们使用redis缓存,主要目的是为了读的高并发,所以可以采用一主多从,读写分离,master负责写,写完后异步将数据复制到slave中,slave负责分担读请求 redis replication 原理 (1)redis...
  • 在现实中很多的业务场景里,人们常常使用 ...平台要开始考虑高并发场景下是否系统是否支撑的下去。尤其是考虑瞬间大量请求时,系统如何设计。 存在读写压力,可以采用数据库分库分表的方式,不过基于成本考虑,数据
  • redis高并发:主从架构,一主多从,一般来说,很多项目其实就足够了,单主用来写入数据,单机几万QPS,多从用来查询数据,多个从实例可以提供每秒10万的QPS。 redis高并发的同时,还需要容纳大量的数据:一主多从,...
  • 申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人...Redis如何支持高并发 单机的redis一般QPS不会超过超过10万+,一般单机QPS都在几万左右,如果需要支撑高并发,...
  • 秒杀功能不外乎就是解决两个问题,第一个是高并发对数据库产生的压力,第二个是竞争状态下如何解决库存的正确减少,则超卖问题。 使用redis是最优方式,文件锁和数据库锁都不太好,因为redis可以方便实现分布式锁,...
  • 文章目录1、IO读写的基础原理1.1 内核缓冲区与进程缓存区1.2 详解典型的系统调用流程2、四种主要的IO模型2.1 同步阻塞...深入剖析高并发IO的底层原理和模型,介绍如何通过设置来让操作系统支持高并发 1、IO读写的基础原
  • 从操作系统的底层原理开始讲解:浅显易懂地剖析高并发IO的底层 原理,并介绍如何让单体Java应用支持百万级的高并发;从传统的阻塞式OIO开 始,细致地解析Reactor高性能模式,介绍高性能网络开发的基础知识;从Java的...
  • redis高并发架构

    2020-02-19 11:34:49
    redis使用过程主要考虑:高并发、高可用、持久性几个方面 高并发 单节点redis通常能够支持1w到几万的,假如单节点实力能够支撑5w的qps 问题1:如何redis支撑10万的读qps? 分为两种情况来考虑: 1、数据量单节点...
  • 项目目标:使用基本Redis(jedis)函数优化数据库并支持高并发情况。 这个项目需要导入两个jar文件,这里我使用postgresql作为数据库。 首先,我们需要构建redis集群,有关如何构建集群的过程可以在我的博客中...
  • Redis如何实现高并发 并行与并发的定义: 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。...
  • 然后每个系统连一个数据库,这样本来就一个库,现在多个数据库,不也可以抗高并发么。 (2)缓存,必须得用缓存。大部分的高并发场景,都是读多写少,那你完全可以在数据库和缓存里都写一份,然后读的时候大量走缓存...
  • 这份高并发手册首先,从操作系统的底层原理开始讲解浅显易懂地剖析高并发IO的底层原理,并介绍如何让单体Java应用支持百万级的高并发,接着,重点讲解Netty,然后,对ZooKeeper进行详细的介绍,最后,通过CrazyIM...
  • redis 如何在保持读写分离+可用的架构下,还能横向扩容支撑 1T + 海量数据 后面会老提到 读写分离和 master。之前的课程讲解中说了读写分离后的水平扩容是通过扩容 slave 来达到的。 但是在实际生产环境中,...
  • redis支持十万级的高并发架构搭建完成,那么下面讲解保证架构高可用 那么redis 主从架构下如何才能做到 99.99% 的高可用性? 什么是 99.99% 高可用? 不可用:系统挂掉,很难恢复起来,短时间内都不行,这就...
  • Redis是我们当下比较流行使用的非关系数据库,可支持多样化的数据类型,多线程高并发支持redis运行在内存拥有更快的读写。因为redis的表现如此出色,如何能保障redis在运行中能够应对宕机故障,所以今天总结了下...
  • 在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天继续由陈睿|mikechen来继续...
  • 一、Redis如何支持高并发的QPS请求   主从备份   二、Redis replication以及master持久化对主从架构的安全意义   1、redis replication的基本原理 2、redis replication的核心机制  redis采用异步方式...
  • 单机的redis大概支持的qps在几万左右,所以当你的qps到10万+的时候就要通过redis的读写分离来承载高并发的读了。 1、redis replication基本原理 1)首先slave连接master的时候会发送一个sync的命令 2)master会去...
  • 技术障碍:  1. 面对用户量的增长,记录数3W倍的增长,如何保证这些记录能够在比较快的... 服务器的增长,是否能够支持现有的扩展能力。 架构实现: 使用到的技术项:  1. 面向服务开发思维  2. 队列服务  
  • (1) 与应用耦合,没有对外屏蔽掉内部实现细节,例如redis,用户完全不需要知道ID生成器使用什么产生的ID; (2) 扩展性差,在项目规模较大时,ID的应用会非常多,如果用一组redis无法满足需求时,不方面扩展...
  • 需求分析 项目中经常会遇到这种场景:一...使用现有的缓存技术框架,比如redis,ehcache。优点:成熟,稳定,功能强大;缺点,项目需要引入对应的框架,不够轻量。 如果不考虑分布式,只是在单线程或者多线程间作数据...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 207
精华内容 82
关键字:

redis如何支持高并发

redis 订阅