• 9.2.2. 使用方法

    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