01-Redis核心数据结构与高性能原理

一、Redis的单线程和高性能

1. Redis是单线程吗?

Redis的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的(说白了也就是执行命令的时候是由一个线程来完成的),这也是 Redis 对外提供键值存储服务的主要流程。
但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的-即多线程执行

2. Redis单线程为啥还这么快?

因为它所有的数据都在内存当中,所有的运算也都是内存级别的运算,并且单线程也避免了多线程之间切换导致的性能损耗,同时正因为redis是单线程 所以要小心使用redis的指令,对于那些耗时的指令,一定要谨慎使用,避免导致redis的卡顿
同时redis采用io多路复用模型,redis是用epoll来实现io多路复用,**将连接信息和事件放到队列当中,由文件事件分派器监听并分发给事件处理器,**说白了就是监听压队列,然后由文件事件分派器来去处理,并将事件分发到事件处理器,而事件处理器包括连接应答处理器,命令请求处理器,命令回复处理器;

01-Redis核心数据结构与高性能原理_第1张图片

二、Redis的核心数据结构

1. Redis 五种数据类型的应用场景:

String 类型的应用场景:缓存对象、常规计数、分布式锁、共享 session 信息等。

List 类型的应用场景:消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等。
比如说可以实现栈–lpush+lpop===》FIFO
实现队列=====》Lpush+Rpop
实现阻塞队列====》Lpush+Bpop
那它相比于普通的栈,队列有啥优点?就是在分布式环境下,我们是不能java实现的堆栈功能,就可以使用redis
01-Redis核心数据结构与高性能原理_第2张图片

Hash 类型:缓存对象、购物车等。

Set 类型:聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动等。
可以用于抽奖,但是注意SRANDMEMBER 不会删除元素,而SPOP会删除元素-所以说SRANDMEMBER适合那种中奖多次的情况,而SPOP适合那种不能再中奖的情况;
01-Redis核心数据结构与高性能原理_第3张图片
同时还可用于微博点赞,收藏 标签等
01-Redis核心数据结构与高性能原理_第4张图片
同时非常重要的是redis集合操作实现微博微信关注模型-即共同关注,可能认识的好友等

Zset 类型:排序场景,比如排行榜、电话和姓名排序等。

2. zset结构用于排行榜的原理

zset结构即sorted set有序集合它有个权重值,也就是说可以根据元素的权重来排序,比如说,我们可以根据元素插入 Sorted Set 的时间确定权重值,先插入的元素权重小,后插入的元素权重大。
在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,可以优先考虑使用 Sorted Set。
它典型的使用场景就是排行榜。例如学生成绩的排名榜、游戏积分排行榜、视频播放排名、电商系统中商品的销量排名等。

3. zset结构底层数据结构

Zset 类型的底层数据结构是由压缩列表或跳表实现的:
即如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 类型的底层数据结构;
如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为 Zset 类型的底层数据结构;
当然在redis7.0中,压缩列表数据结构已经废弃了,是由listpack数据结构来实现

4. 跳表的时间复杂度是多少?

01-Redis核心数据结构与高性能原理_第5张图片
搜索操作的时间复杂度:O(log n),其中n是跳表中元素的数量。这是因为跳表中使用多级索引,可以通过跳跃的方式快速定位到目标元素所在的位置,从而将搜索的时间复杂度降低到对数级别。

插入和删除操作的时间复杂度:O(log n),其中n是跳表中元素的数量。与搜索操作类似,插入和删除操作也可以通过跳跃的方式快速定位到需要插入或删除的位置,并进行相应的操作。因此,插入和删除的时间复杂度也是对数级别的。

你可能感兴趣的:(#,分布式缓存,redis,数据结构,数据库)