Redis高级特性

Redis 高级特性

IO 多路复用

分布式锁

单 Redis 实例做分布式锁(setnx)

这里的单 Redis 实例并不是指单机版的 Redis,这里可以是 Redis 集群,也可以是 Redis 主从哨兵。之所以称之为单Redis实例分布式锁,是因为只主动在一个 Redis节点上添加分布式锁,而锁的复制是通过 Redis 的主从复制被动进行的。这样可能存在锁的单点故障问题,例如:

某个线程在 master 节点(A)上成功添加分布式锁(即 Redis 数据库中添加了一个key),在节点 A 将该分布式锁同步到其它 slave 节点(B)前,A 节点发生故障,此时 B 节点称为新的 master 节点,但是此时 B 节点中并没有这把分布式锁。那其它的线程接着请求该锁时,B 节点会为其它线程分配锁,此时整个系统中存在两个线程拥有同一把锁,因此锁失效。

多 Redis 实例做分布式锁(Redisson)

使用案例

  1. 引入 pom 依赖

    <dependency>
        <groupId>org.redisson</groupId>
        <artifactId>redisson</artifactId>
        <version>3.20.1</version>
    </dependency>
  2. RedisConfig 配置类中注入一个 Redisson 对象

    @Bean
    public Redisson redisson() {
        Config config = new Config();
        config.useClusterServers()
            .addNodeAddress("redis://hadoop002:6379", "redis://hadoop002:6380");
        return (Redisson) Redisson.create(config);
    }

Reddisson 源码解析

  • 默认过期时间为 30 s
  • WatchDog 的执行间隔是 1/3 个过期时间间隔,即 10 s

布隆过滤器

应用场景:

共有50亿个电话号码,现有10万个电话号码,如何快速准确地判断这些电话号码是否存在?

安全连接网址,全球数10亿的网址判断

黑名单校验,识别垃圾邮件

白名单校验,识别出合法用户进行后续处理

布隆过滤器是一种空间效率高、判定效率高的数据结构,主要用于检索一个元素是否在一个集合中。它是一个长向量(位数组)和一系列随机映射函数的组合。

布隆过滤器的基本思想是对于一个集合中的每个元素,将其通过 K 个哈希函数映射到一个位数组中的 K 个位置上,并将这些位置置为 1。判断一个元素是否在集合中时,只需要看一下这 K 个位置是否都为 1 即可。

由于布隆过滤器对于存在和不存在的元素都有一定的误判率,因此它适合于那些可以容忍一定误判率的场景,比如黑名单过滤、URL去重等。

布隆过滤器的优点是空间利用率高、判定效率高,而缺点是存在一定的误判率,且难以删除元素。

误判的原因:布隆过滤器会将数据通过 K 个哈希函数进行映射,如果 K 个哈希映射都能够找到,则认为该数据存在。这种确定一个数据是否存在的方式是不精确的,可能将原本不存在的数据误判为存在。即布隆过滤器判断为真的数据未必为真,布隆过滤器判断为假的数据必定为假(存在假阳现象,不存在假阴现象)。

事务

在加入事务队列的时候发现命令错误,则队列中的全部命令都不会执行。(类似于编译错误)

事务队列中的命令在执行时才发现错误,则跳过错误命令,其他命令执行。(类似于运行时错误)


   转载规则


《Redis高级特性》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录