Redission 分布式对象上篇

1,023 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

Redission 分布式对象 上篇

回顾 Redis 基本数据类型

redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型.

5种 数据类型,分别是:String、List、Set、Zset、Hash.

图片.png

Redission 分布式对象

// 测试类
public class RedissionObjectTest {

    public static RedissonClient redisson = null;

    @BeforeAll
    public static void beforeAll(){
        Config config = new Config();
        //此处调用的方法为单节点的redis
        config.useSingleServer().setAddress("redis://localhost:6379");
        redisson = Redisson.create(config);
    }
}

每个Redisson对象实例都会有一个与之对应的Redis数据实例,可以通过调用getName方法来取得Redis数据实例的名称(key)。

@Test
public void test1(){
    // 所有分布式对象都有的方法
    // 获取 key
    RMap map = redisson.getMap("kkey");
    System.out.println(map.getName());
}

通用对象桶(Object Bucket)

RBucket 对象是一种通用对象桶可以用来存放任类型的对象

单个对象操作

  • getBucket 创建对象
  • set 设置值
  • get 获取值
  • trySet 如果成功,则为true;如果已设置元素,则为false
  • compareAndSet 如果成功,则为true;如果实际值不等于预期值,则为false。
  • getAndSet 查询出当前值,并设置为新值
@Test
public void test2(){
    // 创建对象
    RBucket<List<Integer>> object = redisson.getBucket("userIds");
    // 设置值
    object.set(Arrays.asList(1,2));

    //============================
    // 获取分布式对象,可在任意线程或者JVM实例
    RBucket<List<Integer>> userIds = redisson.getBucket("userIds");
    // get 获取值
    List<Integer> integers = userIds.get();
    integers.forEach(System.out::println); // 1 2

    // trySet 如果成功,则为true;如果已设置元素,则为false
    System.out.println(userIds.trySet(Arrays.asList(4, 5))); // false

    // compareAndSet 如果成功,则为true;如果实际值不等于预期值,则为false。
    System.out.println(userIds.compareAndSet(Arrays.asList(2, 3), Arrays.asList(4, 5))); // false
    System.out.println(userIds.compareAndSet(Arrays.asList(1, 2), Arrays.asList(4, 5))); // true

    // getAndSet 查询出当前值,并设置为新值
    System.out.println(userIds.getAndSet(Arrays.asList(5, 6))); // [4,5]
}

多个对象操作

  • getBuckets 批量获取bucket
  • get 批量从buckets 获取 值
  • trySet 利用Redis的事务特性,同时保存所有的通用对象桶,如果任意一个通用对象桶已经存在则放弃保存其他所有数据。要成功全部成功.
  • set 同时保存全部通用对象桶。
@Test
public void test3(){
    RBuckets buckets = redisson.getBuckets();
    // get 批量从buckets 获取 值
    Map<String, Object> stringObjectMap = buckets.get("key1", "key2", "key3");


    // 选择性设置,需要同时设置的值
    Map<String, Object> map = new HashMap<>();
    map.put("key1", new Object());
    map.put("key2", new Object());

    // trySet 利用Redis的事务特性,同时保存所有的通用对象桶,如果任意一个通用对象桶已经存在则放弃保存其他所有数据。
    buckets.trySet(map);
    // set 同时保存全部通用对象桶。
    buckets.set(map);
}

二进制流(Binary Stream)

RBinaryStream对象同时提供了InputStream接口和OutputStream接口的实现。流的最大容量受Redis主节点的内存大小限制。

  • getBinaryStream 获取二进制流对象
  • getInputStream 获取输入流
  • getOutputStream 获取输出流
@Test
public void test4() throws IOException {
    // 1. 设置流
    // set 将流存入redis
    RBinaryStream stream = redisson.getBinaryStream("anyStream");
    byte[] content = "hello RBinaryStream".getBytes();
    stream.set(content);

    // ==============================
    // 2. 获取输入流
    // getInputStream 获取输入流
    RBinaryStream anyStream = redisson.getBinaryStream("anyStream");
    InputStream inputStream = anyStream.getInputStream();
    byte[] readBuffer = new byte[512];
    int read = inputStream.read(readBuffer);
    System.out.println(new String(readBuffer));

    // 3. 获取输出流
    // getOutputStream 获取输出流
    OutputStream outputStream = anyStream.getOutputStream();
    byte[] contentToWrite = "-write".getBytes();
    //  (类似于追加) (最终值 hello RBinaryStream-write)
    outputStream.write(contentToWrite);

    // 4. 获取输入流
    // getInputStream 获取输入流
    RBinaryStream anyStream2 = redisson.getBinaryStream("anyStream");
    InputStream inputStream2 = anyStream2.getInputStream();
    byte[] readBuffer2 = new byte[512];
    int read2 = inputStream2.read(readBuffer2);
    System.out.println(new String(readBuffer2));
}

