undefined

一、LRU 原理与实现

LRU(Least Recent Used),最近被频繁访问的数据会具备更高的留存,淘汰那些不常被访问的数据

设计一个LRU缓存,使得放入和移除都是 O(1) 的,我们需要把访问次序维护起来,但是不能通过内存中的真实排序来反应,有一种方案就是使用双向链表。

基于 HashMap 和双向链表实现 LRU

整体的设计思路是,可以使用 HashMap 存储 key,这样可以做到 save 和 get key的时间都是 O(1),而 HashMap 的 Value 指向双向链表实现的 LRU 的 Node 节点

查看更多

undefined

MVC 设计模式和三层架构

一、两者之间的异同

不同点:

  • 三层架构就是把应用程序分层,从而降低各个模块之间的耦合。而 MVC 是程序的一种设计模式,即应用程序确立架构后再根据需求决定是否要采用的一种模式,是一种使程序代码变的条理清晰、逻辑通用的代码规范。也就是说,三层架构是一种架构方式而 MVC 是一种设计模式或设计思想
  • 三层架构的分层模式是典型的上下关系,上层依赖于下层。但 MVC 作为设计模式不存在上下关系,而是相互协作关系。

查看更多

undefined

负载均衡组件

一、什么是负载均衡

负载均衡建立在现有的网络结构之上,它提供了一种廉价、有效、透明的方法,扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个运算量较大的操作分担到多台设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力可以得到大幅提高

二、负载均衡分类

  • 二层负载均衡(mac),一般采用虚拟 mac 地址方式,外部对虚拟 mac 地址请求,负载均衡接收后分配后端实际的 mac 地址响应
  • 三层负载均衡(ip),一般采用虚拟 IP 地址方式,外部对虚拟 IP 地址请求,负载均衡收到后分配后端实际的 IP 地址响应
查看更多

undefined

多阶哈希

一、原理

哈希表是一种非常高效的数据结构,它是通过散列函数将key映射成数组下标以达到O(1)算法复杂度的高效数据结构。但是对于不同的key哈希函数算出的结果可能出现冲突,也就是出现了哈希碰撞,解决碰撞的方式通常有:开放地址法、再哈希法、链地址法。今天要介绍的是一种称为多阶哈希的Rehash方法。
多阶Hash的实现原理并不复杂,每个Hash桶算作一阶,如果有4阶的多阶Hash,那么就是一个二维数组,第一维是Hash桶的阶数编号,第二维是对应阶编号下Hash桶的每个槽的位置。如下图所示:

每阶槽的个数都是质数个,每阶槽的个数依次递减。由于互质的特性,通常情况下会上面的阶数先被填满,然后再逐步填下面的阶数。在实际使用中,内存使用率可以达到90%以上。查找和插入的复杂度都是O(h)其中h是阶数。

查看更多

undefined

排行榜设计

方案设计不能脱离业务场景,业务量比较小的情况直接使用 MySQL 的 order by 即可

一、基于 redis 的 zset

跳表 + 字典 的实现

redis 的有序集合(zset),如下,value 是一个集合,这个集合是有序的,集合中的每一个 member 都有 score,然后按照 score 进行降序排序。对于相同的 score ,就按照 member 的字典序排序。

查看更多

undefined

一、海量数据处理题目

1. 海量日志数据,提取出某日访问百度次数最多的那个IP

首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。

算法思想:分而治之 + Hash

  1. IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;
  2. 可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
查看更多