解决Redis并发带来的雪崩,击穿和穿透问题,以及搭建一个Redis伪集群

2023年1月15日11:55:50

Redis在高并发情况下可能出现的问题

 搭建Redis集群

Redis集群的分类:

1.主从架构(主服务器负责写,从服务器负责读)。

2.哨兵架构(哨兵服务器负责监控主服务器的状态,主服务器如果宕机,将从服务器提升为主)。

 

3.集群架构(并发能力,可用性高于哨兵架构),

一个redis集群包含16384个插槽(hash slot),数据库中的每个键都属于这16384个插槽的其中一个。

集群使用公式:将数据的key进行hash运算,获得保存数据的位置,该位置可能是集群中任意一台服务器。

 搭建Redis伪集群的步骤

真正的集群:每个Redis安装到不同服务器上。

伪集群:在一台机器上安装多个Redis实例。

至少需要多少服务器:

master的选举需要半数以上服务器投票支持,最少需要三台服务器,每台服务器需要有一个备份,最少需要六台服务器。

1)新建redis-cluster目录,新建redis01~redis06六个子目录
cd /usr/local
mkdir redis-cluster
cd redis-cluster
mkdir redis01 
....
2)复制redis/src和redis.conf到redis01~redis06目录中
cd redis
cp -r src/* /usr/local/redis-cluster/redis01
cp reids.conf /usr/local/redis-cluster/redis01
....
3)修改redis.conf
daemonize yes
cluster-enabled yes
port 7001~~~~7006

4)在redis-cluster中创建启动脚本vi start.sh
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..
5)启动redis实例
chmod +x start.sh
./start.sh
6)创建集群
/usr/local/redis/src/redis-cli --cluster create 192.168.52.3:7001 192.168.52.3:7002 192.168.52.3:7003 192.168.52.3:7004 192.168.52.3:7005 192.168.52.3:7006 --cluster-replicas 1
7)访问集群
/usr/local/redis/src/redis-cli -h 192.168.223.223 -c -p 7001

布隆过滤器

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

特点:判断存在的数据不一定存在,判断不存在的数据一定不存在。

 

 

Redis本身就支持布隆过滤器的实现

Redission工具库,提供了基于Redis实现分布式工具,如:分布式锁、布隆过滤器、分布式原子类等。

添加依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.17.0</version>
        </dependency>

配置类

@Configuration
public class RedissonConfig {

    @Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        config.setTransportMode(TransportMode.NIO);
        SingleServerConfig singleServerConfig = config.useSingleServer();
        //可以用"rediss://"来启用SSL连接
        singleServerConfig.setAddress("redis://127.0.0.1:6379");
//        singleServerConfig.setPassword("123456");
        RedissonClient redisson = Redisson.create(config);

        return redisson;
    }
}

测试类

@SpringBootTest
class RedisdemoApplicationTests {

    @Autowired
    private RedissonClient client;

    @Test
    void contextLoads() {
        //创建布隆过滤器
        RBloomFilter<String> bloom = client.getBloomFilter("bloom-filter");
        //初始化,参数1 序列长度  识别误差率
        bloom.tryInit(10000000L,0.03);
        //添加数据到过滤器
        bloom.add("hello");
        bloom.add("world");
        bloom.add("app");
        //判断过滤器中是否存在该值
        System.out.println(bloom.contains("hello"));
        System.out.println(bloom.contains("world"));
        System.out.println(bloom.contains("java"));
    }

}

  • 作者:吃小露丸子。
  • 原文链接:https://blog.csdn.net/weixin_50519232/article/details/126255630
    更新时间:2023年1月15日11:55:50 ,共 2611 字。