消息队列和缓存的初步了解

负载均衡

消息队列message queue

消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。

queue实现了负载均衡,将producer生产的消息发送到消息队列中,由多个消费者消费。但一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有一个可用的消费者。
topic实现了发布和订阅,当你发布一个消息,所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到一个消息的拷贝。

  • RocketMQ 阿里开源,多用于订单交易系统
  • RabbitMQ
  • Redis 也是一个轻量级的消息队列,它本身也支持MQ的功能

Nginx 负载均衡

客户端向服务器发送一个请求,nginx先进行接收,然后将接收的请求平均分配给集群(多台服务器)来进行处理,减少服务器压力(IO压力)
缓存数据库:减少io的读操作

  • 多台服务器如何做到数据同步的问题?
  • 四种方式(减少cpu和内存的压力)
    1. 存入cookie中,不安全,客户端关闭就没了,网络负担效率低
    2. 复制session,浪费资源,操作冗余,服务器节点越多浪费越大
    3. 存入缓存数据库中,完全在内存中,速度快,数据结构简单
    4. 存在文件服务器或者数据库中,会导致大量的io操作

Memcached

  • nosql数据库,里面存储的数据只能是字符串
  • 数据是存在服务器上的,一关机就没了

redis

redis的安装

原子性 不是事务的原子性:所谓原子操作是指不会被线程调度机制打断的操作。 他们是单线程操作的,不会互相影响

端口 6379 Merz 9键上的位置

使用xshell

  • 查看配置 vi redis.conf
    1. 找到 #bind 注掉 不然只能本机访问
    2. protected-mode yes 改成 no 不然也只能本地访问
    3. 然后重启
  • redis-cli 登录
  • redis常用命令(百度一下)
  • clear 清空xshell窗口内容

他的储存只支持字节 byte,不支持bit

订阅和发布

  • 发布/订阅(pub/sub)
  • 多个redis客户端可订阅一个频道
  • redis一个频道发布消息所有订阅的客户端都可以收到
  • 订阅和发布的两个指令(百度一下。)

Jedis对象

这个对象才是在java程序中真正控制redis的对象
增删改查都是通过jedis对象 '.' 方法来进行操作

  • 需要引入 jedis 依赖
//创建Jedis对象
Jedis jedis = new Jedis( host: "192.168.44.168",port: 6379);
jedis.zadd( key: " china", score: 100d,member: "shanghai");

Set<String> china = jedis.zrange( key: "china",start: 0,stop: -1) ;
System.out.println(china) ;
jedis.close();

生成验证码

Random类

Random random = new Random();
StringBuilder code = "";
for(6次){
	code += random.nextInt(10);
}

Spring整合redis

  1. 导入两个依赖
    • spring-boot-starter-data-redis
    • commons-pool2
    • 记得引入web的启动器
  2. 配置文件中 配置redis的基本信息
  3. 添加redis的配置类
  4. 自动装配 已注入的Bean RedisTemplate redisTemplate
    • 此时可以;联想到JDBCTemplate
  5. 使用redisTemplate 取值存值操作(百度一下)
    • redisTemplate .opsForValue().set(key,value)
    • redisTemplate .opsForValue().get(key)
  6. 可以自己封装一个redis的常用操作工具类

其他有关redis的内容请跳转

【尚硅谷】Redis 6 入门到精通 超详细 教程_哔哩哔哩_bilibili

串行

串行就是一步一步执行,一个一个执行
例如你吃羊肉串 一坨接一坨肉,你从第一个吃到最后一个

Memcached和redis的区别

  • Memcached 多线程+锁

  • redis 单线程+多路io

    • 其他人等一个人去请求数据
    • 一个请求完再进行下一个人
  • Redis采用单线程+多路IO复用技术

  • 多路复用指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就位,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启用线程执行(比如使用线程池)、

  • 就是说多路IO复用起到一个监视的效果,就绪后,Redis直接执行,不需要等待

  • 串行与采用多线程+锁(Memcached)与单线程+多路IO复用的比较

  • 串行:阻塞IO,一件事一件事的做,在做当前事时,不能做其他事,有等待

  • 采用多线程+锁:非阻塞IO,一直重复做当前的事,没有等待

  • 单线程+多路IO复用:做某件事情需要一定的时间,可以监视这件事,我们可以做其他的事。多路IO复用有select,poll,epoll这些模式。select监测数量能力有限。poll监测数量没有限制,但是需要一个一个核查。配epoll监测数量没有限制,也不需要一个一个核查,直接看是否有一个正确的标识。

posted @ 2022-07-06 17:46  没有烦恼的猫猫  阅读(818)  评论(0编辑  收藏  举报