建立缓存,防高并发代码demo
我在之前的博客中提到过——缓存并发,当一个key过期时,访问这个key的请求量过大,穿透到数据库.解决办法:1,分布式锁,保证每个key同时只有一个线程去查询数据库,其他线程没有获得分布式锁的权限,只需要等待.具体实现如下
@Override
public AppUser findById(Long id) {
if (redisService.exists("user:" + id)) { String appUserStr = redisService.get("user:" + id); return JSONObject.parseObject(appUserStr,AppUser.class); } else { //获取分布式锁 if (RedisTool.tryGetDistributedLock(redisService,"useridlock:" + id,Long.toString(id),180)) { AppUser appUser = appUserDao.findById(id); redisService.set("user:" + id, JSONObject.toJSONString(appUser)); redisService.expire("user:" + id, 864000); //释放分布式锁 RedisTool.releaseDistributedLock(redisService,"useridlock:" + id,Long.toString(id)); return appUser; } else { //无获得分布式锁权限时 try { //当前线程休眠1秒,可根据适当情况调整这个休眠时间 Thread.currentThread().sleep(1000); if (redisService.exists("user:" + id)) { String appUserStr = redisService.get("user:" + id); return JSONObject.parseObject(appUserStr,AppUser.class); }else { return null; } } catch (InterruptedException e) { e.printStackTrace(); return null; } } }
}
Redis分布式锁的写法可参考本人上一篇博客,谢谢!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
多线程基础篇(3)——初试锁
1. 锁的概念 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。当一个资源被一个线程操作时,会对该资源加上锁,在锁未被释放期间,其他进行操作的线程都会陷入阻塞。 2. 为什么需要锁 当多个线程对同一个资源进行访问时,就会出现线程安全问题,就比如,你坐在桌子边手上拿着筷子正要去夹取最后一块食物时,突然被旁边的人夹走了食物,这时你就已经无法再进行操作,筷子就相当于CPU时间片,食物就相当于共享资源,所以此时程序就会发生一些无法预料的异常。 以下列购票程序为例,若ticket=1时,当线程t0执行到切换点时,失去CPU时间片切换到t1,但t1执行到切换点时也失去了CPU时间片,切换到t2线程顺利运行,ticket=0,t2运行完毕后,又切回t0继续运行,ticket=-1,又切到t1线程,ticket=-2,最后的结果会使得ticket数量出现负数,这显然是错误的。虽然这并不一定会发生,但一定有可能发生,所以线程安全也叫线程隐患。 public class Demo6 { //线程安全例...
- 下一篇
线程间的协作(1)——等待/通知机制
当使用线程来同时运行多个任务时,可以使用锁(互斥)来同步两个任务的行为,从而使得一个任务不会干扰另一个任务,也就是说两个任务在交替的使用某个共享资源,使用互斥可以保证时刻只有一个任务可以访问这项资源。 解决了多线程引起的资源竞争问题,那么我们又该如何实现线程间的彼此协作?使得多个任务可以一起去解决某个问题,也就是说,现在的问题不是线程间的干涉,而是线程间如何协调,因为在这类问题中,某些部分必须在其他部分被解决之前解决。 一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,这种模式隔离了“做什么”(what)和“怎么做”(How),在功能层面上实现了解耦,体系结构上具备了良好的伸缩性,在Java语言中实现的简单的办法是让消费者线程不断地循环检查变量是否符合预期,如下面代码所示,在 while循环中设置不满足的条件,如果条件满足则退出while循环,从而完成消费者的工作。 while (value != desire) { Thread.sleep(1000); } doSomethi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7