Redis缓存优化的一些思考

现代网站设计,支撑高性能高并发高可用的架构中,引入缓存都是必不可少的优化方式。动态网站经常使用redis、memcache等缓存数据,作为对数据库的优化方案,降低数据库的负载,提升能够处理的并发数量。

那么关于redis方面有没有可以优化的地方?是否可以进一步提升网站性能呢?自己以前没也有系统性的归纳总结过。这里提供了一种思考方式,Redis本质上是一种基于内存的数据库,既然是数据库,相关优化方案就可以参考Mysql数据库的优化逻辑进行类比推导。让我们先想想耳熟能详的Mysql数据库的优化方案:

  1. 建立数据库集群,配置一主多从,多主多从,将负载分摊的不同机器集群中。
  2. 分库分表,采用业务分库,数剧量大时采用垂直和水平分表。
  3. 批量查询批量插入,减少网络IO时间
  4. 慢查询语句检测,检测慢查询,设计优化方案,建立索引等

参考Mysql的优化进行Redis的相关优化:

  1. 集群方面,也是每个人都可以直接想到的,可以建立redis集群,利用集群分担负载。
  2. 分库分表方面,分库就是讲不同的业务数据分发到不同的redis集群,从业务角度分担负载;分表方面来看,对于普通key-value结构来说并不适用,对于大数据集合或者hash列表来说是可以进行优化的,比如尾数为1的读取第一个集合,尾数为2的读取第二个集合。防止每个集合成员太多导致的检索耗时。
  3. 批量插入查询这个应该也是可以适用的,用以减少网络时间消耗。
  4. 慢查询语句检测,Redis也有相关的慢查询日志,但是实际中个人是没有用过。

由此我们就得出很多优化方案了。但是实际业务中个人还发现有个问题无法用上面的方案优化,比如有部分如秒杀商品列表,数据集合比较小,但是这个数据key在某个时间段访问又特别多,就导致部分机器负载飙升,性能下降。碰到这种问题该怎么优化呢?

经过思考呢也想出一种方式,因为我们通常是将数据按尾数hash求余分散存放到不同机器上的方式分担负载,那现在是不是可以将同一份数据分散到更多的机器上去分担负载呢?

具体操作就是将数据的key设置为多个key1, key2, key3…,访问时随机取key(1,2,3…)中一个访问,不同的key有不同的集群,充分利用现有的机器资源进行缓存,这样就降低某些机器的负载尖峰的出现,提升服务器整体稳定性。

从实践中感悟出处理问题的一些方法:类比同类事物推导适用性,将现有方案进行逆向思考也许也会有惊喜。

 

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>