redis相关

缓存 API 使用约定

缓存 API 使用约定

  1. 应用从缓存取值,如果取到,返回
  2. 如果没取到,应用从数据库 load 数据
  3. 把 load 到的数据放到缓存中

相应的,缓存 api 的接口遵循这一模式:
1. 如果缓存中有值,返回值
2. 如果缓存中没有值,返回 null,应用需要从数据库 load
3. 如果发生异常,抛出相应的异常,包括超时异常,连接异常等

热点 key

 

所谓热点 key,就是这个 key 的访问 qps 极高,如果这个 key 一旦过期或者被清除,可能导致很多客户端同时取到 null,而同时去从数据库 load 数据,瞬间的高流量可能导致数据库顶不住压力而崩溃。针对热点 key,memcahed 对于热点 key 的处理如下:

  • 热点 key 的写入
    1. 保存热点 key,value 到 memcached
    2. 保存热点 key 的备份 key,value 到 memcached,备份 key 的名字为 key + "_h",value 不变,过期时间为热点 key 的过期时间 + 缓冲时间,缓冲时间一般是10s,设置为10s的原因是一般情况下10s足够从数据库 load 数据了
  • 热点 key 的读取
    1. 读取热点 key 对应的值,如果读到,直接返回。如果发生异常,抛出异常
    2. 如果读取到的值为 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 的删除
    1. 清除热点 key
    2. 清除热点 key 的备份 key
posted @ 2016-07-26 16:02  程序猿进化之路  阅读(168)  评论(0)    收藏  举报