- 9.2.2. 使用方法
9.2.2. 使用方法
Redisson为分布式实时对象提供了一系列不同功能的注解,其中@REntity和@RId两个注解是分布式实时对象的必要条件。
@REntitypublic class MyObject {@RIdprivate String id;@RIndexprivate String value;private MyObject parent;public MyObject(String id) {this.id = id;}public MyObject() {}// getters and setters}
在开始使用分布式实时对象以前,需要先通过Redisson服务将指定的对象连接(attach),合并(merge)或持久化(persist)到Redis里。
RLiveObjectService service = redisson.getLiveObjectService();MyLiveObject myObject = new MyLiveObject();myObject.setId("1");// 将myObject对象当前的状态持久化到Redis里并与之保持同步。myObject = service.persist(myObject);MyLiveObject myObject = new MyLiveObject("1");// 抛弃myObject对象当前的状态,并与Redis里的数据建立连接并保持同步。myObject = service.attach(myObject);MyLiveObject myObject = new MyLiveObject();myObject.setId("1");// 将myObject对象当前的状态与Redis里的数据合并之后与之保持同步。myObject = service.merge(myObject);myObject.setValue("somevalue");// 通过ID获取分布式实时对象MyLiveObject myObject = service.get(MyLiveObject.class, "1");// 通过索引查找分布式实时对象Collection<MyLiveObject> myObjects = service.find(MyLiveObject.class, Conditions.in("value", "somevalue", "somevalue2"));Collection<MyLiveObject> myObjects = service.find(MyLiveObject.class, Conditions.and(Conditions.in("value", "somevalue", "somevalue2"), Conditions.eq("secondfield", "test")));
“parent”字段中包含了指向到另一个分布式实时对象的引用,它可以与包含类是同一类型也可以不同。Redisson内部采用了与Java的引用类似的方式保存这个关系,而非将全部对象序列化,可视为与普通的引用同等效果。
//RLO对象:MyObject myObject = service.get(MyObject.class, "1");MyObject myParentObject = service.get(MyObject.class, "2");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类同时实现了Deque,List和Queue,由于Deque排在靠上的位置,因此它将会被转换成一个RedissonDeque类型。
Redisson的分布式对象也采用类似的方式,将自身的状态储存于Redis当中,(几乎^)所有的状态改变都直接映射到Redis里,不在本地JVM中保留任何赋值。(^本地缓存对象除外,比如RLocalCachedMap)
