Redisson简单学习

  • Post author:
  • Post category:其他


Redisson项目官方地址

https://github.com/redisson/redisson



简述

Redisson 不只是一个 Java Redis 客户端,可以处理

java.util.List

,

java.util.Map

,

java.util.Set

,

java.util.concurrent.locks.Lock

等对象

每个 Redis 服务器实例最多可处理 1TB 内存。

基于

Netty

框架。

Redis

2.8+ 和 JDK 1.6+ 兼容性。 特别快

这里主要介绍一下,常见几种数据类型的使用



Redisson分布式对象



key

每个 Redisson 对象都绑定到一个 Redis 键(即对象名称),且可以通过

getName

方法读取。

RBucket<Long> rBucket = redisson.getBucket("bucket");
rBucket.getName()   

-----------------------------
输出  bucket



allkeys

所有和redis 键相关的操作都被抽象到 Rkeys 接口中:

RKeys keys = redisson.getKeys();

//常见api
Iterable<String> allKeys = keys.getKeys();   //获取keys的迭代器

long count = keys.count()    //获取总key的数量

long removeKeys = keys.delete("key1","key2","key3");   //移除key的数量



RBucket

可用作

任意类型

对象的通用容器:


作用:桶存储单个对象,提供了原子替换功能,可在高并发场景下进行更新操作

相关接口

public interface RBucket<V> extends RExpirable, RBucketAsync<V> {
 
    void set(V var1);  //设置桶存储的对象
    void set(V var1, long var2, TimeUnit var4);  //设置桶存储的对象,设置操作的超时时间var2
 
    boolean trySet(V var1);  //尝试设置桶的新值
    boolean trySet(V var1, long var2, TimeUnit var4);  //尝试设置桶的新值,设置超时时间var2
 
    boolean compareAndSet(V var1, V var2); //原子替换桶的新值为var2
 
    long size();       //桶存储对象的大小
 
    V get();           //返回桶存储的对象
    V getAndDelete();  //返回并删除桶存储的对象
 
    V getAndSet(V var1);//返回桶的旧值,设置新值
    V getAndSet(V var1, long var2, TimeUnit var4);  //返回桶的旧值,设置新值,设置操作的超时时间var2



RBitSet

redisson提供的操作 redis位运算的对象。

RBitSet bitSet = redisson.getBitSet("bitset");

bitSet.set(1, true);
bitSet.set(2, true);
bitSet.set(3, true);
bitSet.set(4, false);
bitSet.set(5, false);
bitSet.set(6, true);

bitSet.cardinality()   // 输出4,即可以统计true的个数,这个可以用来常见的打卡操作,高峰期用redis做key,每天一位,打卡了存1
  
  
bitSet.clear(1);   //清除
bitSet.xor("anotherBitset");     //和另一个对象异或



AtomicLong

原子类型的Long,可做为分布式 id 生成器,提供原子操作

下面方法基本见名知意

public interface RAtomicLong extends RExpirable, RAtomicLongAsync {

    long getAndDecrement();      //获取当前值,并减 1

    long addAndGet(long delta);  // 添加 并取值  
 
    boolean compareAndSet(long expect, long update);   //以cas线程安全方式修改, 只有当预期值和当前值相等,才会修改成功
 
    long decrementAndGet();  //先减1然后取值

    long get();       

    long getAndDelete();
    
    long getAndAdd(long delta);

    long getAndSet(long newValue);

    long incrementAndGet();

    long getAndIncrement();

    void set(long newValue);

}

同样的还有

RAtomicDouble

下面看两个比较有意思的数据类型



RHyperLogLog

说道这个类型,我们来说一下Page Views(PV) 和 User View(UV), 通常一个网站在统计浏览量的时候统计的是PV,但是想微信公众号这类是统计的UV, 如果瞬间阅读量激增,还是考虑放缓存里。

这种可以不用展示谁阅读了,完全可以用 HyperLogLog, 添加过程中可以自动去重。 但是会有一定误差

这里以一个文章为key,不断的增加UserId

RHyperLogLog rHyperLogLog = redisson.getHyperLogLog("name");

rHyperLogLog.add(userId1);
rHyperLogLog.add(userId2);

rHyperLogLog.count()   //统计数量    这里是2

这个是热点微博、文章峰值阅读的利器

布隆过滤器 BloomFilter

布隆过滤器是用多个hash函数,将内容存储到哈希表里,原理可以自行了解下。

可以快速判断出某个值存不存在,如果返回false,那么一定不存在。 如果返回true,可能存在。

应用场景:

  1. 推送去重

  2. 应对缓存击穿,假设我有 1亿 条用户数据,现在查询用户要去数据库中查,效率低而且数据库压力大,所以我们会把请 求首先在 Redis 中布隆过滤器中处理(活跃用户存在 Redis 中),过滤器中没有的用户,肯定是不存在的,过滤器中有的,再去数据库中查询。

RBloomFilter<SomeObject> bloomFilter = redisson.getBloomFilter("bloom");
// initialize bloom filter with 
// expectedInsertions = 55000000
// falseProbability = 0.03
bloomFilter.tryInit(55000000L, 0.03);         //预期数量总数,  误差率
bloomFilter.add(new SomeObject("field1Value", "field2Value"));
bloomFilter.add(new SomeObject("field5Value", "field8Value"));
bloomFilter.contains(new SomeObject("field1Value", "field8Value"));

误差率越低,要求的hash函数越多。



版权声明:本文为leige07112033原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。