一步步搭建分布式---项目整合redis

redis安装和启动

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是什么

JUC就是java.util .concurrent工具包的简称(java并发编程包)
redisson框架是redis的分布式锁的一个框架,它是基于juc开发的

jms是什么

JMS即Java消息服务(Java Message Service)应用程序接口,完成应用的通信,可以解除两个程序之间的耦合。它分点对点和发布订阅者两种方式通信
常见的jms框架有RocketMQ,activemq,Kafka。

redis锁机制

set UmsMemberReceiveAddress:1:lock 1 px 10000 nx 给数据加锁(过期时间为10秒)
在这里插入图片描述
del UmsMemberReceiveAddress:1:lock (用完记着删除key,方便别人能接着用)

  • 第一种解决方案 ex,nx(只有不存在才能成功)锁 -----解决击穿问题
    在这里插入图片描述
    这一时间,a访问到了,b只能等着,自旋后才能再次访问。
  • 第二种方案redission框架

存取速度太快,一些人无法进入到自旋。

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和redission的锁的区别

juc中锁的是jvm的一个或多个线程 —锁线程
redission中锁的是关于redis的那些连接 ----锁连接

取消单例
在这里插入图片描述
在这里插入图片描述
httpd是http协议的示例,也是http协议的主程序

使用apche进程压力测试

下载apache压力测试软件:https://www.apachehaus.com/cgi-bin/download.plx
解压apache24,修改配置httpd.conf
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

window查看端口占用

netstat -ano|findstr “8082”
在这里插入图片描述
启动成功,再新开一个窗口

ab -c 200 -n 1000 http:nginx

ab–压力测试 -c设置并发数 -n 多少个请求 每秒并发的发送200个请求,5秒内发送1000个请求

ab -c 200 -n 1000 http://192.168.43.14/testRedisson

在这里插入图片描述
benchmarking是检测得意思。这个属于http攻击

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值