tar zxvf redis-3.0.4.tar.gz
cd redis-3.0.4
make
./redis-server ../redis.conf
cd /opt/redis-3.0.4/src/
./redis-cli
/opt/redis-3.0.4/src/redis-cli -h 172.30.37.16 -p 6379
redis切换数据库 select 0
redis查询所有 keys *
获取值get key
redis自带分布式锁: ex,nx
ex是秒,px是毫秒,nx是键不存在,才能对其进行操作,xx是键存在才能对其操作。
JUC就是java.util .concurrent工具包的简称(java并发编程包)
redisson框架是redis的分布式锁的一个框架,它是基于juc开发的
JMS即Java消息服务(Java Message Service)应用程序接口,完成应用的通信,可以解除两个程序之间的耦合。它分点对点和发布订阅者两种方式通信
常见的jms框架有RocketMQ,activemq,Kafka。
set UmsMemberReceiveAddress:1:lock 1 px 10000 nx 给数据加锁(过期时间为10秒)
del UmsMemberReceiveAddress:1:lock (用完记着删除key,方便别人能接着用)
存取速度太快,一些人无法进入到自旋。
com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout
服务提供者响应的时间超过了设置的timeout,dubbo就会尝试请求 3次,如果失败,就报错。dubbo默认时间是1秒,可通过一下进行配置
spring.dubbo.provider.timeout=15000
@Override
public UmsMember testRedis(String userId,String ip){
System.out.println("ip为"+ip+"的同学:"+Thread.currentThread().getName()+"1. 进入请求");
UmsMember umsMember=new UmsMember();
//连接缓存
Jedis jedis = redisUtil.getJedis();
//查询缓存
String userKey="UmsMemberReceiveAddress:"+userId+":info";
String userJson = jedis.get(userKey);
//System.out.println(userJson+"############################");
if (StringUtils.isNotEmpty(userJson)){
System.out.println("ip为"+ip+"的同学:"+Thread.currentThread().getName()+"从缓存中获取到了数据");
umsMember= JSON.parseObject(userJson,UmsMember.class);
}else {
System.out.println("ip为"+ip+"的同学:"+Thread.currentThread().getName()+"发现缓存中没有,申请缓存的分布式锁:"+"UmsMemberReceiveAddress:" + userId + ":lock");
//缓存没有,查询mysql
//设置分布式锁
//这里需要设置过期时间,好比给你10秒去自助餐厅吃东西,时间到了就得走,不能让你无限制时间的吃,否则你就吃死了,别人也不能来吃
String ok=jedis.set("UmsMemberReceiveAddress:"+userId+":lock","1","nx","px",5*1000);
//System.out.println("------------------"+ok);
if (StringUtils.isNotEmpty(ok)&&"OK".equals(ok)){
System.out.println("ip为"+ip+"的同学:"+Thread.currentThread().getName()+"在5秒的过期时间内抢到了锁,并开始访问数据库:"+"UmsMemberReceiveAddress:" + userId + ":lock");
//设置成功,有权在10秒的过期时间内访问数据库
umsMember.setId(userId);
umsMember= userMapper.selectOne(umsMember);
if (umsMember!=null){
//将结果存入redis
jedis.set(userKey,JSON.toJSONString(umsMember));
}else {
//数据库中不存在,为了防止缓存穿透,这里设置null值
jedis.setex(userKey,60*3,JSON.toJSONString(" "));
}
System.out.println("ip为"+ip+"的同学:"+Thread.currentThread().getName()+"使用完毕,将锁归还:"+"UmsMemberReceiveAddress:" + userId + ":lock");
try {
Thread.sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//访问完mysql后需要释放掉锁
jedis.del("UmsMemberReceiveAddress:"+userId+":lock");
}
else {
System.out.println("ip为"+ip+"的同学:"+Thread.currentThread().getName()+"没有拿到锁,开始自旋");
//设置失败,那么通过自旋,让它睡几秒 Thread.sleep(3000) 开了b线程(是a的子线程),但a任然继续等待,且3秒后b将变成孤儿线程,没有人管他了。
try {
Thread.sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
umsMember.setId(userId);
umsMember= userMapper.selectOne(umsMember);
return umsMember;
}
}
//对象名,id,属性
jedis.close();
return umsMember;
}
juc中锁的是jvm的一个或多个线程 —锁线程
redission中锁的是关于redis的那些连接 ----锁连接
取消单例
httpd是http协议的示例,也是http协议的主程序
下载apache压力测试软件:https://www.apachehaus.com/cgi-bin/download.plx
解压apache24,修改配置httpd.conf
window查看端口占用
ab -c 200 -n 1000 http:nginx
ab–压力测试 -c设置并发数 -n 多少个请求 每秒并发的发送200个请求,5秒内发送1000个请求
ab -c 200 -n 1000 http://192.168.43.14/testRedisson