高并发:
1、传统项目:
1、数据库方向:创建索引,存储过程、触发器、尽量少的使用子查询
2、缓存:session,cookie;
3、非关系数据库:redis,内存,缓存在硬盘上
4、异步{开启了多个子线程},弊端,共享数据--加锁(悲观锁)
程序中:服务层()对象锁,方法锁
数据库:整个表加锁,给行加锁,
2、分布式项目:
每一个块服务就是系统
创建的分布式锁:
实例代码:https://www.cnblogs.com/candychen/p/5736128.html
1:redis的setnx命令
Set命令【可重复改】;
Set tom 1;
Set tom 2;
Setnx命令:
Setnx tom 1;(加锁)
Setnx tom 2(无法执行);
解锁:del tom
第一种锁命令INCR
这种加锁的思路是, key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作进行加一。
然后其它用户在执行 INCR 操作进行加一时,如果返回的数大于 1 ,说明这个锁正在被使用当中。
1、 客户端A请求服务器获取key的值为1表示获取了锁
2、 客户端B也去请求服务器获取key的值为2表示获取锁失败
3、 客户端A执行代码完成,删除锁
4、 客户端B在等待一段时间后在去请求的时候获取key的值为1表示获取锁成功
5、 客户端B执行代码完成,删除锁
$redis->incr($key);
$redis->expire($key, $ttl); //设置生成时间为1秒
这种机制会造成大量的等待超时:
1:引入消息中间件activeMq
2:Zookeeper上锁【锁的是通信】