美文网首页
Redis & FastDFS & RabbitMQ

Redis & FastDFS & RabbitMQ

作者: 极速魔法 | 来源:发表于2020-10-21 20:56 被阅读0次

    Redis

    运行速度快,并发强,运行在内存的NoSql(not only sql) 数据库

    使用场景

    • 缓存
    • 排行榜
    • 计算器/限速器,统计用户点赞,访问量,限制访问API频率
    • 好友关系,共同好友,共同爱好
    • 消息队列,到货通知
    • session共享,不同机器之间共享session

    分布式数据库CAP

    • Consistency,强一致性
    • Availability,高可用性,服务一直可用
    • Partition tolerance,分区容错性

    p是必须的,C 和 A 不能兼顾

    操作命令

    # 查询所有键
    keys *
    
    # 包含 k
    keys *k*
    
    # 判断 键 k1是否存在
    exists k1
    
    # 查看键k1 还有多久过期
    ttl k1
    
    # 设置过期时间 10s
    expires k1 10
    

    数据类型

    string

    # 值自增 +1
    incr k1 1
    
    # 自减
    decr k1 1
    
    # 自增 +3
    incrby k1 3
    
    # 对值 切片,包含全部的值
    getrange k1 0 -1
    
    # 替换 值 位置1所在的字符 aaa
    setrange k1 1 aaa
    
    # 设置k1,生命周期5s
    set k1 5 v1
    
    # m代表more,批量设置
    mset k1 v1 k2 v2
    
    # 先取值再设置值
    getset k6 v6
    

    列表List

    上对应左,下对应右,比作弹夹压子弹

    # lpush 栈,从上向下压入子弹
    lpush list1 1 2 3
    
    # rpush 队列
    rpush list1 1 2 3
    
    #查询list
    lrange list 0 -1
    
    #移除 2个 3
    lrem list 2 3 
    
    # list[0]="x"
    lsett list 0 x
    
    # 左边插入,list中1元素前插入 java
    linsert list before 1 java
    
    

    Set

    # 添加元素 并去重
    sadd set 1 2 3
    
    #查看元素
    smembers set
    
    # 元素个数
    scard set
    
    # 交集
    sinner set1 set2
    
    #并集并去重
    sunion set1 set2
    
    #差集,结果是set1中存在,set2不存在
    sdiff set1 set2
    

    Hash哈希

    key -value结构,value存储的是key-value结构

    # 添加user,id=1001
    hset user id 1001
    
    #查询user 指定字段
    hget user id
    
    #删除user id属性
    hdel user id
    
    # 获取user所有信息
    hgetall user
    
    # 获取student所有属性名
    hkeys student
    # 获取student所有属性值
    hvals student
    

    有序集合ZSet

    # 赋值,vip1 分数(权重)10
    zset zset1 10 vip1 20 vip2
    
    # 分数 区间【20,40】
    zrangebyscore zset1 20 40
    # 分数 区间 (20,40】
    zrangebyscore zset1 (20 40
    
    # 取vip3下标
    zrank zset1 vip3
    
    #获取vip2分数
    zscore zset1 vip2
    
    # 大值在前 【30,20】区间
    zrevrangebyscore zset1 30 20
    

    持久化 RDB

    • shutdown命令,redis自动备份,dump.rdb文件更新
    • 手动备份 save

    AOF(Append only File)

    appendonly.aof文件 记录redis写指令操作,开机会读取操作文件,恢复数据
    appendonly.aof 优先级高于 dump.rdb

    事务

    #开启事务
    multi
    set k1 v1
    # 执行
    exec
    
    multi
    set k1 v1
    # 放弃操作
    discard
    

    发布订阅

    # 订阅频道
    subscribe cctv1
    
    # 频道发布消息
    publish cctv1 news
    

    主从复制

    • 读写分离,主机写,从机读
    • 配从库不配主库,从机选择主机,主机无法选择从机
    • 从机离线再上线,重启归来的从机成为master,离开原来的集群
    # 脱离组织,自立为王
    slaveof no one
    

    复制原理

    主从刚连接,进行全量同步;全同步结束后,进行增量同步

    Jedis

    // 连接redis
    Jedis jedis= new Jedis("192.168.204.111",6379);
    
    jedis.set("k1","v1");
    // k2 是否存在
    Bool exist = jedis.exists("k1");
    # 获取 键k1的值
    jedis.get("k1");
    
    // 开启事务
    Transaction tx = jedis.multi();
    ...
    tx.exec();
    
    

    分布式锁Redisson

    zookeeper高可靠性,redis高性能。应用最多的是redis

    // 通过redisson获取锁
    RLock rLock = redisson.getLock(productKey);
    // 上锁(过期时间为30秒) 
    rLock.lock(30, TimeUnit.SECONDS);
    
    try {
        ...
    } catch() {
    
    } finally {
        rLock.unlcok();
    }
    
    @Bean 
    public Redisson redisson(){
    
        Config config = new Config(); // 使用单个redis服务器
    
        config.useSingleServer().setAddress("redis://192.168.204.141:6379").setDatabase (0);
        return (Redisson)Redisson.create(config);
    }
    

    分布式文件系统 FastDFS

    • Hadoop 分布式文件系统 HDFS,大文件
    • GFS
    • FastDFS,适合图片,小视频小文件,对文件是不分割的,没有文件合并和切割开销

    工作原理

    包含Tracker Storage Server,Tracker

    • Tracker
      负责调用,管理存储服务
    • Storage
      文件存储,集群采用分组,同组内的服务器数据同步,定时向tracker汇报状态信息

    RabbitMQ

    消息队列 MQ

    • 消息队列中间件,解决异步处理,应用解耦,流量削峰
    • 消息队列是典型的生产者消费者模型

    背景知识

    AMQP 高级消息队列协议
    JMS ,java消息服务应用程序接口,java平台面向消息中间件的API,类似JDBC角色

    JMS统一消息操作,AMQP统一数据交互格式

    快速入门

    5672:RabbitMQ提供给编程语言客户端连接的端口
    15672:RabbitMQ管理界面的端口
    25672:RabbitMQ集群的端口

    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    //1.创建连接工厂
    
    ConnectionFactory factory = new ConnectionFactory();
    
    //2.在工厂对象中设置MQ的连接信息(ip,port,vhost,username,password)
    
    factory.setHost("192.168.204.141");
    
    factory.setPort(5672); factory.setVirtualHost("/lagou"); factory.setUsername("laosun"); factory.setPassword("123123"); 
    //3.通过工厂获得与MQ的连接 
    Connection connection = factory.newConnection();
    

    RabbitMQ模式

    • 点对点模式

    • 发布订阅模式

    消息确认机制 ACK

    自动消息确认

    // 4.监听队列 true:自动消息确认 
    channel.basicConsume("queue1", true,consumer);
    

    手动消息确认

    // 手动确认(收件人信息,是否同时确认多个消息) 
    channel.basicAck(envelope.getDeliveryTag(),false);
    
    // 4.监听队列,false:手动消息确认 
    channel.basicConsume("queue1", false,consumer);
    

    工作队列模型

    能者多劳类型,开启手动确认消息

    // 声明队列(此处为消费者,不是声明创建队列,而且获取,二者代码相同)出餐口排队 。已经存在就获取,不存在就创建
    channel.queueDeclare("test_work_queue",false,false,false,null); 
    
    // 可以理解为:快递一个一个送,送完一个再送下一个,速度快的送件就多
    channel.basicQos(1);
    

    避免消费堆积

    • workqueue,多个消费者监听同一个队列

    • 接收到消息后,通过线程池,异步消费

    发布订阅模型

    生成者发送消息给路由,路由转发给队列

    // 路由声明,参数 路由名,路由类型
    channel.exchangeDeclare("test_exechange_fanout","fanout");
    
    

    路由模式

    路由根据类型定向分发消息给队列

    1. 先运行生产者,创建路由器
    2. 再创建Receiver,进行队列绑定
    3. 再次运行sender,发出消息
      /Sender.java/
    // 生产者
    channel.exchangeDeclare("test_exechange_direct","direct");
    // insert路由键
    channel.basicPublish("test_exchange_direct", "insert", null, msg.getBytes());
    

    /Receiver.java/

    // 声明队列
    channel.queueDeclare("test_exchange_direct_queue_1",false,false,false,null); 
    
    // 绑定路由(如果路由键的类型是 添加,删除,修改 的话,绑定到这个队列1上) 
    channel.queueBind("test_exchange_direct_queue_1", "test_exchange_direct", "insert");
    

    通配符模式 topic

    *:只能匹配一个单词
    #:匹配0个或多个单词 
    

    事务机制

    通过信道开启事务

    • channel.txSelect() 开启事务
    • channel.txCommit() 提交事务
    • channel.txRolleback() 回滚事务

    confirm模式

    消息发送失败,采用补发消息完成消息的送达

    过期时间TTL

    队列设置,队列中所有消息有相同的过期时间

    <!--2.重新配置一个队列,同时,对队列中的消息设置过期时间-->
    
    <rabbit:queue name="test_spring_queue_ttl" auto-declare="true"> 
        <rabbit:queue-arguments> 
            <entry key="x-message-ttl" value-type="long" value="5000"></entry> 
        </rabbit:queue-arguments> 
    </rabbit:queue>
    

    对消息设置,每条消息的TTL可以不同(单位毫秒)

    同时设置 队列和消息,时间小的起作用

    死信队列

    消息没有及时消费,消息在队列中变成死信,消息就会绑定到死信交换机,绑定死信交换机的是死信队列

    集群

    搭建集群,之前创建的交换机,队列,用户属于单一结构,在新的集群环境不可用

    集群镜像模式

    将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态一致
    set_policy {name} {pattern} {definition}

    • name:策略名
    • pattern:队列的匹配模式,"^queue_" 表示对队列名称以“queue_”开头的所有 队列进行镜像,而"^"表示匹配所有的队列
    • definition:镜像定义,ha-mode高可用模式,有效值为 all/exactly/nodes,当前策略模式为 all,即复制到所有节点,包含新增节点

    rabbitmqctl set_policy xall "^" '{"ha-mode":"all"}'

    HAProxy

    HAProxy是一款提供高可用性,负载均衡,并且基于TCP和HTTP应用的代理软件

    KeepAlived

    keepalived基于vrrp(Virtual Router Redundancy Protocol,虚拟路由冗余协议)协议,vrrp它 是一种主备(主机和备用机)模式的协议,通过VRRP可以在网络发生故障时透明的进行设备切换 而不影响主机之间的数据通信

    相关文章

      网友评论

          本文标题:Redis & FastDFS & RabbitMQ

          本文链接:https://www.haomeiwen.com/subject/bizemktx.html