`
prevention
  • 浏览: 71518 次
社区版块
存档分类
最新评论

大并发访问同一个不存在的cache的两个解决方法

 
阅读更多

这是一种典型的大并发访问同一个不存在的cache的情形,

因此对于可预先知道的缓存,可以采取在程序启动的时候就生成。

对于这种无法预知key的,以论坛帖子列表为例,可以采取两种策略,

1.第一个发现cache中没有缓存对象时,先放入一个空的临时对象,

比如返回List,可以先生成一个长度为0的ArrayList,同时将生成缓存的操作放到队列中或者由当前线程完成,再将生成的数据替换刚才的临时缓存对象。

这种做法的缺点是,如果生成缓存的时间较长,那么会有一部分请求得到的不是实际数据,影响部分用户体验。且如果当前生成缓存的时候出现异常,需要等刚才的临时缓存失效之后,才会再次触发生成缓存的请求。

优点是编写代码简单,即使该缓存永远无法生成,也不会出发太多的生成缓存的操作。

不怕用户恶意请求来产生过多的无法命中的缓存。

属于牺牲少量用户体验来保障系统的稳定的做法。主要用于重要性较低的业务。


2.用申请锁的方式将生成缓存的操作以同步方式进行,

优点是基本不会出现取到方法1中的那种临时缓存,

缺点是,代码编写稍复杂,生成缓存操作耗时太久或出现问题,或者网络故障等其它原因导致该缓存永远无法生成的时候,

那么每次调用过读取该缓存的请求,都将被拖住,严重的时候整个服务器线程占满被拖垮。

一旦用户恶意请求导致缓存无法名字,服务器很容易被搞挂。


根据实际业务选择吧。


参考:http://xuliangyong.iteye.com/blog/274149


分享到:
评论

相关推荐

    Java高并发高性能分布式框架从无到有微服务架构设计(1).doc

    互联网高并发相关名词页面浏览数〔page views 〕唯一身份浏览量〔Unique PageViews〕独立访问者数量〔unique visitors〕重复访问者数量〔repeat visitors〕每个访问者的页面浏览数〔Page Views per user〕高并发之前...

    高性能高并发服务器架构大全

     大型数据库的设计与编程技巧 本人最近开发一个访问统计系统,日志非常的大,都保存在数据库里面。 我现在按照常规的设计方法对表进行设计,已经出现了查询非常缓慢地情形。 大家对于这种情况如何来设计数据库呢?...

    Java高并发高性能分布式框架从无到有微服务架构设计.doc

    有Ehcache 3.x、MapDB实现分布式缓存 进程内缓存和磁盘缓存,在多JVM实例的情况下,会存在两个问题: 1、单机容量问题; 2、数据一致性问题(多台JVM实例的缓存数据不一致怎么办?),这个问题不用纠结, 既然数据...

    计算机系统结构试题集

    两个或两个以上速度、容量和价格各不相同的存储器用硬件、软件、或软件与硬件相结合的方法连接起来成为一个存储系统。 存储系统对应用程序员透明,并且从应用程序员看来,它是一个存储器,这个存储器的速度接近速度...

    基于SpringBoot的高并发选课系统源码+项目说明(毕设).zip

    本项目主要解决在高校选课场景下,保证选课系统在大量读写压力下不宕机,以及选课时尽可能提高选课QPS,给学生一个良好的选课体验,完成上述功能同时保证选课安全 ## 技术选型 前端:Bootstrap、JQuery、Thymeleaf ...

    高级计算机体系结构作业汇总(非标准答案).doc

    PRAM 随机存取并行机器模型 共享存储的SIMD模型,假定存在一个容量无限大的共享存储器,有有限或无限个功能相 同的处理器,且他们都具有简单的算术运算和逻辑判断功能,在任何时刻处理器都可以 通过共享存储单元...

    Loadrunner报错日志

    这个问题一般是客户端链接到服务失败,原因有两个客户端连接限制(也就是压力负载机器),一个网络延迟严重,解决办法: 1、修改负载机器注册表中的TcpTimedWaitDelay减小延时和MaxUserPort增加端口数。注:这将增加...

    2017最新读取纯真IP数据库代码(C#)

    网上代码基本可分为两大类,第一类直接使用文件流,通过移动文件流指针(即更改 Stream.Position 属性值)搜索 IP 地址对应的信息,此类代码问题是:其一移动文件指针效率是比较低的(给 Position 赋值),多线程...

    高级软件架构师复习提纲

    //从源端复制数据到目标端,并检测和解决自上一次复制以来出现的任何更新冲突 //由位于源和目标之间、方向相反的两个复制链接组成的复制构造块 64、 下面哪些应用可以被称为Smart :A:能够利用本地资源 A:智能安装...

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    sesvc.exe 阿萨德

    从这两个核心方法(get/put)可以看出 1.8 中对大链表做了优化,修改为红黑树之后查询效率直接提高到了 O(logn)。 但是 HashMap 原有的问题也都存在,比如在并发场景下使用时容易出现死循环。 final HashMap, ...

    java微信公众号MVC开发框架

    url是微信公众号配置的服务器地址的最后部分(不包括域名和web应用上下文),是识别微信公众号的唯一标识,透过url我们可以通过微信上下文帮助类(WeixinContextHelper)的静态方法获取到微信上下文及访问token,...

    JAVA上百实例源码以及开源项目

     //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    JAVA上百实例源码以及开源项目源代码

     //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics