相关文章推荐
英姿勃勃的火柴  ·  MySQL 中提取 JSON ...·  2 月前    · 
善良的凉面  ·  PP-LCNet: ...·  9 月前    · 
还单身的苦瓜  ·  python selenium 循环 ...·  10 月前    · 
寂寞的筷子  ·  java 递归解析json-掘金·  11 月前    · 
谦逊的盒饭  ·  Electron ...·  1 年前    · 

回顾 Redis 基本数据类型

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

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

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
    复制代码
    分类:
    后端