那些有趣的数据结构与算法(05)--限流
有时候限流也可以称为防刷,这两者的界定并不是很明显,常用的限流算法包括固定窗口,滑动窗口,漏桶以及令牌桶算法,它们都有各自的优势与最适合的使用场景,算法不分好坏,只分场景。 »
有时候限流也可以称为防刷,这两者的界定并不是很明显,常用的限流算法包括固定窗口,滑动窗口,漏桶以及令牌桶算法,它们都有各自的优势与最适合的使用场景,算法不分好坏,只分场景。 »
树型结构由于其良好的递归特性, 高效的查询效率, 在软件系统设计中有着非常广泛的使用。 IO多路复用的epoll实现采用红黑树组织和管理sockfd, 以支持快速的增删改查; Golang中的Timer采用多叉堆实现; Java中的TreeMap以及TreeSet同样采用红黑树实现…而在MySQL中, 索引的构建同样采用树结构实现。 »
由于Docker容器以及Kubernetes容器编排服务的蓬勃发展, 服务器以及业务服务的运维不再是运维工程师的专属, 业务的开发工程师也必须加入到运维的领域之中, 与运维工程师合作, 形成一套完整、高效的自动化运维与部署的系统。 而在我看来, 传统的运维工程师将会逐渐被应用开发工程师所取代, 因为Kubernetes赋予了开发人员强大的负载均衡、自动横向拓展以及高效管理的相关功能。 而在这些宏大的系统建设之前, Shell编程是无论如何都离不开的话题。 »
Shell脚本能够为我们提供一部分的系统运维功能, 例如定时任务, 由Jenkins所管理的边缘触发任务等等, 但是如果想要对多台服务器进行管理和运维, 就需要Ansible来协助完成。 »
在写了许多代码, 搭建了一些分布式服务之后, 越发觉得一个大型的高并发系统就是一个操作系统。 在分布式系统中, 我们会讲数据一致性, 如何做到缓存和DB的一致性, 这也是操作系统需要解决的问题: 内核高速页缓存如何与磁盘文件数据一致。 又比如对于一些耗时且非必需的任务, 在分布式系统中很有可能采用消息队列来进行异步处理, 例如邮件的发送, 而在操作系统中, I/O也是一个非常耗时的任务, 同样采用了异步处理的方式来最大化的利用系统资源, 只不过并不是采用消息队列而已。 »
在单机缓存中, 并发的安全性问题与语言的并发安全问题完全可以归为一类, 缓存的穿透问题可以采用巧妙的数据结构进行处理, 很多问题本质上仍然是一些基础问题。 »
Flask作为Python语言中最为轻量的Web框架, 由于其核心内容的简洁以及良好的可拓展性, 一直受到广泛的开发者所喜爱。 对比于Django, Flask并没有”我给你的就是最好的, 别管那么多, 拿着用就好”的思想, 而是让开发者自己做出选择, 自己设计开发一个组件, 或者挑选一个你喜欢的第三方库。 »
在《算法》(第四版)的第一章最后一小节中, 也就是”案例研究: union-find算法”这一小节, 我看到了并查集。 在我完整的阅读了所有的算法内容之后, 脑子里只剩下两个字: 优美。 »
在我刚接触Python这门开发语言时, 并没有想用它做Web后端开发, 而是拿来写爬虫。 第一个接触的爬虫框架就是Scrapy。 网络爬虫绕不开的一个话题就是URL去重问题。 在Scrapy原生框架下, 使用的是集合来对URL进行去重的。 集合本身采用哈希表实现, 是一种典型的以空间换时间的数据结构, 当URL数量极为庞大时, 使用这种策略的去重很有可能导致内存溢出而造成服务器宕机的问题。 此时, Bitmap走进了我的视线。 »
Redis内置了5种对外开放的数据结构, 分别是字符串, 列表, 集合, 有序集合以及哈希对象。 每一种数据结构的底层实现都会由存入的数据产生动态变化, 这也是Redis具有极佳吞吐量的原因之一。 本篇文章主要描述其基本数据结构的实现以及这些结构在使用时的注意事项。 »