从0开始回顾Redis---系列二

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis单线程1、单线程Redis为什么这么快?1. 单线程实现:避免了多线程编程模式面临的共享资源的并发访问控制问题,比如线程切换和锁资源争用的开销。2. 内存存储:Redis是使用内存存储,没有磁盘IO上的开销。3. 高效的数据结构: 采用了高效的数据结构,例如哈希表和跳表,这是它实现高性能的一个重要原因。4. 采用多路复用机制:使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。2、基于多路复用的高性能I/O模型多路复用机制是指一个线程处理多个IO流,就是我们经常听到的select/epoll机制。简单来说,在Redis只运行单线程的情况下,该机制允许内

Redis单线程


1、单线程Redis为什么这么快?


  1. 单线程实现避免了多线程编程模式面临的共享资源的并发访问控制问题,比如线程切换和锁资源争用的开销。
  2. 内存存储Redis是使用内存存储,没有磁盘IO上的开销。
  3. 高效的数据结构 采用了高效的数据结构,例如哈希表和跳表,这是它实现高性能的一个重要原因。
  4. 采用多路复用机制:使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。


2、基于多路复用的高性能I/O模型


多路复用机制是指一个线程处理多个IO流,就是我们经常听到的select/epoll机制。简单来说,在Redis只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给Redis线程处理,这就实现了一个Redis线程处理多个IO流的效果。

Redis网络框架调用epoll机制,让内核监听这些套接字。此时,Redis线程不会阻塞在某一个特定的监听或已连接套接字上,也就是说,不会阻塞在某一个特定的客户端请求处理上。正因为此,Redis可以同时和多个客户端连接并处理请求,从而提升并发性。  

为了在请求到达时能通知到Redis线程,select/epoll提供了基于事件的回调机制即针对不同事件的发生, 调用相应的处理函数。  

具体过程如下

  1. Redis网络框架调用epoll机制,让内核监听这些套接字。
  2. select/epoll一旦监测到FD(套接字)上有请求到达时,就会触发相应的事件。
  3. 这些事件会被放进一个事件队列,Redis单线程对该事件队列不断进行处理。

总结

这样一来,Redis无需一直轮询是否有请求事件发生,这就可以避免造成CPU资源浪费。同时,Redis在对事件队列中的事件进行处理时,会调用相应的处理函数,这就实现了基于事件的回调。因为Redis一直在对事件队列进行处理,所以能及时响应客户端请求,提升Redis的响应性能


3、Redis为啥被称为单线程?


  1. Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的这也是Redis对外提供键值存储服务的主要流程。
  2. 但Redis的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。所以,严格来说,Redis并不是单线程,但是我们一般把Redis称为单线程高性能,这样显得“酷”些。


4、Redis6.0为什么引入多线程?


  1. Redis主要瓶颈在于内存与网络IO,内存不够可以增加或提供数据结构优化,而网络lO读写占时间,若可以将网络处理改为多线程,性能将大幅度提高。
  2. 引入多线程处理网络读写,执行命令还是单线程,充分利用服务器多核资源。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
