Is this code vulnerable to the expired cache race condition? How would you improve it?

是.如果两个(或多个)并发客户端尝试从缓存中获取相同的密钥并最终从数据库中提取它.您将在数据库上出现峰值,并且数据库将在一段时间内处于高负载状态.这称为缓存标记.有几种方法可以解决这个问题:

>对于新项目预热缓存(基本上意味着您在网站上线之前预加载所需的对象).

>对于定期过期的项目,创建一个未来的过期时间,而不是实际过期时间(比如说5-10分钟).然后,当您从缓存中提取对象时,请检查过期时间是否已关闭,将来是否缓存以防止任何其他客户端更新缓存,以及从数据库进行更新.为了能够在没有缓存标记的情况下工作,您需要实现密钥锁定或使用cas标记(需要最新的客户端库才能工作).

Let’s say that query X gets 100 rows. A little after row #50 is modified by another process (lets say that the retail price gets increased).

缓存中有三种类型的数据:

>对象

>物体清单

>生成的数据

我通常做的是将对象保持为单独的键,然后在列表中使用缓存“指针”.在你的情况下你在缓存中的某个地方有N个objets(假设键是1,2..N),然后你有一个数组数组中的对象列表(1,2,3,10,42 …) .当您决定使用对象加载列表时,从缓存加载列表键,然后从缓存加载实际对象(使用getMulti减少请求).在这种情况下,如果任何对象得到更新,您只能在一个位置更新它,并且它会自动更新到任何地方(更不用说使用此技术可以节省大量空间).

编辑:决定添加更多关于超前时间到期的信息.

使用到期数据x设置对象并将其保存到数据库中,其有效期为x 5分钟.这是从缓存加载对象时执行的步骤:

>检查是否需要更新(时间() – x <0)

>如果是这样,请锁定密钥,以便在刷新项目时没有人可以更新它.如果您无法锁定密钥,那么其他人已经在更新密钥,它就变成了SEP(Somebody Else的问题).由于memcached没有锁的解决方案,因此您必须设计自己的机制.我通常通过在末尾添加一个单独的键和原始键值“:lock”来完成此操作.您必须将此键设置为以尽可能短的数量到期(对于1秒的memcached).

>如果您获得了密钥的锁定,则首先使用新的到期时间保存对象(这样您确定没有其他客户端会尝试锁定密钥),然后继续您的业务并从数据库更新密钥,使用适当的超前期限再次保存新值(请参阅第1点).

希望这清除一切:)

memcached和php关系,php – memcacheD这没关系?相关推荐

  1. 分布式缓存系统Memcached简介与实践(.NET memcached client library)

    原文:分布式缓存系统Memcached简介与实践(.NET memcached client library) 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加 ...

  2. java memcached 存储对象_memcached—向memcached中保存Java实体需注意的问题

    今天以代码实例的形式总结一下向memcached中保存Java实体需注意的问题: memcached工具类代码: package com.ghj.packageoftool; import java. ...

  3. php怎么连接memcached,如何使用 PHP 扩展 Memcached 的长连接模式

    我们知道 Memcache 有个 pconnect() 方法可以实现长连接,其实 Memcached 也可以实现持久化连接. 使用 PHP 扩展 Memcached 的长连接模式 Memcached ...

  4. CentOS下安装Memcached,Linux下安装Memcached,centos下安装memcached,linux下安装memcached...

    摘要:最近在看<大型分布式网站架构设计与实践>这本书,把其中的学习过程记录一下,以便日后复习. 一:Memcached简单介绍和描述: Memcached 是一个高性能的分布式内存对象缓存 ...

  5. memcached linux 配置文件,Linux下Memcached服务器部署 | 系统运维

    操作系统:CentOS 6.x 64位 实现目的:安装部署Memcached服务器 一.防火墙设置 vi /etc/sysconfig/iptables #编辑防火墙配置文件,添加下面代码 -A IN ...

  6. 艾伟:memcached全面剖析–2.理解memcached的内存存储

    本系列文章导航 memcached完全剖析–1. memcached的基础 memcached全面剖析–2.理解memcached的内存存储 memcached全面剖析–3.memcached的删除机 ...

  7. 简单的Spring Memcached – Spring缓存抽象和Memcached

    在任何读取繁重的数据库应用程序中,缓存仍然是最基本的性能增强机制之一. Spring 3.1发行版提供了一个很酷的新功能,称为Cache Abstraction . Spring Cache Abst ...

  8. memcached全面剖析–2.理解memcached的内存存储

    版权声明:可以任意转载,但转载时必须标明原作者charlee.原始链接http://tech.idv2.com/2008/07/11/memcached-002/以及本声明 下面是<memcac ...

  9. windows 安装 php memcached,Windows安装配置php+memcached的方法

    Windows下Memcached的安装配置方法 1.将第一个包解压放某个盘下面,比如在c:\memcached. 2.在终端(也即cmd命令界面)下输入 'c:\memcached\memcache ...

最新文章

  1. 【 MATLAB 】MATLAB 实现模拟信号采样后的重建(三)一阶保持(FOH)内插
  2. Lesson 12.5 softmax回归建模实验
  3. 恢复VMware vSphere已孤立的虚拟机
  4. java for 死循环_简单的java死循环 java中的死循环问题
  5. 字符串中最长无重复子串(O(n))
  6. php flash chart,openflashchart 2.0 简单案例php版
  7. Oracle数据库之数据类型
  8. 《spring-boot学习》-04-综合开发
  9. SIR传染病模型(微分方程系列1)
  10. 快手视频批量下载,一个脚本就够了,手把手教你批量下载快手高清视频。
  11. Java实现List集合去重的5种方式
  12. 怎么简单的生成SSL证书
  13. 转专业的程序员,泪眼回首头三年
  14. 硬盘加密数据怎么恢复?BitLocker加密文件可恢复吗?BitLocker加密数据怎么恢复?
  15. 分布式锁?我一手synchronized 什么高并发,什么秒杀通通拿下(狗头)
  16. 农村中学扩建工程全套CAD施工图哪里找?
  17. centos 7 安装mysql 8.0 详细教程
  18. SemEval 情感分析主流数据集以及任务介绍
  19. 技术博客丨神经网络不再“卷” 全靠“变形金刚”
  20. 算法小解--剑指offer(一)

热门文章

  1. harmonyOS智慧屏,在鸿蒙HarmonyOS智慧屏上实现一款粗糙的计算器
  2. win10如何关闭Windows Defender安全保护程序
  3. vue-router详尽:编程式导航、路由重定向、动态路由匹配、路由别名、嵌套路由、命名视图
  4. spring boot配置dubbo(properties)
  5. Map的value转化为其它类型
  6. 大于小于优化_架构 - 以MySQL为例,详解数据库索引原理及深度优化
  7. 聊聊 vue 生命周期
  8. python self 值自动改变_Python,为什么传递和更改带有外部函数的类selfvariable用于操作iterable而不是变量...
  9. filter函数使用出现的问题
  10. IDEA——常用快捷键