redis相关
缓存 API 使用约定

- 应用从缓存取值,如果取到,返回
- 如果没取到,应用从数据库 load 数据
- 把 load 到的数据放到缓存中
相应的,缓存 api 的接口遵循这一模式:
1. 如果缓存中有值,返回值
2. 如果缓存中没有值,返回 null,应用需要从数据库 load
3. 如果发生异常,抛出相应的异常,包括超时异常,连接异常等
热点 key
所谓热点 key,就是这个 key 的访问 qps 极高,如果这个 key 一旦过期或者被清除,可能导致很多客户端同时取到 null,而同时去从数据库 load 数据,瞬间的高流量可能导致数据库顶不住压力而崩溃。针对热点 key,memcahed 对于热点 key 的处理如下:
- 热点 key 的写入
- 保存热点 key,value 到 memcached
- 保存热点 key 的备份 key,value 到 memcached,备份 key 的名字为 key + "_h",value 不变,过期时间为热点 key 的过期时间 + 缓冲时间,缓冲时间一般是10s,设置为10s的原因是一般情况下10s足够从数据库 load 数据了
- 热点 key 的读取
- 读取热点 key 对应的值,如果读到,直接返回。如果发生异常,抛出异常
- 如果读取到的值为 null,那么分情况,一种是热点 key 被清除了,一种是热点 key 过期了:
- 热点 key 被清除了:尝试对热点 key 加锁,如果加锁成功,返回 null,由客户端去数据库 load 数据并放入缓存中;如果加锁失败,尝试去取热点 key 上一个版本的数据,上一个版本的 key 由当前热点 key 的version-1得到,并返回取到的数据
- 热点 key 过期了:尝试对热点 key 加锁,如果加锁成功,返回 null,由客户端去数据库 load 数据并放入缓存中;如果加锁失败,尝试去取热点 key 的备份 key 的数据,并返回取到的数据
- 对热点 key 加锁的过程是这样的:加锁也是在 memcached 上新增一个 key,key 的名字是热点 key 的名字加上 "_lock",因为 memcached 的 add 操作是原子的,而且仅当不存在这个 key 时才能添加成功,所以可以利用这一特性做一个互斥锁,这个加锁的 key 的超时时间设置为30s,避免长期占用锁。
- 热点 key 的删除
- 清除热点 key
- 清除热点 key 的备份 key

浙公网安备 33010602011771号