docs: add hystrix-thread-pool-isolation.md

Hystrix 线程池技术实现资源隔离
Redis 小修改
This commit is contained in:
yanglbme
2018-12-26 20:40:31 +08:00
parent 429a6b63cb
commit b2f9168a57
6 changed files with 121 additions and 4 deletions

View File

@@ -22,7 +22,7 @@
另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于**比较复杂的缓存数据计算的场景**,就不是这样了。如果你频繁修改一个缓存涉及的多个表,缓存也频繁更新。但是问题在于,**这个缓存到底会不会被频繁访问到?**
举个栗子,一个缓存涉及的表的字段,在 1 分钟内就修改了 20 次,或者是 100 次,那么缓存更新 20 次100 次;但是这个缓存在 1 分钟内只被读取了 1 次,有**大量的冷数据**。实际上,如果你只是删除缓存的话,那么在 1 分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低。**用到缓存才去算缓存。**
举个栗子,一个缓存涉及的表的字段,在 1 分钟内就修改了 20 次,或者是 100 次,那么缓存更新 20 次100 次;但是这个缓存在 1 分钟内只被读取了 1 次,有**大量的冷数据**。实际上,如果你只是删除缓存的话,那么在 1 分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低。**用到缓存才去算缓存。**
其实删除缓存,而不是更新缓存,就是一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。像 mybatishibernate都有懒加载思想。查询一个部门部门带了一个员工的 list没有必要说每次查询部门都里面的 1000 个员工的数据也同时查出来啊。80% 的情况,查这个部门,就只是要访问这个部门的信息就可以了。先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询 1000 个员工。

View File

@@ -27,7 +27,7 @@ redis 过期策略是:**定期删除+惰性删除**。
但是问题是,定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢?所以就是惰性删除了。这就是说,在你获取某个 key 的时候redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。
> 获取key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。
> 获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。
但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key然后你也没及时去查也就没走惰性删除此时会怎么样如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整?
@@ -36,9 +36,9 @@ redis 过期策略是:**定期删除+惰性删除**。
### 内存淘汰机制
redis 内存淘汰机制有以下几个:
- noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
- **allkeys-lru**:当内存不足以容纳新写入数据时,在**键空间**中,移除最近最少使用的 key这个是**最常用**的)
- **allkeys-lru**:当内存不足以容纳新写入数据时,在**键空间**中,移除最近最少使用的 key这个是**最常用**的)
- allkeys-random当内存不足以容纳新写入数据时在**键空间**中,随机移除某个 key这个一般没人用吧为啥要随机肯定是把最近最少使用的 key 给干掉啊。
- volatile-lru当内存不足以容纳新写入数据时在**设置了过期时间的键空间**中,移除最近最少使用的 key这个一般不太合适
- volatile-lru当内存不足以容纳新写入数据时在**设置了过期时间的键空间**中,移除最近最少使用的 key这个一般不太合适
- volatile-random当内存不足以容纳新写入数据时在**设置了过期时间的键空间**中,**随机移除**某个 key。
- volatile-ttl当内存不足以容纳新写入数据时在**设置了过期时间的键空间**中,有**更早过期时间**的 key 优先移除。