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亿 条用户数据,现在查询用户要去数据库中查,效率低而且数据库压力大,所以我们会把请 求首先在 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函数越多。