地理空间对象桶(Geospatial Bucket)

RGeo 对象是一种专门用来储存与地理位置有关的对象桶。

  • getGeo 获取Geo对象
  • dist 计算两点距离
  • pos 按对象映射的地理位置,不存在的对象不返回
  • radius 返回按离圆心距离排序集合的成员,这些成员位于指定区域的边界内(圆内)
  • radiusWithPosition 返回按离圆心距离排序集合的成员和坐标,这些成员位于指定区域的边界内(圆内)
@Test
public void test5() throws IOException {
    // 获取Geo对象 getGeo
    RGeo<String> geo = redisson.getGeo("address");
    // add(new GeoEntry,new GeoEntry) 添加坐标点
    geo.add(new GeoEntry(13.361389, 38.115556, "北京"),
            new GeoEntry(15.087269, 37.502669, "重庆"));

    // dist 计算两点距离
    // GeoUnit.METERS 米
    Double distance = geo.dist("北京", "重庆", GeoUnit.METERS);
    System.out.println(distance + " 米");

    // pos 按对象映射的地理位置,不存在的对象不返回
    System.out.println(geo.pos("test1", "北京", "重庆"));
    // {北京=GeoPosition [longitude=13.361389338970184, latitude=38.1155563954963], 重庆=GeoPosition [longitude=15.087267458438873, latitude=37.50266842333162]}

    // radius 返回按离圆心距离排序集合的成员,这些成员位于指定区域的边界内(圆内)
    List<String> radius = geo.radius(15, 37, 200, GeoUnit.KILOMETERS);
    System.out.println(radius);
    // [北京, 重庆]

    // radiusWithPosition 返回按离圆心距离排序集合的成员和坐标,这些成员位于指定区域的边界内(圆内)
    Map<String, GeoPosition> stringGeoPositionMap = geo.radiusWithPosition(15, 37, 200, GeoUnit.KILOMETERS);
    System.out.println(stringGeoPositionMap);
    // {北京=GeoPosition [longitude=13.361389338970184, latitude=38.1155563954963], 重庆=GeoPosition [longitude=15.087267458438873, latitude=37.50266842333162]}
}

BitSet

RBitSet 对象采用了与java.util.BiteSet类似结构的设计风格。可以理解为它是一个分布式的可伸缩式位向量。需要注意的是RBitSet的大小受Redis限制,最大长度为4 294 967 295

  • getBitSet 获取BitSet
  • set 设置某位
  • clear 清空某一位
  • xor 对该对象和指定的位集执行XOR操作。将结果存储到此对象中(bit1)。
    • 异或 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
    • 如果两个都是null,false;如果一个为null,一个有值,true;
@Test
public void test6() throws IOException {
    // getBitSet 获取BitSet
    RBitSet bit1 = redisson.getBitSet("bit1");

    // set 设置某位
    bit1.set(0, true);
    bit1.set(1, false);
    bit1.set(2, false);

    // clear 清空某一位
    bit1.clear(0);

    RBitSet bit2 = redisson.getBitSet("bit2");
    bit2.set(0, false);
    bit2.set(1, true);
    bit2.set(2, true);

    // xor 对该对象和指定的位集执行XOR操作。将结果存储到此对象中(bit1)。
    // 异或 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。如果两个都是null,false;如果一个为null,一直有值,true;

    bit1.xor("bit2");

    RBitSet bit1xor = redisson.getBitSet("bit1");
    // get 获取某一位的值
    System.out.println(bit1xor.get(0));
    System.out.println(bit1xor.get(1));
    System.out.println(bit1xor.get(2));
}

原子整长形(AtomicLong)

RAtomicLong 对象和Java中的java.util.concurrent.atomic.AtomicLong对象类似。

  • set 设置值
  • incrementAndGet 以原子方式将当前值递增1。
  • get 获取值
@Test
public void test7() throws IOException {
    RAtomicLong atomicLong = redisson.getAtomicLong("atomicLong");

    // set 设置值
    atomicLong.set(3);

    // incrementAndGet 以原子方式将当前值递增1。
    atomicLong.incrementAndGet();

    // get 获取值
    atomicLong.get();
}

原子双精度浮点(AtomicDouble)

分布式原子双精度浮点 RAtomicDouble ,弥补了Java自身的不足。

  • getAndSet 原子设置给定值并返回旧值。
  • addAndGet 将给定值原子地添加到当前值。返回新值.
@Test
public void test8() throws IOException {
    RAtomicDouble atomicDouble = redisson.getAtomicDouble("atomicDouble");
    atomicDouble.set(1);

    // getAndSet 原子设置给定值并返回旧值。
    System.out.println(atomicDouble.getAndSet(2)); // 1

    // addAndGet 将给定值原子地添加到当前值。返回新值.
    System.out.println(atomicDouble.addAndGet(1)); // 3

    Sys