Redis 之父 Salvatore Sanfilippo 决定不再担任 Redis 项目的软件维护者,Redis 项目放弃之前的专制管理模式,转而采用新的“社区自治模式”。
前段时间,Sanfilippo在自己的博客上发布了一篇公告,表示将不再担当 Redis 开源项目的软件维护者,并“将 Redis 交给 Redis 社区”。这意味着 Redis 项目的未来命运将由整个社区决定,而不再单纯掌握在 Sanfilippo 一个人手中。
今天就和大家聊聊,近些年来,被大家广泛应用且经久不衰的redis是有什么优点让它如此迷人?
1. “底子好”——C语言编写,操作完全基于内存
redis完全基于内存,绝大部分请求是纯粹的内存操作,如此一来让redis的读写速度基本秒杀所有数据库。
而C作为性能最好的高级编程语言,自然成为了redis的首选。
正是高性能编程语言+高速数据存储方式,为redis成为“性能之王”奠定了坚实的基础。
2. "专注"——单线程
同其他高性能程序设计不同,redis为了避免加锁、释放锁产生的性能消耗,并没有采用多线程。这使得CPU不在成为限制redis性能的因素,所以在处理海量数据时也不用担心redis的性能问题。
redis采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。
3. "量身打造的数据结构"——一套为redis打造的数据结构
为了追求读写速度,Sanfilippo为redis单独设计了一套数据结构供其读写数据。全方位压榨每一点可以优化的空间,只为redis能更快一点!详细的数据结构内容我们下文会展开分析。
redis支持字符串(string)、散列(hash)、列表(list)、集合(set)和有序集合(sorted set)这五种类型的存储。考虑到C语言数据结构的局限性,redis自己设置了一套完整的数据结构供其读写数据,这使得redis基本能存储所有数据。
Redis 没有直接使用 C 语言传统的字符串表示, 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。
SDS相比C 字符串有如下优点:
相比C字符串来说,SDS最大的优点就是能存储二进制数据,这使得redis基本能存储所有数据。
作为一个内存数据库,最担心的,就是万一机器死机,数据会消失掉。redi使用rdb和aof做数据的持久化存储。主从数据同时,生成rdb文件,并利用缓冲区添加新的数据更新操作做对应的同步。
发布/订阅极大的扩展了redis的应用场景,被广泛应用于实时消息系统、邮件订阅、队列推送等场景。
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
著名的Laravel框架队列系统实现也是基于redis发布/订阅模式。
以上这些优点让redis在缓存、排行榜、商品秒杀、分布式会话、消息系统等场景得到了极好的运用,更是被行业内大小公司所热爱。有小伙伴想更深入了解redis数据结构以及其如何实现,小编推荐以下两个链接供大家学习。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。