赞
踩
目录
Redis6.0之后引入了多线程,你知道为什么吗? 瓶颈是内存和I/O 不是 cpu 应对高并发场景
Redis6.0的多线程主要负责命令执行的哪一块 I/O的解包和回包,读写客户端socket的I/O
大key,复杂计算,阻塞操作
Redis单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程来完成的,这也是我们常说Redis是单线程的原因。
官方答案是:因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。
---------------------------------------------------------------------------------------------------------------------------
后续采用多线程的模块和原因:
Redis在启动的时候,会启动后台线程(BIO):
之所以Redis为关闭文件、AOF刷盘、释放内存这些任务创建单独的线程来处理,是因为这些任务的操作都很耗时,把这些任务都放在主线程来处理会导致主线程阻塞,导致无法处理后续的请求。后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者不停轮询这个队列,拿出任务去执行对应的方法即可。
Redis核心处理是单线程的,在6.0中使用了多线程进行I/O解包、回包。使用多线程进行删除数据等异步任务,4.0就引入了。
我们从投入产出来看。首先如果引入多线程,主要是希望充分利用多核的性能,但Redis的定位,是内存 k-v存储,是做短平快的热点数据处理,一般来说执行会很快,执行本身不应该成为瓶颈,而瓶颈通常在n内存和网络I/O,处理逻辑上多线程并不会有太大收益。
同时,支持多线程的话,我们需要付出更大的复杂度、以及多线程上下文切换、同步机制的开销等成本。这样综合来看,成本高且收益不大,所以最终选择了不做,事实也证明,单线程的Redis也确实足够高效
Redis主要瓶颈是I/O而不是CPU,但随着互联网的高速发展,在部分高并发场景,单核CPU也不见得处理得过来了,所以针对核心处理流程中的解包、发包这两个CPU耗时操作,进行了多线程优化,充分发挥多核优势
默认是关闭的,如果想要开启需要用户在 redis.conf 配置文件中修改。
第一是为了兼容以前的,毕竟很多用户的认知中, Redis是单线程的。
第二可能也是认为多线程并不是必要的,在大多数场景不开启也是完全够用的。
原来核心流程中的I/O处理,包括解包和回包,也就是读写客户端socket的I/O,这两部分都消耗CPU时
间,多线程的引入主要也是为了解决单核CPU在大数据下还是不够用的问题。
MySQL是数据库系统,对于数据的操作需要访问磁盘,而将数据放在Redis中,需要访问就可以直接从内存获取,避免磁盘I/O,提高操作的速度。使用Redis+MySQL结合的方式可以有效提高系统QPS。
系统的 QPS(Queries Per Second)是指系统每秒处理的请求数量,用于衡量系统的性能和吞吐量。
共同点:
区别:
线程模型:
数据结构:
淘汰策略:
持久化:
集群:
数据序列化是将数据对象转换为可以在网络传输或存储中使用的字节流的过程。序列化后的数据可以被传输到远程系统或存储到磁盘等介质中,并在需要时进行反序列化还原为原始的数据对象。
数据序列化的主要目的是实现数据的持久化、跨平台通信和远程过程调用(RPC)。在不同的编程语言和系统之间,使用统一的序列化格式可以方便地传递数据,并保持数据的一致性和完整性。
常见的数据序列化格式包括以下几种:
epoll 是 Linux 内核提供的一种事件驱动 I/O 接口,用于高效地处理大量的文件描述符(sockets、文件等)的并发事件。
socket 请求是一种基于网络的通信方式,用于在客户端和服务器之间进行数据传输和交互。通过 Socket 请求,客户端可以向服务器发送请求,并接收服务器的响应。
①、操作字符串的命令有:
SET key value
:设置键 key 的值为 value。GET key
:获取键 key 的值。DEL key
:删除键 key。INCR key
:将键 key 存储的数值增一。DECR key
:将键 key 存储的数值减一。②、操作列表的命令有:
LPUSH key value
:将一个值插入到列表 key 的头部。RPUSH key value
:将一个值插入到列表 key 的尾部。LPOP key
:移除并返回列表 key 的头元素。RPOP key
:移除并返回列表 key 的尾元素。LRANGE key start stop
:获取列表 key 中指定范围内的元素。③、操作集合的命令有:
SADD key member
:向集合 key 添加一个元素。SREM key member
:从集合 key 中移除一个元素。SMEMBERS key
:返回集合 key 中的所有元素。④、操作有序集合的命令有:
ZADD key score member
:向有序集合 key 添加一个成员,或更新其分数。ZRANGE key start stop [WITHSCORES]
:按照索引区间返回有序集合 key 中的成员,可选 WITHSCORES 参数返回分数。ZREVRANGE key start stop [WITHSCORES]
:返回有序集合 key 中,指定区间内的成员,按分数递减。ZREM key member
:移除有序集合 key 中的一个或多个成员。⑤、操作哈希的命令有:
HSET key field value
:向键为 key 的哈希表中设置字段 field 的值为 value。HGET key field
:获取键为 key 的哈希表中字段 field 的值。HGETALL key
:获取键为 key 的哈希表中所有的字段和值。HDEL key field
:删除键为 key 的哈希表中的一个或多个字段。向指定 Set 中添加 1 个或多个 member,如果指定 Set 不存在,会自动创建一个。时间复杂度 O(N) ,N 为添加的 member 个数。
Redis 的 QPS(Queries Per Second,每秒查询率)受多种因素影响,包括硬件配置(如 CPU、内存、网络带宽)、数据模型、命令类型、网络延迟等。
根据官方的基准测试,一个普通服务器的 Redis 实例通常可以达到每秒数万到几十万的 QPS。
可以通过 redis-benchmark
命令进行基准测试:
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000
-h
:指定 Redis 服务器的地址,默认是 127.0.0.1。-p
:指定 Redis 服务器的端口,默认是 6379。-c
:并发连接数,即同时有多少个客户端在进行测试。-n
:请求总数,即测试过程中总共要执行多少个请求。我本机是一台 macOS,4 GHz 四核 Intel Core i7,32 GB 1867 MHz DDR3,测试结果如下:
可以看得出,每秒能处理超过 10 万次请求。
自己整理,借鉴很多博主 感谢他们
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。