9.2.2. 使用方法

Redisson为分布式实时对象提供了一系列不同功能的注解,其中@REntity@RId两个注解是分布式实时对象的必要条件。

  1. @REntity
  2. public class MyObject {
  3. @RId
  4. private String id;
  5. @RIndex
  6. private String value;
  7. private MyObject parent;
  8. public MyObject(String id) {
  9. this.id = id;
  10. }
  11. public MyObject() {
  12. }
  13. // getters and setters
  14. }

在开始使用分布式实时对象以前,需要先通过Redisson服务将指定的对象连接(attach)合并(merge)持久化(persist)到Redis里。

  1. RLiveObjectService service = redisson.getLiveObjectService();
  2. MyLiveObject myObject = new MyLiveObject();
  3. myObject.setId("1");
  4. // 将myObject对象当前的状态持久化到Redis里并与之保持同步。
  5. myObject = service.persist(myObject);
  6. MyLiveObject myObject = new MyLiveObject("1");
  7. // 抛弃myObject对象当前的状态,并与Redis里的数据建立连接并保持同步。
  8. myObject = service.attach(myObject);
  9. MyLiveObject myObject = new MyLiveObject();
  10. myObject.setId("1");
  11. // 将myObject对象当前的状态与Redis里的数据合并之后与之保持同步。
  12. myObject = service.merge(myObject);
  13. myObject.setValue("somevalue");
  14. // 通过ID获取分布式实时对象
  15. MyLiveObject myObject = service.get(MyLiveObject.class, "1");
  16. // 通过索引查找分布式实时对象
  17. Collection<MyLiveObject> myObjects = service.find(MyLiveObject.class, Conditions.in("value", "somevalue", "somevalue2"));
  18. Collection<MyLiveObject> myObjects = service.find(MyLiveObject.class, Conditions.and(Conditions.in("value", "somevalue", "somevalue2"), Conditions.eq("secondfield", "test")));

“parent”字段中包含了指向到另一个分布式实时对象的引用,它可以与包含类是同一类型也可以不同。Redisson内部采用了与Java的引用类似的方式保存这个关系,而非将全部对象序列化,可视为与普通的引用同等效果。

  1. //RLO对象:
  2. MyObject myObject = service.get(MyObject.class, "1");
  3. MyObject myParentObject = service.get(MyObject.class, "2");
  4. myObject.setValue(myParentObject);

RLO的字段类型基本上无限制,可以是任何类型。比如Java util包里的集合类,Map类等,也可以是自定义的对象。只要指定的编码解码器能够对其进行编码和解码操作便可。关于编码解码器的详细信息请查阅高级使用方法章节。

尽管RLO的字段类型基本上无限制,个别类型还是受限。注解了RId的字段类型不能是数组类(Array),比如int[]long[]double[]byte[]等等。更多关于限制有关的介绍和原理解释请查阅使用限制 章节。

为了保证RLO的用法和普通Java对象的用法尽可能一直,Redisson分布式实时对象服务自动将以下普通Java对象转换成与之匹配的Redisson分布式对象RObject

普通Java类 转换后的Redisson类
SortedSet.class RedissonSortedSet.class
Set.class RedissonSet.class
ConcurrentMap.class RedissonMap.class
Map.class RedissonMap.class
BlockingDeque.class RedissonBlockingDeque.class
Deque.class RedissonDeque.class
BlockingQueue.class RedissonBlockingQueue.class
Queue.class RedissonQueue.class
List.class RedissonList.class

类型转换将按照从上至下的顺序匹配类型,例如LinkedList类同时实现了DequeListQueue,由于Deque排在靠上的位置,因此它将会被转换成一个RedissonDeque类型。

Redisson的分布式对象也采用类似的方式,将自身的状态储存于Redis当中,(几乎^)所有的状态改变都直接映射到Redis里,不在本地JVM中保留任何赋值。(^本地缓存对象除外,比如RLocalCachedMap