Redis 缓存之一

锺繇
• 阅读 1480

为什么使用缓存

优点:

  1. 高性能
  2. 高并发
    MySQL天然对高并发不好,MySQL单机支撑2000qps也开始容易报警,可以使用缓存,让数据查询从缓存中拿出数据

缺点:

  1. 缓存的数据和数据库的数据不一致
  2. 缓存雪崩
  3. 缓存穿透
  4. 缓存并发竞争

redis 和memcached 的区别

  1. Redis支持服务端的操作:Redis相比memcache来说,有更多的数据结构和并支持更丰富的数据操作
  2. memcache没有原生的集群模式,需要依赖客户端来实现往集群中分片写入数据,但是Redis支持原生的cluster模式,支持集群模式。

Redis 的线程模型

  1. Redis是基于reactor模式开发的网络事件处理器,这个处理器叫做文件事件处理器,file event handler。这个文件事件处理器是单线程的,所以Redis叫做单线程模型,采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器处理这个事件。
    如果被监听的scoket准备好执行accept,read,write,close等操作的时候,跟操作对应的文件事件就会产生,这个时候文件事件处理器就会调用和之前相关的事件处理器处理这些事件。
    文件事件处理器是单线程的,但是可以通过IO多路复用机制监听多个socket,可以实现高性能的网络通信,有可以和内部的其他线程某块进行对接,保证了Redis内部的线程模型的简单性。
    文件事件处理器包括4个部分,即多个socket,IO多路复用程序,文件事件分派器,事件处理器(命令请求处理器,命令回复处理器,连接应答处理器等)
    连接应答处理器:将事件如AE—READERABLE事件和命令请求处理器相关联。
    命令请求处理器:将请求指令中的数据读出key和value,然后完成key和value的设置。
    命令回复处理器:对本次的操作输出一个结果。
    多个socket可能并发的产生不同的操作,每一个操作对应一个不同的文件事件,但是IO多路复用程序会监听多个socket,会将多个socket放入一个对列中进行排队,每一次从排队中拿出一个socket给事件分派器,事件分派器把socket给对应的事件处理器。
  2. 文件事件
    当socket变得可读的时候(如客户端对Redis进行write操作的时候,或者close操作的时候),socket就会产生一个AE—READBLE事件,当socket变得可写的时候(客户端对Redis进行read操作),socket会产生一个AE-WRITEABLE事件,IO多路复用程序可以同时监听AE-WRITE和AE-READE两种事件,那么文件事件派发器会优先处理AE-READBLE事件,然后处理AE—WRITE事件。
  3. 文件事件处理器

    如果时客户端要连接Redis,那么会为socket关联连接应答处理器
    如果客户端要写数据到Redis,那么会为scoket关联命令请求处理器
    如果客户端要从Redis读取数据,那么会为socket关联命令回复处理器

  4. 客户端与Redis通信的一次流程

    在Redis启动初始化的时候,Redis会将连接应答处理器和AE-READABLE事件关联在一起,接着如果客户端跟Redis发起连接,此时会产生一个AE-READBLE事件,然后由连接应答处理器来处理和客户端建立连接,创建客户端对应的socket,同时将这个socket的AE-READBLE事件跟命令请求处理器关联起来。

    当客户端向Redis发起请求的时候,(不管是读或者是写的请求),首先就会在socket产生一个AE-READBLE事件,然后由对应的命令请求处理器来处理,这个命令请求处理器就会从socket中读取相关数据,然后进行执行和处理。

    接着Redis这边准备好了给客户端的响应数据之后,就会将socket的AE-WRITEABLE事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据的时候,就会产生一个AE-WRITEABLE事件,会有对应的命令回复处理器来处理,这就是将准备好的响应数据写入socket,供客户端读取。

    命令回复处理器写完之后,就会删除这个socket的AE-WRITEABLE事件和命令回复处理器的关联关系。

  5. 为什么Redis是单线程模型也能效率那么高
    (1) 纯内存操作
    (2) 核心是非阻塞的IO多路复用机制
    (3) 单线程反而避免了多线程的频繁上线文切换问题
点赞
收藏
评论区
推荐文章
Stella981 Stella981
4年前
Redis 击穿、穿透、雪崩的解决方案
Redis击穿、穿透、雪崩的解决方案击穿和穿透场景:指的是单个key在缓存中查不到,去数据库查询(透过redis去查db叫击穿)区别:击穿:数据在数据库中真实存在,缓存丢失,大量请求击穿数据库穿透:数据在缓存中没有,数据库中也没有
Stella981 Stella981
4年前
Redis 总结精讲
本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题
Stella981 Stella981
4年前
Redis 缓存性能实践及总结
一、前言在互联网应用中,缓存成为高并发架构的关键组件。这篇博客主要介绍缓存使用的典型场景、实操案例分析、Redis使用规范及常规Redis监控。二、常见缓存对比常见的缓存方案,有本地缓存,包括HashMap/ConcurrentHashMap、Ehcache、Memcache、GuavaCache等,缓存中间件包
Stella981 Stella981
4年前
300 分钟撸一个基于 Redis 亿级用户高并发系统
对于618、双十一、春运抢票这种高并发、大流量的场景一般都会用到缓存抗住大并发,市面上缓存框架用的最多的无疑就是Redis了,Redis作为稳居世界排名第一的KV内存数据库,同时也是最受欢迎的分布式缓存中间件,是应对高并发,大流量,低延迟业务场景的不二选择。面试必问!下面这十几道题都是关于Redis大厂面试被问到的,基本都跟Redis架构设计与底层原
Stella981 Stella981
4年前
Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
\TOC\Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级1、缓存雪崩  发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机  解决办法:    1)随机均匀设置失效
Stella981 Stella981
4年前
Redis缓存穿透、缓存雪崩和缓存击穿
Redis缓存穿透、缓存雪崩缓存雪崩,是指在某一个时间段,缓存集中过期失效。产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,
Stella981 Stella981
4年前
Redis学习笔记(五) 总结
为什么使用redis    改善性能。当大SQL执行耗时久,且结果不频繁变动,就特别适合将运行结果放入缓存,后面的请求从缓存中读取,使得请求能够迅速响应    缓解并发压力。大并发下,所有请求都是直接访问数据库的,会出现连接异常。redis做一个缓冲,让请求先访问redis,而不是数据库。
Stella981 Stella981
4年前
Memcached 缓存数据库应用实践
1.1数据库对比缓存:将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存  缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务。数据库:mysql(关系型数据库,能够保证数据一致性,保证数据不丢失,当因为功能太多,导致性能不高)数据参考缓存数据库:me
【专项测试系列】-缓存击穿、穿透、雪崩专项测试
作者:刘须华一、背景概述: R2M缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种情况都会有大量请求落到数据库,导致数据库资源占满,引起数据库故障。平时
服务端应用多级缓存架构方案 | 京东云技术团队
20w的QPS的场景下,服务端架构应如何设计?常规解决方案可使用分布式缓存来抗,比如redis集群,6主6从,主提供读写,从作为备,不提供读写服务。1台平均抗3w并发,还可以抗住,如果QPS达到100w,通过增加redis集群中的机器数量,可以扩展缓存的容量和并发读写能力。同时,缓存数据对于应用来讲都是共享的,主从架构,实现高可用。
Redis缓存异常及解决方案
本文向读者解释了Redis使用过程中,数据不一致、缓存雪崩、缓存击穿和缓存穿透等问题的定义,并给出对应的解决方案。
锺繇
锺繇
Lv1
牵挂在心中,无言也温暖,朋友在身边,踏实也心安。
文章
4
粉丝
0
获赞
0