单线程Redis很快?带你看看原因
收藏
在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是数据库学习者,那么本文《单线程Redis很快?带你看看原因》就很适合你!本篇内容主要包括单线程Redis很快?带你看看原因,希望对大家的知识积累有所帮助,助力实战开发!
Redis 作为一种 KV 缓存服务器,有着极高的性能,相对于 Memcache,Redis 支持更多种数据类型,因此在业界应用广泛。
记得刚毕业那会参加面试,面试官会问我 Redis 为什么快,由于当时技术水平有限,我只能回答出如下两点:
-
数据是存储在内存中的。
-
Redis 是单线程的。
当然,将数据存储在内存中,读取的时候不需要进行磁盘的 IO,单线程也保证了系统没有线程的上下文切换。
但这两点只是 Redis 高性能原因的很小一部分,下面从数据存储层面上为大家分析 Redis 性能为何如此高。
Redis性能如此高的原因,我总结了如下几点:
-
纯内存操作
-
单线程
-
高效的数据结构
-
合理的数据编码
-
其他方面的优化
在 Redis 中,常用的 5 种数据结构和应用场景如下:
-
String:缓存、计数器、分布式锁等。
-
List:链表、队列、微博关注人时间轴列表等。
-
Hash:用户信息、Hash 表等。
-
Set:去重、赞、踩、共同好友等。
-
Zset:访问量排行榜、点击量排行榜等。
SDS
Redis 是用 C 语言开发完成的,但在 Redis 字符串中,并没有使用 C 语言中的字符串,而是用一种称为 SDS(Simple Dynamic String)的结构体来保存字符串。
struct sdshdr { int len; int free; char buf[];
SDS 的结构如上图:
-
len:用于记录 buf 中已使用空间的长度。
-
free:buf 中空闲空间的长度。
-
buf[]:存储实际内容。
例如:执行命令 set key value,key 和 value 都是一个 SDS 类型的结构存储在内存中。
SDS 与 C 字符串的区别
①常数时间内获得字符串长度