Dogpile效应以及solution

原创 2016年06月18日 23:19:03

Redis/Memcached高并发访问下的缓存失效时可能产生Dogpile效应(Cache Stampede效应)。看代码:

# redis read-through cache
conn = redis.Redis()
data = conn.get('cachekey')
if not data:
    # long-running process
    data = generateData()
    conn.setex('cachekey', data, 10)


Dogpile 产生情况:

generateData()是耗时的运算过程或者复杂的数据库操作。当缓存失效或者redis-server不可用(服务器宕机/网络原因),此时恰好有大量的请求涌入,会直接穿透cache层从而导致CPU使用率或者数据库操作数短时间急剧攀升,可能会引发数据库/web服务器故障。

Solution:

1.      使用独立的进程\线程更新cache

实践:web应用中启动调度线程;单独进程Job(spring-boot)

// every ten seconds
@Scheduled(cron = "*/10 * * * * *")

现在我们的应用就是基于这样的方案,可靠,经历618考验^_^。

2.      使用”锁”

实践:cache失效,单一请求,其余等待;单一请求cache失效前更新

# redis read-through cache
conn = redis.Redis()

def get(key):
    data = conn.get(key)
    if data:
        return data
    # try lock
    if conn.setnx('lock:' + key, 'locked'):
        # long-running process
        data = generateData()
        conn.setex(key, data, 10)
        conn.delete('lock:' + key)
        return data
    else:
        # 'waiting & try get'
        loop = 10
        while loop > 0:
            time.sleep(0.1)
            data = conn.get(key)
            if data:
                print 'found'
                return data
            loop -= 1
        return None
或者是

# redis read-through cache
conn = redis.Redis()

def get(key):
    recache = 2
    data = conn.get(key)
    ttl = conn.ttl(key)

    if ttl < recache and conn.setnx('lock:' + key, 'locked'):
        print 'recache'
        # long-running process
        data = generateData()
        conn.setex(key, data, 10)
        conn.delete('lock:' + key)
    # normal return
    return data

这两者各有优势,看具体业务选取。我们应用涉及到实时或者重定向的功能采用的是第一种锁。

另外:按照具体的使用确定是否要对锁的冲突和异常进行特殊处理,代码中没有实现。

参考(力荐):http://www.linuxidc.com/Linux/2013-07/86960.htm (关于这次项目的实践,上线后才看到这篇文章,相见恨晚。本文只做实践,详解看这篇推荐。)

618值班顺利




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tt50335971/article/details/51707672

蓝桥杯:算法训练 Pollution Solution

问题描述 输入格式 输出格式 样例输入 样例输出 数据规模和约定 思路 代码问题描述  作为水污染管理部门的一名雇员,你需要监控那些被有意无意倒入河流、湖泊和海洋的污染物。你的其中一项工作就是估计污染...
  • LSylvie
  • LSylvie
  • 2018-01-03 16:14:17
  • 742

算法训练 Pollution Solution

问题描述  作为水污染管理部门的一名雇员,你需要监控那些被有意无意倒入河流、湖泊和海洋的污染物。你的其中一项工作就是估计污染物对不同的水生态系统(珊瑚礁、产卵地等等)造成的影响。   你计算所使用的模...
  • qq_34239028
  • qq_34239028
  • 2018-03-11 15:09:21
  • 125

算法训练 Car的旅行路线 蓝桥杯

描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里...
  • sinat_35637319
  • sinat_35637319
  • 2017-02-23 17:38:23
  • 900

算法训练 Collecting Luggage 计算几何 最短路

问题描述  航班结束后,提取行李的过程并不琐碎。手提箱和行李箱出现在一条传送带上,数百名乘客争夺有利的位置从中找到并取回自己的所有物。近日,成田机场管理局已决定使这一过程更加高效。在重新设计行李认领区...
  • qq_34239028
  • qq_34239028
  • 2018-03-11 13:48:42
  • 1633

Operation System - Peterson's Solution算法 解决多线程冲突

Person's solution 是用来一种基于软件的解决关键区域问题的算法(critical-section). 它并非完美的,有可能不正确地工作。而且是限制解决两个进程同步的问题。 但是它很...
  • kenden23
  • kenden23
  • 2014-05-12 13:00:34
  • 2492

Pollution

Pollution is one of the biggest problems all over the world. Our earth is getting dirtier because we...
  • shileiaini0
  • shileiaini0
  • 2007-08-12 14:13:00
  • 346

蓝桥杯 - 算法训练 明明的随机数 C语言实现

算法训练 明明的随机数 题目: 问题描述   明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保...
  • qq_34845121
  • qq_34845121
  • 2017-03-05 10:33:15
  • 741

Dogpile效应以及solution

高并发访问下的缓存失效时可能产生Dogpile效应,如何解决。实践
  • tt50335971
  • tt50335971
  • 2016-06-18 23:19:03
  • 772

facebook效应

  • 2011年05月19日 11:32
  • 1.45MB
  • 下载
收藏助手
不良信息举报
您举报文章:Dogpile效应以及solution
举报原因:
原因补充:

(最多只允许输入30个字)