Redis之整合Redission并实现分布锁和布隆过滤器

一、引入Redisson依赖
redisson-spring-data与Spring Boot version的版本对应关系
redisson-spring-data module nameSpring Boot version
redisson-spring-data-161.3.x
redisson-spring-data-171.4.x
redisson-spring-data-181.5.x
redisson-spring-data-202.0.x
redisson-spring-data-212.1.x
redisson-spring-data-222.2.x
redisson-spring-data-232.3.x
redisson-spring-data-242.4.x
 <!-- https://mvnrepository.com/artifact/org.redisson/redisson-spring-boot-starter -->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.17.1</version>
        </dependency>
查看redisson-spring-data module name

Ctrl+左键点击redisson-spring-boot-starter进去

org.redisson
redisson-spring-data-26
${project.version}

二、配置Redisson文件
第一种、配置conf文件(我使用的)
@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://192.168.221.128:6379");
        singleServerConfig.setPassword("123456");
        RedissonClient redisson = Redisson.create(config);
        return redisson;
    }
}
第二种、yaml方式
spring:
  application:
    name: springboot-redisson
  redis:
    redisson:
      config: |
        singleServerConfig:
          password: 123456
          address: "redis://127.0.0.1:6379"
          database: 1
        threads: 0
        nettyThreads: 0
        codec: !<org.redisson.codec.FstCodec> {}
        transportMode: "NIO"
​
server:
  port: 9888
三、测试
@SpringBootTest
class RedisTest01ApplicationTests {
    @Resource
    RedissonClient redissonClient;
    @Test
    void contextLoads() {
​
        redissonClient.getBucket("hello").set("bug");
        String test = (String) redissonClient.getBucket("hello").get();
        System.out.println(test);
​
    }
}

结果:

四、使用Redisson分布式锁

注意:这里 RedissonRedissonClient 都可以实现分布式锁

  @Resource
    RedissonClient redissonClient;
    @Test
    void contextLoads() {
​
        RLock lock = redissonClient.getLock("lockKey"); //获取锁
        lock.lock(); //加锁,注射性等待。默认加的锁的时间是30s。
        // 1)、锁自动续期,如果业务时间超长,运行期间自动给锁续上新的30s.
        // 2)、加锁的业务只要运行完成,就不会给当前锁续期,即使不手动解锁,锁默认在30s以后删除
​
​
​
        // 加锁以后10秒钟自动解锁
        // 无需调用unlock方法手动解锁
        // lock.lock(10, TimeUnit.SECONDS);
​
​
        // 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
        // boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
        try {
            // redis操作.
        } finally {
            lock.unlock(); // 释放锁
        }
    }
! ! ! 注意: 分布式锁不能和事务一起使用

原因:

由于事务不可见的特性,在当前事务完成过程中其他线程读取到数据库的值其实还是未操作的数据(就是你释放了锁但事务还未提交,其他线程拿到锁之后获取的数据是未提交的数据),从而导致数据重复。

五、使用Redisson实现的布隆过滤器

布隆过滤器主要解决缓存穿透问题

注意:这里 RedissonRedissonClient 都可以实现布隆过滤器

@SpringBootTest
class RedisTest01ApplicationTests {
    @Resource
    RedisTemplate<String,Object> redisTemplate;
    @Resource
    RedissonClient redissonClient;
    @Test
    void contextLoads() {
​
        RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("test");
        //初始化布隆过滤器:预计元素为100000000L,误差率为3%
        bloomFilter.tryInit(1000000L,0.03);
        //将10000插入到布隆过滤器中
        bloomFilter.add("10000");
​
        //判断下面号码是否在布隆过滤器中
        //false
        System.out.println(bloomFilter.contains("9999"));
        //true
        System.out.println(bloomFilter.contains("10000"));
​
    }
​
}

注意:选择 较低的误差率较大的预计元素 会增加布隆过滤器的内存消耗和查询时间。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值