保存成功
订阅成功
保存失败,请重试
提交成功
暖和狐狸

暖和狐狸

架构师
现某上市公司系统架构师/产品经理,有丰富的系统设计、开发和调优的经验,致力于DPDK、CICD、高性能服务端开发等领域。喜欢研究优秀的开源代码,喜欢构建和优化较大规模的互联网应用系统。深入研究过包括DPDK、VPP、F-Stack、k8s、Docker、Harbor、Etcd、Redis、Nginx、Wrk、Hurricane等等。...更多
创作文章5

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

先模仿,然后创造:这是人们在学习道路上一个必经的过程。人类之所以能够不断进步,这主要是因为生产力可以被继承和发展。老话说的好,“熟读唐诗三百首,不会作诗也会吟”。作为程序员也是一样,要想写好代码,得先阅读大量优秀的代码——通过学习优秀的代码,总结经典的设计模式,从而培养好的代码品味。 值得读的代码很多,要选择适合自己的。首先复杂度一定不要太高,复杂度太高了投入产出比就小了;其次要有针对性,选择感兴趣的技术和领域。 当然也有一些代码,不管你是做什么的,只要是程序员,我都会推荐你读一下,比如:Redis。Redis 是高并发领域使用最广泛的存储中间件,这个名字来自“REmote DIctionary Service”,中文直译为“远程字典服务”。Redis 的性能非常优秀,官方的[基准测试](https://redis.io/topics/benchmarks)可以达到 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.h` 和 `src/sds.c`。
Redis
119 订阅

从 Nginx 性能调优说起,聊聊高性能服务器设计的关键原则

根据 Netcraft 公布的最新的(2019年10月)[Web 服务器调查报告](https://news.netcraft.com/archives/category/web-server-survey/),Nginx 的市场份额达到了 32.69%,毫无争议地成为了最流行的 Web 服务器。这主要得益于 Nginx 在性能、稳定性和可扩展等方面优异的表现。 Nginx 以高性能著称,为什么 Nginx 的性能这么高呢?要回答这个问题,得先从 Nginx 的进程模型说起。Nginx 是多进程的,简单来说,Nginx 包含两种进程:Master 和 Worker 。Master 进程是管理进程,负责控制和监控 Worker 进程:接收命令,切割日志文件,停止、重新启动 Worker 进程;监控 Worker 进程,如果发现 Worker 进程异常退出,就重新启动(respawn)一个新的 Worker 进程。Worker 进程是工作进程,负责处理客户端请求。Worker 进程可以有多个,Worker 进程之间是独立且对等的,分别竞争(epoll_wait)处理请求(这种竞争有可能发生惊群效应)。Nginx 使用了 I/O 多路复用技术,也就是说,一个 Worker 也可以同时处理成千上万个请求。 [官方测试](https://www.nginx.com/blog/testing-the-performance-of-nginx-and-nginx-plus-web-servers/),Nginx 单机使用 8 个核可以支撑起百万并发。于是你兴致勃勃地安装了 Nginx,测试一看 Nginx 的 RPS 最高到十几万,再增加核心就没啥作用了,增加的多了反而下降了。 说好的百万并发呢?当然首先要说明的是: 十几万 RPS 已经很高了,要是我的产品能达到十几万 RPS,做梦都能笑醒了。但是追求极致性能是每一个有梦想的开发者的自我修养!万一有一天用到了呢! 那么,Nginx 单机性能如何才能突破十几万呢?答案是,需要调优,从多个角度对 Nginx 进行调优,比如缓存、CPU 亲和性、事件处理模型、IO 操作等等。如果你对高性能服务器开发感兴趣,你会发现这些调优的方法正好是高性能服务器开发的关键原则! 本场 Chat 会从 Nginx 调优说起,跟你聊聊高性能服务器开发的关键原则。 在本场 Chat 中,会讲到如下内容: - Nginx 安装和配置 - Nginx 调优:缓存、CPU 亲和性、事件处理模型、IO 操作等 - Linux 内核参数调优 - 高性能服务器开发的关键原则
性能优化
273 订阅

VSCode 使用教程:使用好的工具提高你的工作效率

孔子说:工欲善其事,必先利其器;器欲尽其用,必先得其法。前半句是孔圣人说的,后半句是后人续的。意思是要想把事情做好,必须要先打磨好工具;要想把工具用好,必须要先弄明白它的使用方法。 VSCode 是微软在 Build 2015 推出的一款免费、开源的代码编辑器,推出不久就迎来了爆炸式增长,已然成为今日最热门的技术之一。VSCode 支持多平台,使用者能够以原生的方式在 Windows、Mac、Linux 等平台,直接编辑和调试程序代码。 VSCode 支持扩展,有一个扩展和主题市场,包含了数以百万的各种功能的插件。你可以很方便的安装扩展,来扩展你的 VSCode ,比如: - 如果你想编写、调试 C/C++ 代码,你可以安装 [C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) 扩展; - 如果你想编写、调试 Python 代码,你可以安装 [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python) 扩展; - 如果你想编写 SQL、管理数据库,你可以安装 [SQL Server](https://marketplace.visualstudio.com/items?itemName=ms-mssql.mssql) 扩展。 对于程序员而言,代码编辑器的重要性怎么强调都不为过。一款优秀的、称手的编辑器能够大大地提高程序员的工作效率。VSCode 快速,高效,可定制,可扩展,功能强大,是程序员近乎梦幻的工具。如果你还没有使用过,你应该试试。它能大大提高你的工作效率,重构你的生产力。 在本场 Chat 中,会讲到如下内容: - 安装 VSCode,并配置开发 C/C++、Python、Golang 需要的工具集 - 编辑器的基本界面、命令和特性 - 快捷键 - 个性设置 - 插件市场和插件的安装卸载 - 多行编辑 - 调试(以 Redis 为例) - 远程开发和调试(以 Redis 为例)
VS Code
483 订阅

Redis 的事件驱动框架

Redis 是一个开源的(BSD 许可),基于 key-value 的内存存储系统,可用作数据库、缓存和消息队列等。 Redis 以高性能著称,在性能上甚至优于功能相对更简单的Memcached,有兴趣可以看看Redis 作者 Salvatore Sanfilippo 的 Memcached/Redis 的[对比测试](http://oldblog.antirez.com/post/update-on-memcached-redis-benchmark.html),或者 Redis 官方的[基准测试](https://redis.io/topics/benchmarks)。 你一定会很吃惊,如果我告诉你:Redis 是单线程的。为什么 Redis 是单线程的,却能有很好的性能呢,简单来说就是: Redis 利用了 I/O 多路复用技术,它的基本原理就是由内核(*比如使用 epoll 时,就是 epoll_wait 函数调用*)轮询所负责的所有 I/O 文件描述符,当某些文件描述符有数据到达了,就通知用户进程(*调用返回*)。这种技术可以让我们在一个线程并行处理多个连接。 Redis 没有直接使用操作系统的 I/O 多路复用接口,而是自己实现了一个简单的事件驱动库,称为 Libae,支持 Freebsd、Linux 等多个操作系统,只有不到1000行代码。其设计简洁,功能强大,在其他项目中也被广泛使用,比如 HTTP 基准测试工具 [wrk](https://github.com/wg/wrk),Redis 官方的客户端库 [hiredis](https://github.com/redis/hiredis)。 在项目中使用这个库可以轻松获得高并发和高性能。 在本场 Chat 中,会讲到如下内容: - I/O 多路复用技术 - Redis 事件驱动库的架构设计 - Redis 事件驱动库的代码解析 - 如何实现高并发服务器 - 如何使用 Redis 事件驱动库构建高并发服务
Redis
135 订阅

如何为 VSCode 开发一个扩展插件

Visual Studio Code(VSCode)一发布就获得了爆炸式的增长,被称为宇宙最好用的 IED。VSCode 支持插件扩展,从界面显示到编辑体验,几乎每个部分都可以通过扩展 API 进行定制和增强。作为一个开源项目,VSCode 吸引了无数第三方开发者。 我是 VSCode 用户,同时也为它开发插件。**本文将从零开始介绍如何开发一个 VSCode 扩展插件——keepalived.conf hint, 语法高亮、智能提示和自动补齐**。 在本场 Chat 中,会讲到如下内容: - 搭建 VSCode 插件开发环境 - VSCode 插件的 HelloWorld - 如何为 VSCode 插件编写 package.json - 如何为 VSCode 插件自定义命令、快捷键、菜单 - 如何为 VSCode 插件实现自动补全、悬浮提示 - 如何调试 VSCode 插件 - 通过脚本从 keepalived manpage 网页生成提示数据库 - VSCode 插件的打包、发布、升级 **适合人群**: 对 VSCode 插件开发有兴趣的技术人员
118 订阅