电脑剩余内存1.2G
直接查数据库
连表查询工90条数据
500
平均值越小越好,吞吐量越大越好
加redis缓存
明显提高了,可是有10次是查数据库的,490次是从redis中取的。(缓存击穿)原因是并发问题,解决方案是加锁
1:加redission锁
<!--加入redisson-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.6.5</version>
</dependency>
@Autowired
RedissonClient redission;
RLock lock = redission.getLock(lockPath + id);
try {
//1
if (lock.tryLock()) {
xxxxx
}
}finally {
lock.unlock();
}
//以上代码会导致,解锁失败。(线程1解锁不是自己的)
在finallyl 里 换成
if (lock.isLocked()){
if (lock.isHeldByCurrentThread()){
lock.unlock();
}
}
//以上代码会导致很多线程取不到缓存中的数据
//等待0秒,锁住5秒后自动解锁
//2
if (lock.tryLock(0,5,TimeUnit.SECONDS)) {
查询数据库
}else{
//没拿到锁的线程 198
Thread.sleep(50);
System.out.println("没拿到锁的线程");
xxx
}
lock.tryLock有参数和无参数的区别?????????????????????
//3 这次查询一次数据库,799走缓存。但是效率会很慢。
lock.lock();
......
解决数据缓存的思路:减少网络io和磁盘io
数据库只查一次,499次是从redis缓存中查的。这里解决了磁盘io。那么网络io怎么解决。(1:压缩传输的数据,还有呢?可以在redis缓存前套个jvm级别的本地缓存,用guave实现的本地缓存,它有LRU淘汰机制。)
综上redission中tryLock有参,和无参数以及lock方法的区别。