持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
Redission 分布式对象 上篇
回顾 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;如果已设置元素,则为falsecompareAndSet如果成功,则为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批量获取bucketget批量从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获取BitSetset设置某位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