Redis 系列之一
为什么使用缓存
优点:
- 高性能
- 高并发
MySQL天然对高并发不好,MySQL单机支撑2000qps也开始容易报警,可以使用缓存,让数据查询从缓存中拿出数据
缺点:
- 缓存的数据和数据库的数据不一致
- 缓存雪崩
- 缓存穿透
- 缓存并发竞争
redis 和memcached 的区别
- Redis支持服务端的操作:Redis相比memcache来说,有更多的数据结构和并支持更丰富的数据操作
- memcache没有原生的集群模式,需要依赖客户端来实现往集群中分片写入数据,但是Redis支持原生的cluster模式,支持集群模式。
Redis 的线程模型
- 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给对应的事件处理器。 - 文件事件
当socket变得可读的时候(如客户端对Redis进行write操作的时候,或者close操作的时候),socket就会产生一个AE—READBLE事件,当socket变得可写的时候(客户端对Redis进行read操作),socket会产生一个AE-WRITEABLE事件,IO多路复用程序可以同时监听AE-WRITE和AE-READE两种事件,那么文件事件派发器会优先处理AE-READBLE事件,然后处理AE—WRITE事件。 - 文件事件处理器
如果时客户端要连接Redis,那么会为socket关联连接应答处理器
如果客户端要写数据到Redis,那么会为scoket关联命令请求处理器
如果客户端要从Redis读取数据,那么会为socket关联命令回复处理器 - 客户端与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事件和命令回复处理器的关联关系。
- 为什么Redis是单线程模型也能效率那么高
(1) 纯内存操作
(2) 核心是非阻塞的IO多路复用机制
(3) 单线程反而避免了多线程的频繁上线文切换问题
Redis 系列之一相关推荐
- 深入剖析Redis系列(七) - Redis数据结构之列表
前言 列表(list)类型是用来存储多个 有序 的 字符串.在 Redis 中,可以对列表的 两端 进行 插入(push)和 弹出(pop)操作,还可以获取 指定范围 的 元素列表.获取 指定索引下标 ...
- redis 系列25 哨兵Sentinel (高可用演示 下)
原文:redis 系列25 哨兵Sentinel (高可用演示 下) 一. Sentinel 高可用环境准备 1.1 Sentinel 集群环境 环境 说明 操作系统版本 CentOS 7.4.17 ...
- redis系列之数据库与缓存数据一致性解决方案
redis系列之数据库与缓存数据一致性解决方案 参考文章: (1)redis系列之数据库与缓存数据一致性解决方案 (2)https://www.cnblogs.com/jiawen010/p/1215 ...
- 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...
- python使用redis_Python操作redis系列之 列表(list) (五)
# -*- coding: utf-8 -*-import redis r=redis.Redis(host="123.156.74.190",port=6379,password ...
- Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)
Redis6引入新的RESP3协议,并以此为基础加入了客户端缓存的新特性,在此特性下,大大提高了应用程序的响应速度,并降低了数据库的压力,本篇就带大家来看一下Redis6的新特性:客户端缓存. 目录 ...
- redis 系列26 Cluster高可用 (1)
redis 系列26 Cluster高可用 (1) 原文:redis 系列26 Cluster高可用 (1) 一.概述 Redis集群提供了分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故 ...
- 深入剖析Redis系列(五) - Redis数据结构之字符串
前言 字符串类型 是 Redis 最基础的数据结构.字符串类型 的值实际可以是 字符串(简单 和 复杂 的字符串,例如 JSON.XML).数字(整数.浮点数),甚至是 二进制(图片.音频.视频),但 ...
- Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- Redis系列教程(七):Redis并发竞争key的解决方案详解
Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题: 高并发架构系列:Redis缓存和MySQL数据一致性方案详解 如何解决Redis缓 ...
最新文章
- 北京君正集成电路的Newton平台--穿戴式
- 从架构到代码:软件开发最新趋势解析
- SLAM学习--常用数据集
- python中list是什么类型_Python 入门系列 —— 13. List 类型简介
- IntelliJ IDEA 使用 LiveEdit 插件实现实时可视化前端开发
- 7z压缩文档的powershell示例
- Tinyalsa之mixer_ctl_set_value(十)
- go bson转换成json_如何快速提升 Go 程序性能?
- Spring整合CXF发布及调用WebService
- Mongodb学习教程一
- bzoj2648/2716 kdtree
- 剑指offer刷题记录(C++)
- 供应链管理的三个层次
- 计算机扩大C盘分区容量,教你在保留数据的情况下,如何把C盘容量无限扩大!...
- ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015
- 世界上最健康的作息时间表健康十不易
- InfluxDB添加用户认证
- 2021-C++程序设计-实验3-继承和虚函数
- 批量缩小图片大小的方法
- 扫码枪(条码枪)v1.0可以实现无焦点捕获扫码输入,并可上传数据到服务器
热门文章
- 效率达CPU一万倍的神经形态芯片发布后,英特尔引发了多方吐槽
- 英伟达推出Super显卡,老黄再现精准“刀法”,网友:都是被AMD逼的
- Docker构建YApi镜像, Docker安装YApi, Docker部署YApi
- iOS 总结遇到的各种坑儿
- Codeforces-868C. Qualification Rounds(状压)
- 点权生成树(gentree)
- tomcat 深度优化
- nginx禁止未绑定域名访问返回444
- struts2 action重定向
- SQLPLUS SPOOL命令使用详解