Java驻内存数据网格 Redisson 的使用

Redisson 简单例子

Posted by 壹芝 on January 25, 2018

Java驻内存数据网格 Redisson 的使用

整理自本人的有道历史云笔记

一. Redisson 简介

Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。

二. Maven 依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.11.0</version>
</dependency>

三. 简单例子

1. 初始化
    // redisson初始化
    RedissonClient redisson = Redisson.create();
        
2. 初始化实现,支持单点/主从/sentinel/cluster/
    /**
     * Create sync/async Redisson instance with default config
     *
     * @return Redisson instance
     */
    public static RedissonClient create() {
        Config config = new Config();
        config.useSingleServer()
        .setTimeout(1000000)
        .setAddress("redis://127.0.0.1:6379");
//        config.useMasterSlaveConnection().setMasterAddress("127.0.0.1:6379").addSlaveAddress("127.0.0.1:6389").addSlaveAddress("127.0.0.1:6399");
//        config.useSentinelConnection().setMasterName("mymaster").addSentinelAddress("127.0.0.1:26389", "127.0.0.1:26379");
//        config.useClusterServers().addNodeAddress("127.0.0.1:7000");
        return create(config);
    }
3. 分布式 AtomicLong 例子

    /********************** RAtomicLong AbcAsync **********************/
    RAtomicLong atomicLong = redisson.getAtomicLong("atomic_long");
    // get
    log.info("{}", atomicLong.get());
    // incr decr & get
    log.info("{}", atomicLong.incrementAndGet());
    log.info("{}", atomicLong.decrementAndGet());
    // 获取并增加xxx
    log.info("{}", atomicLong.getAndAdd(12L));
    // xxx Async异步操作
    atomicLong.incrementAndGetAsync();
    
    /**************************** RObject ****************************/
    // 重命名
    atomicLong.renamenx("r_object");
    atomicLong.rename("r_object");
    // 是否存在
    atomicLong.isExists();
    // 内存占用
    atomicLong.sizeInMemory();
    // 移动其他DB
    atomicLong.move(1);
    // 删除
    atomicLong.delete();
    atomicLong.unlink();
    // touch
    atomicLong.touch();
    //  dump & restore
    byte[] dump = atomicLong.dump();
    // atomicLong.restore(xxx);
    
    /*************************** RExpirable ***************************/
    // 过期
    atomicLong.expire(1, TimeUnit.MINUTES);
    atomicLong.expireAt(System.currentTimeMillis() + 200L);
    // 清楚过期
    atomicLong.clearExpire();
4. 分布锁例子(读写锁,可重入锁)
    /******************** RLock RReadWriteLock etc *********************/
    // redisson 锁(默认实现reentrant lock,可重入,非公平)
    RLock lock = redisson.getLock("lock_me");
    // 读锁
    RLock readLock = redisson.getRedLock(lock);
    // 读写锁
    RReadWriteLock readWriteLock = redisson.getReadWriteLock("lock_me");
    // 公平锁
    RLock fairLock = redisson.getFairLock("lock_me");

    // 尝试锁定
    boolean locked = lock.tryLock();
    // 等待锁定
    locked = lock.tryLock(1, TimeUnit.MINUTES);

    if (locked) {
        // do something
        // 释放获取的锁定
        lock.unlock();
    }
    // 强制释放全部锁定
    lock.forceUnlock();

5. 分布式阻塞队列和列表
    /************************ RBlockingQueue etc ************************/
    // RBlockingQueue extends BlockingQueue
    RBlockingQueue<String> blockingQueue = redisson.getBlockingQueue("block_queue");
    blockingQueue.put("abc");
    blockingQueue.offer("123");
    blockingQueue.peek();
    blockingQueue.poll();
    blockingQueue.take();
    
    /************************ RList ************************/
    RList<String> list = redisson.getList("r_list");
    list.add("abc");
    list.add(0, "123");
    list.get(0, 1);
    list.remove("123", 1);
6. 分布式地理位置信息和距离计算

    /******************************* RGeo ******************************/
    // RBlockingQueue extends BlockingQueue
    RGeo<String> geo = redisson.getGeo("china");
    geo.add(120.17, 30.27, "hangzhou");
    geo.add(116.40, 39.91, "beijing");
    log.info("dist {} km", geo.dist("hangzhou", "beijing", GeoUnit.KILOMETERS));

7. 分布式分数排序集合
    /*************************** RScoredSortedSet ************************/
    // RScoredSortedSet
    RScoredSortedSet<String> scoredSortedSet = redisson.getScoredSortedSet("scoreSortSet");
    scoredSortedSet.add(99.5, "Tom");
    scoredSortedSet.add(88.3, "Jerry");
    scoredSortedSet.getScore("Jerry");
8. 分布式布隆过滤器
    /***************************** RBloomFilter **************************/
    // RBloomFilter
    RBloomFilter<String> bloomFilter = redisson.getBloomFilter("bloomFilter");
    // 重置 bloomFilter 初次使用执行一次
    bloomFilter.tryInit(200000, 0.01);

    log.info("{}", bloomFilter.add("key1"));
    log.info("{}", bloomFilter.add("key2"));
    log.info("{}", bloomFilter.contains("key2"));

    // 关闭
    redisson.shutdown();