数据结构(6): 单调栈
特性
单调栈是一种特殊的栈数据结构,它满足元素的单调性(单调递增或单调递减)。与普通栈相比,单调栈在出栈时有一定的规则,使得出栈后栈中的元素仍然保持单调性。
单调栈是一种特殊的栈数据结构,它满足元素的单调性(单调递增或单调递减)。与普通栈相比,单调栈在出栈时有一定的规则,使得出栈后栈中的元素仍然保持单调性。
一个应用程序时运行在操作系统上的一个进程。进程是一个运行在自己独立内存空间的独立执行体,是操作系统进行资源分配的最小单位。一个进程则有一个或多个线程组成,这些线程是共享进程内存地址空间的执行体,是操作系统进行任务调度的最小单位。而使用多线程进行工作时,由于共享父进程的内存空间等资源,访问同一个数据需要对其进行加锁,保证同一时间只有一个线程操作一个数据。这样不仅会提高编码的复杂度,还会有多个线程抢占锁、线程切换带来的额外开销。
Thrift自顶向下可分为四层
Server(single-threaded, event-driven)服务器进程调度
Processor(compiler generated)RPC接口处理函数分发,IDL定义接口的实现将挂接到这里面
在网络中要唯一确定一个进程需要用一个三元组(Protocol,IP,Port),IP地址唯一确定一台主机,再通过协议和端口唯一确定一个进程,这里也可以看到TCP和UDP可以绑定同一个端口。能唯一确定网络中的进程了,便可以利用这个标志在他们之间进行数据交互。
在分布式系统中,通常使用多个节点来保存数据,以提高并发能力和容量,那么如果决定数据保存到哪个节点上呢?一般的做法是通过一个哈希函数对数据key进行计算,然后对节点数量取模,从而得到数据分配的节点:
node_id = hash(key) % N
但是这种做法在节点数量N变化的时候,大部分key的计算的节点都会重新分配。如果是应用在分布式缓存,就会导致大规模的缓存失效,引起缓存雪崩。
业务使用Redis做缓存,当有数据更新时,如何保证缓存及时更新
请求到来,业务代码会先查Redis,查不到再去查DB,并将结果写入Redis
先删除缓存,再更新DB,下次读请求到来会从数据库查到新的数据更新到缓存中。如果先更新缓存,在更新DB,更新DB失败会导致数据不一致。