NoSQL Redis
31Redis - 如何启动多个Redis
31Redis - 如何启动多个Redis
135 0
|
6月前
|
存储 NoSQL 定位技术
从0开始回顾Redis---系列三
数据结构 1、讲一讲Redis数据类型及底层数据结构? Redis 的五大常用数据类型:String(字符串)、List(列表)、Hash(哈希)、Set(集合)和Sorted Set(有序集合) 1.1 String(SDS) 简介 ● 是 Redis 最基本的数据类型,普通的key- value 存储都可以归为此类。二进制安全的,可以包含任何数据,比如 JPG 图片或者序列化的对象,最大能存储 512 MB。 应用场景:计数的场景,用户的访问次数、热点文章的点赞转发数量。 底层实现:String对象底层的数据结构实现主要是 int 和简单动态字符串 SDS。 struct sdshdr{
|
6月前
|
NoSQL Linux Redis
Redis -- 安装客户端redis-plus-plus
Redis -- 安装客户端redis-plus-plus
352 0
|
6月前
|
缓存 NoSQL 关系型数据库
从0开始回顾Redis---系列一
基础 1、Redis是什么?简述它的优缺点? Redis是用 C 语言开发的一个开源的高性能键值对(key-value)内存数据库。经常被用来做缓存,消息队列,分布式锁。 Redis 提供了多种数据类型来支持不同的业务场景,如 字符串(strings),散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)与范围查询。 Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。 优点: ● 读写性能极高, Redis能读的速度是110000次/s,写的速度是81000次/s。 ● 支持数据持久化,支持AOF和RDB两种持久化方式。 ●
|
6月前
|
运维 监控 NoSQL
从0开始回顾Redis---系列六
哨兵机制 1、什么是哨兵,哨兵的作用是什么? 哨兵其实就是一个运行在特殊模式下的Redis进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主(选择主库)和通知。 ● 监控:哨兵进程在运行时,周期性地给所有的主从库发送PING命令,检测它们是否仍然在线运行。如果从库没有在规定时间内响应哨兵的PING命令,哨兵就会把它标记为“下线状态”;同样,如果主库也没有在规定时间内响应哨兵的PING命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。 ● 选主:主库挂了以后,哨兵就需要从很多个从库里,按照一定的规则选择一个从库实例,把它作为新的主库。这一步完成后,现在的集群里
|
6月前
|
消息中间件 缓存 NoSQL
从0开始回顾Redis---系列八
缓存 1、缓存穿透? 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。 解决方案: 1. 接口校验:在正常业务流程中可能会存在少量访问不存在 key 的情况,但是一般不会出现大量的情况,所以这种场景最大的可能性是遭受了非法攻击。可以在最外层先做一层校验:用户鉴权、数据合法性校验等,例如商品查询中,商品的ID是正整数,则可以直接对非正整数直接过滤等等。 2. 缓存空值:当访问缓存和DB都没有查询到值时,可以将空值写进缓存,但是设置较短的过期时间,该时间需要根据产品业务特性来
|
6月前
|
存储 消息中间件 NoSQL
从0开始回顾Redis---系列十
布隆过滤器 1、讲一讲布隆过滤器? 布隆过滤器,它是一个连续的数据结构,每个存储位存储都是一个bit,即0或者1, 可以用来快速判断某个数据是否存在。 标记某个数据时: 我们使用K个不同的哈希函数将这个数据映射为bit数组上的K个点,并把它们置为1。 查询某个数据时:先使用K个哈希函数得到这个数据在bit数组中对应的k个位置 ,然后判断bit值是不是1: ● 只要有一个不是1,就说明布隆过滤器没有对该数据做过标,即该数据不存在 ; ● 如果都是1,也只是表示数据可能存在。 优点: 1. 布隆过滤器的查询速度很快,一般只需要几毫秒; 2. 布隆过滤器只需要很少的空间,因为它只是一个位数组。
|
6月前
|
SQL 监控 NoSQL
从0开始回顾Redis---系列九
事务 1、Redis能实现ACID属性吗? ACID 1. 原子性: 一个事务中的多个操作必须都完成,或者都不完成。 2. 一致性: 数据库中的数据在事务执行前后是一致的。 3. 隔离性: 数据库在执行一个事务时,其它操作无法存取到正在执行事务访问的数据。 4. 持久性: 数据库执行事务后,数据的修改要被持久化保存下来。当数据库重启后,数据的值需要是被修改后的值。 Redis的事务机制可以保证一致性和隔离性,但是无法保证持久性。不过,因为Redis本身是内存数据库,持久性并不是一个必须的属性,我们更加关注的还是原子性、一致性和隔离性这三个属性。 原子性的情况比较复杂,只有当事务中使
|
6月前
|
存储 NoSQL 定位技术
从0开始回顾Redis---系列四
数据结构 1、讲一讲Redis数据类型及底层数据结构? Redis 的五大常用数据类型:String(字符串)、List(列表)、Hash(哈希)、Set(集合)和Sorted Set(有序集合) 1.1 String(SDS) 简介 ● 是 Redis 最基本的数据类型,普通的key- value 存储都可以归为此类。二进制安全的,可以包含任何数据,比如 JPG 图片或者序列化的对象,最大能存储 512 MB。 应用场景:计数的场景,用户的访问次数、热点文章的点赞转发数量。 底层实现:String对象底层的数据结构实现主要是 int 和简单动态字符串 SDS。 struct sdshdr{
|
6月前
|
NoSQL 算法 Redis
从0开始回顾Redis---系列七
切片集群 1、为什么要集群? 在实际应用Redis时,随着用户或业务规模的扩展,保存大量数据的情况通常是无法避免的。 我们可以用两种方案: 1. 纵向扩展:升级单个Redis实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的CPU。 2. 横向扩展:横向增加当前Redis实例的个数 。 那么,这两种方式的优缺点分别是什么呢? 1. 纵向扩展: ● 优点:实施起来简单、直接。 ● 缺点: ○ 当使用RDB对数据进行持久化时,如果数据量增加,需要的内存也会增加,主线程fork子进程时就可能会阻塞(比如刚刚的例子中的情况) ○ 纵向扩展会受到硬件和成本的限制。 2.
下一篇
无影云桌面