近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源。他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Missing Loading前,强占这其中十几毫秒的时间,进行恶意攻击。
为了应对上述情况,做了如下调整:
- 更新数据时,先写Cache,然后写Database,如果可以,写操作交给队列后续完成。
- 限制统一帐号,同一动作,同一秒钟并发次数,超过1次不做做动作,返回操作失败。
- 限制统一用户,每日动作次数,超限返回操作失败。
要完成上述操作,同事给我支招。用Memcached的add方法,就可以很快速的解决问题。不需要很繁琐的开发,也不需要依赖数据库记录,完全内存操作。
以下实现一个判定冲突的方法:
-
-
-
-
publicstaticfinalintMUTEX_EXP=1;
-
-
-
-
publicstaticfinalStringMUTEX_KEY_PREFIX="MUTEX_";
-
-
-
-
-
-
-
publicbooleanisMutex(Stringkey){
-
returnisMutex(key,MUTEX_EXP);
-
}
-
-
-
-
-
-
-
-
-
publicbooleanisMutex(Stringkey,intexp){
-
booleanstatus=true;
-
try{
-
if(memcachedClient.add(MUTEX_KEY_PREFIX+key,exp,"true")){
-
status=false;
-
}
-
}catch(Exceptione){
-
logger.error(e.getMessage(),e);
-
}
-
returnstatus;
-
}
做个说明:
选项 |
说明 |
add |
仅当存储空间中不存在键相同的数据时才保存 |
replace |
仅当存储空间中存在键相同的数据时才保存 |
set |
与add和replace不同,无论何时都保存 |
也就是说,如果add操作返回为true,则认为当前不冲突!
回归场景,恶意用户1秒钟操作6次,遇到上述这个方法,只有乖乖地1秒后再来。别小看这1秒钟,一个数据库操作不过几毫秒。1秒延迟,足以降低系统负载,增加恶意用户成本。
附我用到的基于XMemcached实现:
-
importnet.rubyeye.xmemcached.MemcachedClient;
-
-
importorg.apache.log4j.Logger;
-
importorg.springframework.beans.factory.annotation.Autowired;
-
importorg.springframework.stereotype.Component;
-
-
-
-
-
-
-
-
@Component
-
publicclassMemcachedManager{
-
-
-
-
-
publicstaticfinalintCACHE_EXP_DAY=3600*24;
-
-
-
-
-
publicstaticfinalintCACHE_EXP_WEEK=3600*24*7;
-
-
-
-
-
publicstaticfinalintCACHE_EXP_MONTH=3600*24*30;
-
-
-
-
-
publicstaticfinalintCACHE_EXP_FOREVER=0;
-
-
-
-
-
publicstaticfinalintMUTEX_EXP=1;
-
-
-
-
publicstaticfinalStringMUTEX_KEY_PREFIX="MUTEX_";
-
-
-
-
privatestaticfinalLoggerlogger=Logger
-
.getLogger(MemcachedManager.class);
-
-
-
-
-
@Autowired
-
privateMemcachedClientmemcachedClient;
-
-
-
-
-
-
-
-
-
-
publicvoidcacheObject(Stringkey,Objectvalue,intexp){
-
try{
-
memcachedClient.set(key,exp,value);
-
}catch(Exceptione){
-
logger.error(e.getMessage(),e);
-
}
-
logger.info("CacheObject:["+key+"]");
-
}
-
-
-
-
-
publicvoidfinalize(){
-
if(memcachedClient!=null){
-
try{
-
if(!memcachedClient.isShutdown()){
-
memcachedClient.shutdown();
-
logger.debug("ShutdownMemcachedManager...");
-
}
-
}catch(Exceptione){
-
logger.error(e.getMessage(),e);
-
}
-
}
-
}
-
-
-
-
-
-
-
publicvoidflushObject(Stringkey){
-
try{
-
memcachedClient.deleteWithNoReply(key);
-
}catch(Exceptione){
-
logger.error(e.getMessage(),e);
-
}
-
logger.info("FlushObject:["+key+"]");
-
}
-
-
-
-
-
-
-
publicbooleanisMutex(Stringkey){
-
returnisMutex(key,MUTEX_EXP);
-
}
-
-
-
-
-
-
-
-
-
publicbooleanisMutex(Stringkey,intexp){
-
booleanstatus=true;
-
try{
-
if(memcachedClient.add(MUTEX_KEY_PREFIX+key,exp,"true")){
-
status=false;
-
}
-
}catch(Exceptione){
-
logger.error(e.getMessage(),e);
-
}
-
returnstatus;
-
}
-
-
-
-
-
-
-
-
public<T>TloadObject(Stringkey){
-
Tobject=null;
-
try{
-
object=memcachedClient.<T>get(key);
-
}catch(Exceptione){
-
logger.error(e.getMessage(),e);
-
}
-
logger.info("LoadObject:["+key+"]");
-
returnobject;
-
}
-
-
}
分享到:
相关推荐
Memcached——内存数据库讲义及安装步骤
memcached-笔记资料
Memcached学习笔记2.docMemcached学习笔记2.doc
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的...
Memcached源码剖析笔记:从源码级别剖析memcached的实现原理,讲的比较细。
memcached 源码剖析笔记和源码。 Memcached 是一个自由、源码开放、高性能、分布式内存对象缓存系统,目的在于过减轻数据库负载来使动态 Web 应用程序提速。
基于Nginx和Memcached的高并发WEB服务器设计_戴华, 基于Nginx和Memcached的高并发WEB服务器设计_戴华
韩顺平 PHP Memcached缓存技术资料源码笔记图解PPT_Ady
memcached-笔记资料.rar
Memcached源码剖析笔记
Memcached源码剖析笔记
NULL 博文链接:https://acooly.iteye.com/blog/1120347
从memcached官网下载的,安全无后门。 对于Memcache使用者,要保证自己不被利用成为“放大器”,安全建议: 1、升级最新Memcache版本,提升自身安全性; 2、指定必要的安全策略,做可信可控的访问; 3、修改默认...
1.大数据高并发架构实战案例分享-概述 2.Piranha安装快速搭建LVS负载均衡集群 3.LVS负载均衡DR模式安装调试介绍 4.LVS负载均衡深入进阶实战 5.LVS调度策略及负载均衡原理深入 6.LVS深入及NAT集群调试 7.Nginx反向...
高性能高并发服务器架构 基于nginx的tomcat负载均衡和集群 实现多服务器负载均衡 系统性能优化 数据库 Nginx+Squid负载均衡 配置好的集群 总共三十个文档">Apache+Tomcat+Session+Memcache 高性能群集搭建 J2EE性能...
memcached, libevent, MemCachedClient
在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装 3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动...
memcached 64位 window memcached 64位 window memcached 64位 window