回顾 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();
config.useSingleServer().setAddress("redis://localhost:6379");
redisson = Redisson.create(config);
每个Redisson对象实例都会有一个与之对应的Redis数据实例,可以通过调用getName
方法来取得Redis数据实例的名称(key)。
@Test
public void test1(){
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));
RBucket<List<Integer>> userIds = redisson.getBucket("userIds");
List<Integer> integers = userIds.get();
integers.forEach(System.out::println);
System.out.println(userIds.trySet(Arrays.asList(4, 5)));
System.out.println(userIds.compareAndSet(Arrays.asList(2, 3), Arrays.asList(4, 5)));
System.out.println(userIds.compareAndSet(Arrays.asList(1, 2), Arrays.asList(4, 5)));
System.out.println(userIds.getAndSet(Arrays.asList(5, 6)));
多个对象操作
getBuckets
批量获取bucket
get
批量从buckets 获取 值
trySet
利用Redis的事务特性,同时保存所有的通用对象桶,如果任意一个通用对象桶已经存在则放弃保存其他所有数据。要成功全部成功.
set
同时保存全部通用对象桶。
@Test
public void test3(){
RBuckets buckets = redisson.getBuckets();
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());
buckets.trySet(map);
buckets.set(map);
二进制流(Binary Stream)
RBinaryStream对象同时提供了InputStream
接口和OutputStream
接口的实现。流的最大容量受Redis主节点的内存大小限制。
getBinaryStream
获取二进制流对象
getInputStream
获取输入流
getOutputStream
获取输出流
@Test
public void test4() throws IOException {
RBinaryStream stream = redisson.getBinaryStream("anyStream");
byte[] content = "hello RBinaryStream".getBytes();
stream.set(content);
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));
OutputStream outputStream = anyStream.getOutputStream();
byte[] contentToWrite = "-write".getBytes();
outputStream.write(contentToWrite);
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 {
RGeo<String> geo = redisson.getGeo("address");
geo.add(new GeoEntry(13.361389, 38.115556, "北京"),
new GeoEntry(15.087269, 37.502669, "重庆"));
Double distance = geo.dist("北京", "重庆", GeoUnit.METERS);
System.out.println(distance + " 米");
System.out.println(geo.pos("test1", "北京", "重庆"));
List<String> radius = geo.radius(15, 37, 200, GeoUnit.KILOMETERS);
System.out.println(radius);
Map<String, GeoPosition> stringGeoPositionMap = geo.radiusWithPosition(15, 37, 200, GeoUnit.KILOMETERS);
System.out.println(stringGeoPositionMap);
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 {
RBitSet bit1 = redisson.getBitSet("bit1");
bit1.set(0, true);
bit1.set(1, false);
bit1.set(2, false);
bit1.clear(0);
RBitSet bit2 = redisson.getBitSet("bit2");
bit2.set(0, false);
bit2.set(1, true);
bit2.set(2, true);
bit1.xor("bit2");
RBitSet bit1xor = redisson.getBitSet("bit1");
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");
atomicLong.set(3);
atomicLong.incrementAndGet();
atomicLong.get();
原子双精度浮点(AtomicDouble)
分布式原子双精度浮点 RAtomicDouble ,弥补了Java自身的不足。
getAndSet
原子设置给定值并返回旧值。
addAndGet
将给定值原子地添加到当前值。返回新值.
@Test
public void test8() throws IOException {
RAtomicDouble atomicDouble = redisson.getAtomicDouble("atomicDouble");
atomicDouble.set(1);
System.out.println(atomicDouble.getAndSet(2));
System.out.println(atomicDouble.addAndGet(1));
复制代码