保存成功
订阅成功
保存失败,请重试
提交成功

先模仿然后创造:Redis 源码分析之字符串

¥10会员免费看
暖和狐狸

先模仿,然后创造:这是人们在学习道路上一个必经的过程。人类之所以能够不断进步,这主要是因为生产力可以被继承和发展。老话说的好,“熟读唐诗三百首,不会作诗也会吟”。作为程序员也是一样,要想写好代码,得先阅读大量优秀的代码——通过学习优秀的代码,总结经典的设计模式,从而培养好的代码品味。

值得读的代码很多,要选择适合自己的。首先复杂度一定不要太高,复杂度太高了投入产出比就小了;其次要有针对性,选择感兴趣的技术和领域。

当然也有一些代码,不管你是做什么的,只要是程序员,我都会推荐你读一下,比如:Redis。Redis 是高并发领域使用最广泛的存储中间件,这个名字来自“REmote DIctionary Service”,中文直译为“远程字典服务”。Redis 的性能非常优秀,官方的基准测试可以达到 10K+ QPS;而且功能十分强大,可以用于数据库、缓存、消息队列、分布式锁、计数器、排行榜等场景。

  • 数据库:Redis 可以用来保存分布式 “Session” 。在传统单机 web 应用中,用户的 “Session” 都是由 tomcat 容器管理,也就是存储在单台服务器上的。并发上来之后,单机性能就不够用了,必须考虑集群和分布式了。此时,用户的请求可能被负载均衡器(load balancer)分发到不同的服务器,怎么共享 “Session” 就是必须要解决的问题了。Redis 可以用来保存用户 “Session”,从而实现单点登录(SingleSignOn,SSO)。
  • 缓存:Redis 可以用作缓存。我们一般使用数据库来持久化数据(保存到磁盘),用到的时候,就去磁盘查询数据库。一般情况下这都能工作的很好,但是如果数据被访问的很频繁,比如“双十一”时候的热点商品信息,这儿就会成为性能问题。我们都知道,磁盘 I/O 速度慢,远小于内存 I/O。这时候,可以使用 Redis 把热点数据缓存在内存。
  • 消息队列:Redis 的列表类型天生支持用作消息队列。任何时候都可以消费,一条消息只能消费一次。消息队列在实际应用中常见的有异步处理,应用解耦,流量削峰,和消息通讯四种场景。这里说一下流量削峰:春节马上到了,想回家的同学又要开始抢火车票了,大量的用户同一时间去抢购,暴增的流量很容易导致服务挂掉。要解决这个问题,就要用消息队列来缓冲瞬时流量,削弱流量高峰。
  • 分布式锁:Redis SETNX 命令可以用于实现分布式锁。SETNX 是「SET if Not eXists」的简写,若键不存在则设置键的值,若键 key 已经存在, 则不做任何动作。分布式系统中多个进程之间有可能互相干扰,比如访问和修改共享资源,在这种情况下,我们需要使用分布式锁来进行协调和同步。
  • 等等

Redis 不仅功能强大,而且设计优雅、实现简洁,在开源之初(2009-3-22)只有一万多行代码,到现在为止(2019-12-16)十年多的时间,代码已经增加到十几万的级别了,但是核心代码一直没有太大的变化:它使用六种底层数据结构构建了包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象的对象系统;它是单线程的;它使用多路复用I/O技术(epoll和kqueue等),自己封装了事件驱动机制;它把所有数据存在内存;它支持持久化,支持高可用等等。

在接下来的时间,我将以两周一篇的频率更新文章,带着大家一块研究一下Redis 的源码,选择的版本是最新的稳定版 5.0.7。从刚毕业的小白到架构师我用了将近五年的时间,在这五年里我阅读了大量代码,也写了大量的笔记,现在我把这些积累分享出来,希望大家在这条路上能够走的轻松一些。如果帮到你,我将不胜欣喜。

在本场 Chat 中,我会从源码实现的角度跟大家聊聊 Redis 六种基础数据结构中的一种——简单动态字符串(Simple Dynamic String,简称 SDS),代码见src/sds.hsrc/sds.c

119 人已订阅
会员免费看
¥10 原价订阅
关注提示×
扫码关注公众号,获得 Chat 最新进展通知!
入群与作者交流×
扫码后回复关键字 入群
Chat·作者交流群
入群码
该二维码永久有效
严选标准
知道了
Chat 状态详情
开始预订
预订结果公布19.12.24

预订达标,作者开始写作

审核未达标,本场 Chat 终止

作者文章审核结果公布01月15日

审核达标,文章发布

审核未达标,本场 Chat 终止

Chat 完结
×
已购列表