没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
0、单例模式
第一种:饿汉模式
饿汉模式在类被初始化时就已经在内存中创建了对象,以空间换时间,故不存在线程安全问题
第二种:双重锁懒汉模式(Double Check Lock)+volatile
优点就是,只有在对象需要被使用时才创建,第一次判断 INSTANCE == null 为了避免非必要加锁,
当第一次加载时才对实例进行加锁再实例化。这样既可以节约内存空间,又可以保证线程安全
第三种:静态内部类模式:
静态内部类的优点是:外部类加载时并不需要立即加载内部类,内部类不被加载则不去初始化
INSTANCE,故而不占内存。即当 SingleTon 第一次被加载时,并不需要去加载 SingleTonHoler,只
有当 getInstance()方法第一次被调用时,才会去初始化 INSTANCE,第一次调用 getInstance()方法会
导致虚拟机加载 SingleTonHoler 类,这种方法不仅能确保线程安全,也能保证单例的唯一性,同时
也延迟了单例的实例化。
饿汉式单例:
优点
1.实例的初始化由 JVM 装载类的时候进行,保证了线程的安全性
2.实现简单方便
3.实例的访问效率高
缺点
1.不能实现懒加载,如果不调用 getInstance(),那么这个类就白白的占据内存,资源的利用率不高
懒汉式单例:
优点
1.只有使用这个类的时候才初始化实例,优化了资源利用率
缺点
1.为了实现线程安全,使用了同步方法获取,增加了访问的开销
双重检测机制+Volatile(第一重检测提高访问效率;第二重检测提高了线程的安全)
优点
1.实现懒加载
2.通过缩小同步区域和第一次检查提高访问效率
缺点
1.为了实现线程安全,使用了同步方法获取,增加了访问的开销
静态内部类实现单例
优点
1.即实现了线程安全,又实现了懒加载
1、一致性 hash 算法
场景:比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到
N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 hash 值,然后均匀的映射到到
N 个 cache ;
hash(object)%N
一切都运行正常,再考虑如下的两种情况;
1 一个 cache 服务器 m down 掉了(在实际应用中必须要考虑这种情况),这样所有映射到 cache
m 的对象都会失效,怎么办,需要把 cache m 从 cache 中移除,这时候 cache 是 N-1 台,映射公
式变成了 hash(object)%(N-1) ;
2 由于访问加重,需要添加 cache ,这时候 cache 是 N+1 台,映射公式变成了 hash(object)%(N+1)
;
1 和 2 意味着什么?这意味着突然之间几乎所有的 cache 都失效了。
consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的
改变已存在 key 映射关系,尽可能的满足单调性的要求。说白了,可以解决因为动态增加节点或者删
除节点,而造成很多数据失效
2、页面静态化(1 是实现前后端分离,2 是将页面静态化,可以减少)
第一:现实中的动态网页往往只是其中一部分会发生变化,例如电商网站的菜单、页面头部、
页面尾部这些其实都不会经常发生变化,如果我们只是因为网页一小部分经常变化让用户每
次请求都要重复访问这些重复的资源,这其实是非常消耗计算资源了,我们来做个计算吧,
假如一个动态页面这些不变的内容有 10k,该网页一天有 1000 万次的访问量,那么每天将
消耗掉 1 亿 kb 的网络资源,这个其实很不划算的,而且这些重复消耗的宽带资源并没有为
网站的用户体验带来好处,相反还拖慢了网页加载的效率。那么我们就得考虑拆分网页了,
把网页做一个动静分离,让静态的部分当做不变的静态资源进行处理,动态的内容还是动态
处理,然后在合适的地方将动静内容合并在一起。
第二:java 的 web 开发里就会考虑使用模板语言 Theamleaf 替代 jsp 页面技术,例如模板
语言 velocity,这些模板语言都包含一个布局的功能,例如 velocity 就有这样的功能,我们
看看 velocity 的布局模板实例,如下所示:
第三:使用 Ajax 实现“动静合并”;不过一般而言,我们使用 ajax 做动静分离都是都是从
服务端请求一个 html 片段,到了浏览器后,使用 dom 技术将这个片段整合到页面里.
总结:1、使用 Thymeleaf 模板生成静态页面模板 2、使用 Ajax 来实现“动态页面和静态
页面的合并”,即使用 Ajax 向服务端发出请求,并获取响应数据,然后采用 dom 技术,将
响应数据整合到静态页面模板中去
3、防止秒杀按钮重复提交(disabled) 防止用户提交多次
4、前端 js+html 实现简单验证码(分散用户的请求,缓解同一时间很多用户同时点击秒杀
按钮,产生高并发)
<div class="new-web-row">
<span class="web-form-span " >验证码</span>
<input type="text" class=" web-form-input " required="required" id="Yzm">
<input type = "button" id="code" value="点我验证" onclick="createCode()"/>
</div>
生成验证码并进行验证:
var code ; //在全局定义验证码
//产生验证码
function createCode(){
code = "";
var codeLength = 4;//验证码的长度
var checkCode = document.getElementById("code");
var random = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','O','P','Q','R', 'S','T','U','V','W','X','Y','Z');//随机数
for(var i = 0; i < codeLength; i++) {//循环操作
var index = Math.floor(Math.random()*36);//取得随机数的索引(0~35)
code += random[index];//根据索引取得随机数加到 code 上
}
checkCode.value = code;//把 code 值赋给验证码
}
//校验验证码
document.getElementById("Yzm").addEventListener("change",validate);
function validate(){
var inputCode = document.getElementById("Yzm").value.toUpperCase(); //取得
输入的验证码并转化为大写
if(inputCode.length <= 0) { //若输入的验证码长度为 0
alert("请输入验证码!"); //则弹出请输入验证码
$("#Yzm").focus();
YZM = false;
}
else if(inputCode != code ) { //若输入的验证码与产生的验证码不一致时
alert("验证码输入错误!@_@"); //则弹出验证码输入错误
createCode();//刷新验证码
$("#Yzm").val("");//清空文本框
$("#Yzm").focus();//重新聚焦验证码框
YZM = false;
}
else { //输入正确时
$("#Yzm").blur();//绑定验证码输入正确时要做的事
YZM = true;
}
};
总结:前端优化(页面静态化、秒杀按钮禁止多次提交、秒杀之前输入验证码)
后端优化(controller 层接口限流优化+三级缓冲优化)
1、controller 层接口优化(redis+自定义注解+拦截器实现)
@AccessLimit(seconds=5, maxCount=5) 在 controller 层接口方法上面加上注解,限流
@Retention(RUNTIME)
@Target(METHOD)
剩余16页未读,继续阅读
明儿去打球
- 粉丝: 15
- 资源: 327
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- JavaScript《基于自动分析数据并给出营业建议的餐厅管理系统(接入AI) 》+源代码+项目说明及资料
- 355670834783295707ad04e-427f-4cde-9589-e578224a8459.zip
- 动态sql解析引擎,类似mybatis动态sql的功能
- EDA365-Skill-V2.5安装包,支持Allegro17.x版本
- C# 常用单词汇总,常用单词汇总
- 【ERP标准流程-标准流程-库内业务管理】(DOC 14页).doc
- Python《数据库期末作业-餐厅点单系统 》+源代码+设计资料
- 学生成绩管理系统(C++课程设计
- 双指针法判断链表有环-go语言实现
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0