RabbitMQ 消息确认

接收消息的时候,有两个方式,一个是consume,一个是get,这两个方法都有一个autoAck的参数。当我们设置为true的时候,说明消费者会通过AMQP显示的向rabbitmq发送一个确认,rabbitmq自动视其确认了消息,然后把消息从队列中删除。下面用consume的方式做些例子来理解autoAck的参数设置。

1
2
3
String basicConsume(String queue, boolean autoAck, DeliverCallback deliverCallback, CancelCallback cancelCallback) throws IOException;

GetResponse basicGet(String queue, boolean autoAck) throws IOException;
阅读更多

RabbitMQ 队列

AMQP消息路由必须包含三部分,交换器、队列、绑定。如下图所示,生产者把消息发送给交换器,交换器再路由到符合条件的队列上,最终被消费者接收。绑定决定了消息如何从路由器路由到相应的队列。这一篇,主要是了解一下队列。
image.png

相关概念

当新增队列的时候,需要定义一下4中属性,分布是Name、Durability、Auto delete、Arguments。
image.png

阅读更多

Java基础进阶

1. 基础

1.1. 正确使用 equals 方法

Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

举个例子:

1
2
3
4
5
6
7
// 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常
String str = null;
if (str.equals("SnailClimb")) {
...
} else {
..
}
阅读更多

Redis 集群

Sentinel 是HA(高可用)解决方案, Cluster与客户端分片是sharding(分布式数据库)方案

一. Sentinel模式

  • 什么是哨兵(Sentinel):

    由一个或多个Sentinel实例组成的Sentinel系统可以监视(十秒发送一个INFO心跳)多个主服务器,以及这些主服务器属下的所有从服务器.

    在被监视的主服务器进入下线状态时(因为一个主服务器负责本集群的一个Redis分片/一部分槽),哨兵们会从下线的主服务器属下的从服务器中挑选一个升级为新的主服务器.这个过程也叫故障转移操作.

阅读更多

Redis 实现商品秒杀

项目场景

实现一个商品秒杀的功能,能后台自定义秒杀时间段、商品库存等信息。

一、设计思路

这里简单分享下思路:

1.限流

秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增,由于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。这里使用基于Redis简单粗暴的限流方案:信号量(Semaphore)

阅读更多

Redis 持久化与复制

一.RDB持久化

 将当前数据库状态(当前保存的键值对)做一个快照,生成一个经过压缩的二进制文件,通过该文件可还原到生成RDB文件时的数据库状态.

二.AOF持久化

通过保存Redis服务器所执行的写命令生成AOF文件来记录数据库状态

  • 实现方式:

    1. 命令追加: 执行完一个写命令后,以协议格式将写命令追加到aof_buf缓冲区末尾

阅读更多

Redis 击穿&穿透&雪崩与 Spring Data Redis

一、常见概念

  • 击穿:

    • 概念:redis作为缓存,设置了key的过期时间,key在过期的时候刚好出现并发访问,直接击穿redis,访问数据库

    • 解决方案:使用setnx() ->相当于一把锁,设置的时候,发现设置过期,加锁,只有获得锁的人才可以访问DB,这样就能防止击穿。

    • 逻辑:

      1
      2
      3
      4
      5
      1. get key
      2. setnx
      3. if ok addDB
      else sleep
      go to 1
阅读更多

Redis 单节点容量问题

一、单节点容量问题

我们在实际场景中,往往遇上一个单节点容量问题。

1.进行业务拆分,数据分类

2.到了数据不能拆分的时候,可以进行数据分片

  • 进行哈希取模(影响分布式下的扩展性%3,%4,如果多加一台机器,就会收到影响)
  • 进行逻辑随机(可以放进去,但是拿不出来)
    • 解决方案:两台机器同时存储一个list,然后client直接连2台redis,进行两台一起消费
阅读更多

Redis BloomFilter

Bloom Filter 概念

布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

面试关联:一般都会在回答缓存穿透,或者海量数据去重这个时候引出来,加分项哟

Bloom Filter 原理

布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。

阅读更多