知识整理

并发执行,拆分任务量

QPS 每秒相应的请求数量;

吞吐量:单位时间内处理的请求量;

响应时间:系统对一个请求做出响应的平均时间;

并发指某一个时刻有多少个访问同时到来;

QPS=并发数/平均响应时间;

如何增加系统的QPS

1.上机器 添加机器 涉及到db主从,读写分离,负载均衡等技术;

2.增加单机性能 增加不常变化的数据缓存,db表优化,优化代码(深层递归,多重嵌套循环)

如何对请求进行过滤:

浏览器或者app 做限速,请求点击的限速;最上层执行js代码

站点层 对uid的请求限速,做页面缓存;访问后端数据,拼接html返回浏览器

服务层 按照业务写请求队列控制流量,做数据缓存;向上游屏蔽数据细节,提供数据访问

数据库 避免请求频繁的访问数据库,做好请求的拦截

具体要结合业务做优化。

保证线程的先后顺序:使用join()方法,它的原理是源码调用了wait方法,待结束时,调用notify()唤醒线程。

lock相对于synchronized,ReadWriteLock提供了读和写两个单独的锁,读与读不会干扰,读写 写写 是会添加锁,避免了数据不一致的问题,提高了读的效率。

在缓存更新或过期的情况下,先获取锁,在获取到数据库中更新的数据后,在释放锁,需要一定的时间,就可以从缓冲中获取数据。

Redis缓存是只让一个线程构建缓存,其他线程在构建缓存的线程执行完,重新从缓存中读取数据就可以了。

redis缓存的过期键删除策略:

1、立即删除 过期后由时间处理器自动执行键的删除策略;会增加cpu压力

2、惰性删除 过期先不管,下次取值时判断键是否过期,过期就delete,返回nil,没过期就返回value;浪费内存,dict字典与expires都要保存key和value信息

3、定时删除 每隔一段时间,对expires字典进行检查,删除过期key;折中的办法通过限制执行的时间和频率,减少多cpu的压力,减少内存的浪费

具体可以惰性删除配合定时删除;

设置缓存的信息与时间 set方法 expire方法 set(key,value,"NX","EX",second)NX是不存在时才set XX是存在是才set,ex是秒 px是毫秒

线程执行wait方法会释放当前的锁,让出CPU,进入等待状态,只有当执行notify/notifyAll的时候,才会唤醒一个或多个正在沉睡的线程,然后继续往下执行,直到执行结束或再次遇到wait方法,再次释放锁。

wait会让线程释放对象锁,别的线程会继续运行,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备,

sleep不会让线程释放对象锁。

多线程解决生产者消费者问题:

1、使用wait与notify;

2、jdk5.0之后java提供了lock与Condition,Condition接口的await和signal方法;

3、BlockingQueue接口的两个实现类LinkedBlockingQueue与ArrayBlockingQueue中的take()消费与put()生产。

向队列put一个元素,队列满时,自动阻塞;向队列take一个元素,当队列空时,自动阻塞;通过size()方法,获取队列当前的大小

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值