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"));
}
}