auto commit

This commit is contained in:
CyC2018
2018-08-13 14:40:05 +08:00
parent c0e1d591bd
commit 01a916cce7
2 changed files with 20 additions and 16 deletions

View File

@ -35,10 +35,10 @@
# 二、LRU
以下是一个基于 双向队列 + HashMap 的 LRU 算法实现,对算法的解释如下:
以下是一个基于 双向链表 + HashMap 的 LRU 算法实现,对算法的解释如下:
- 最基本的思路是当访问某个节点时,将其从原来的位置删除,并重新插入到链表头部,这样就能保证链表尾部存储的就是最近最久未使用的节点,当节点数量大于缓存最大空间时就删除链表尾部的节点。
- 为了使删除操作时间复杂度为 O(1)那么就不能采用遍历的方式找到某个节点。HashMap 存储 Key 到节点的映射,通过 Key 就能以 O(1) 的时间得到节点,然后再以 O(1) 的时间将其从双向队列中删除。
- 为了使删除操作时间复杂度为 O(1)那么就不能采用遍历的方式找到某个节点。HashMap 存储 Key 到节点的映射,通过 Key 就能以 O(1) 的时间得到节点,然后再以 O(1) 的时间将其从双向队列中删除。
```java
public class LRU<K, V> implements Iterable<K> {
@ -143,6 +143,10 @@ public class LRU<K, V> implements Iterable<K> {
}
```
源代码:
- [CyC2018/Algorithm](https://github.com/CyC2018/Algorithm/tree/master/Caching)
# 三、缓存位置
## 浏览器
@ -165,9 +169,7 @@ public class LRU<K, V> implements Iterable<K> {
使用 Redis、Memcache 等分布式缓存将数据缓存在分布式缓存系统中。
相对于本地缓存来说,分布式缓存单独部署,可以根据需求分配硬件资源。
不仅如此,服务器集群都可以访问分布式缓存。而本地缓存需要在服务器集群之间进行同步,实现和性能开销上都非常大。
相对于本地缓存来说,分布式缓存单独部署,可以根据需求分配硬件资源。不仅如此,服务器集群都可以访问分布式缓存。而本地缓存需要在服务器集群之间进行同步,实现和性能开销上都非常大。
## 数据库缓存
@ -263,7 +265,7 @@ Distributed Hash TableDHT 是一种哈希分布方式,其目的是为了
上面描述的一致性哈希存在数据分布不均匀的问题,节点存储的数据量有可能会存在很大的不同。
数据不均匀主要是因为节点在哈希环上分布的不均匀,这种情况在节点数量很少的情况下尤其明显。解决方式是通过增加虚拟节点,然后将虚拟节点映射到真实节点上。虚拟节点的数量比真实节点来得大,那么虚拟节点在哈希环上分布的均匀性就会比原来的真节点好,从而使得数据分布也更加均匀。
数据不均匀主要是因为节点在哈希环上分布的不均匀,这种情况在节点数量很少的情况下尤其明显。解决方式是通过增加虚拟节点,然后将虚拟节点映射到真实节点上。虚拟节点的数量比真实节点来得大,那么虚拟节点在哈希环上分布的均匀性就会比原来的真节点好,从而使得数据分布也更加均匀。
参考资料: