目录
Redis的多线程
Redis有序集合的集合操作
Redis的多线程
Redis6.0版本推出了多线程,需要注意的是Redis6.0的多线程是⽤多线程来处理数据的读写和协议解析,但是Redis执⾏命令还是单线程的。官方FAQ表示,因为Redis是基于内存的操作,CPU成为Redis的瓶颈的情况很少⻅,Redis的瓶颈最有可能是内存的⼤⼩或者⽹络限制。
Redis在内部是单线程的,这意味着它一次只能处理一个命令。然而,Redis通过以下方式来实现并发和高性能:
-
事件循环:Redis的核心工作原理是事件驱动的事件循环。它使用事件驱动的I/O模型,通过监听套接字上的事件(如新连接、数据到达等)来处理客户端请求。Redis使用了高效的I/O多路复用技术,通常使用epoll或kqueue来管理套接字事件,以非阻塞的方式处理多个客户端请求。
-
多个客户端连接:Redis可以同时处理多个客户端的连接请求,每个客户端都被视为一个独立的事件,Redis将事件放入事件队列中,然后依次处理这些事件。这允许Redis在同一时间处理多个客户端请求,从而实现并发处理。
-
Pipeline:Redis支持Pipeline技术,允许客户端将多个命令打包在一个请求中发送,然后一次性获取多个命令的响应。这可以减少客户端和服务器之间的通信次数,提高性能。
-
事务:Redis支持事务,客户端可以将多个命令封装到一个事务块中,然后一次性执行。事务中的命令将以原子方式执行,要么全部成功,要么全部失败。
-
数据结构的非阻塞操作:Redis中的数据结构操作通常是非阻塞的,允许多个客户端同时对相同的数据结构进行读取和写入操作。这减少了并发操作的冲突。
-
持久化:Redis可以将数据持久化到磁盘,以防止数据丢失。持久化操作通常在后台线程中执行,不会影响主线程的性能。
这样做的⽬的是因为Redis的性能瓶颈在于⽹络IO⽽⾮CPU,使⽤多线程能提升IO读写的效率,从⽽整体提⾼Redis 的性能。
Redis有序集合的集合操作
Redis有序集合(Sorted Set)是一种有序的数据结构,它可以包含多个成员,每个成员都关联一个分数(score),Redis根据分数的大小来对成员进行排序。有序集合支持多种集合操作,如并集、交集、差集等,可以对多个有序集合执行这些操作。以下是Redis中有序集合的常见集合操作:
-
并集操作(ZUNIONSTORE):将多个有序集合的并集保存到一个新的有序集合中。
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
-
destination
:目标有序集合的名称。 -
numkeys
:输入有序集合的数量。 -
key
:输入有序集合的名称。 -
WEIGHTS weight [weight ...]
:可选参数,用于指定每个输入有序集合的权重。 -
AGGREGATE SUM|MIN|MAX
:可选参数,用于指定计算并集时使用的聚合方式(求和、最小值、最大值)。
-
-
交集操作(ZINTERSTORE):将多个有序集合的交集保存到一个新的有序集合中。
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
-
destination
:目标有序集合的名称。 -
numkeys
:输入有序集合的数量。 -
key
:输入有序集合的名称。 -
WEIGHTS weight [weight ...]
:可选参数,用于指定每个输入有序集合的权重。 -
AGGREGATE SUM|MIN|MAX
:可选参数,用于指定计算交集时使用的聚合方式(求和、最小值、最大值)。
-
-
差集操作(ZDIFFSTORE):将两个有序集合的差集保存到一个新的有序集合中。
ZDIFFSTORE destination numkeys key [key ...]
-
destination
:目标有序集合的名称。 -
numkeys
:输入有序集合的数量(通常为2)。 -
key
:输入有序集合的名称。
-
这些集合操作允许你对多个有序集合进行组合和计算,从而创建新的有序集合。这些操作通常用于处理排行榜、交集、差集等情况。有序集合的成员和分数的排列顺序可以通过权重和聚合方式进行调整,使其非常灵活。