# rojo
原是github上的一个开源项目[rojo](https://github.com/giulio/rojo),本作进行了重构
使得它更加高效,功能上也更完善。
## 问题
使用redis的java客户端jedis的时候需要操作一系列key,保存某个对象的时候,需要把一个
个属性组合为key,然后set到redis,较繁琐。
## 解决方案
rojo是为了简化对象持久化到redis时的操作的,它提供了几个运行时解析的annotation来做
这件事情,把用户从设计对象属性的各种key的繁重劳作中解脱出来,而把精力主要放在对象
模型的设计上。
## 使用
直接上代码:
```java
@Entity
public class BaseEntity {
@Id(Generator = "common::id")
private long id;
@Value(unique = true)
private String name;
public long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
这个BaseEntity使用了几个annotation。Entity表示此对象可被持久化到redis;Id指定了此类
对象的唯一id,Id拥有Generator属性,用来定制id生成策略,默认为空字符串,表示需要用户自行
管理id。@Id(Generator = "common::id")表示使用common::id这个redis的自增长key来自动生成id
Value这个annotation可标注于基本类型(byte、short、int、long、float、double、String)
的属性上,以及元素为基本类型的集合(Collection、List、Set)以及Map属性上。
Value拥有几个重要是属性。当被标注的属性为基本类型时,可以指定它的unique为true(默认false)
以表达被标注属性的唯一性,比如BaseEntity的name属性就是唯一的,当持久化BaseEntity时,会
查看是否已经有一个与此对象相同(equal)的name属性的BaseEntity存在,如存在则持久化失败
下面再看另一个Entity。
```java
@Entity(Cache=true)
public class TestEntity extends BaseEntity {
@Value
private List<String> list;
@Value
private Set<Float> set;
@Value
private Map<String, Integer> map;
@Value(sort = true, bigFirst = true, size = 100)
private int age;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setMap(Map<String, Integer> map) {
this.map = map;
}
public Map<String, Integer> getMap() {
return map;
}
public void setSet(Set<Float> set) {
this.set = set;
}
public Set<Float> getSet() {
return set;
}
public List<String> getList() {
return list;
}
public void setList(List<String> strings) {
this.list = strings;
}
}
```
这个TestEntity是继承自BaseEntity,因此id和name与BaseEntity相同不在赘述。此外此类
拥有list、set、map和age四个属性,list、set、map分别是元素类型为基本类型的集合类,也
在上面曾提过不赘述。看一下age这个属性,标注的Value注解拥有三个属性:sort、bigFirst、
size,用来表达持久化时按照此属性值排序到一个有序列表里面;sort为true表明需要排序,
bigFirst指定排序是按照从大到小的顺序,size指明排序列表的总长度(此例中排序列表长100)
看一下如何持久化TestEntity到redis:
```
Jedis je = new Jedis("localhost", 6379);
je.auth("4swardsman");
je.ping();
je.flushAll();
Repository re = new Repository(je);
```
首先就是创建一个Repository(指定Jedis对象)。很简单。
```java
TestEntity ss = new TestEntity();
ss.setName("test" + i);
ss.setAge(i);
List<String> l = new ArrayList<String>();
l.add("fd");
l.add("akjl;sfd");
ss.setList(l);
Map<String, Integer> map = new HashMap<String, Integer>();
ss.setMap(map);
map.put("a", 1);
map.put("b", 2);
re.writeAndFlush(ss);
```
以上就是初始化一个TestEntity并设置好各属性,最后调用Repository的writeAndFlush
方法写入redis。如果写入成功,返回的long值就是ss对象的id(>0)并且ss的id属性会被正确
赋值;如果失败则返回值<=0
ss = re.get(TestEntity.class, ss.getId());
调用Repository的get方法(指定类型和id)则加载对应此id的TestEntity对象。
此外Repository还有其他几个重要方法:long write(Object entity) 写入对象但不立即flush
一般用于批量保存对象,多个对象写入后,再调用一次flush,会大大提高写入效率;boolean write(Class claz, long id, String p, Object v)
此方法用来更新对象的某个属性但不会立即flush;<T> T get(Class<T> claz, long id, String p)方法
可用于获取对象的单个属性;void delete(Class claz, long id) 方法用于删除对象;
List<Long> rank(Class claz, String p, long start, long end)方法用于获取排名列表。
另外值得一提的还有缓存机制(Entity注释的Cache属性为true则开启缓存),当写入和获取一个对象后,
此对象会立即进入缓存,以便于下次获取时,有更好的效率。
坐标:
```xml
<dependency>
<groupId>org.beykery</groupId>
<artifactId>rojo</artifactId>
<version>1.1.4</version>
</dependency>
```
## 结语
enjoy it.
野生的狒狒
- 粉丝: 3397
- 资源: 2437
最新资源
- 2024毕业设计-基于区块链的医疗信息管理系统含论文报告-最新开发.zip
- 2024全球AI创新大赛无人机双光目标检测实战案例(第4名作品).zip
- AGV调度系统的仿真平台(含源码+项目说明+实验结果分析).zip
- AI图像处理工具包-一键抠图、背景切换、旧照片修复、人像漫画化、视频卡通化(Python+OpenCV+Dlib+TensorFlow).zip
- Android恶意软件检测模型-基于机器学习(含源码+项目说明+设计报告).zip
- Ansible部署Kubernetes集群支持多种特定功能StaticPod模式操作手册.zip
- API开放平台-Java开发基于微服务架构的完整解决方案(含源码).zip
- Bilibili数据爬取与分析实战源码+设计报告(Python+Scrapy+LSTM时间序列预测).zip
- ARIMA+Transformer+LSTM心跳时间序列预测模型源码+设计文档(课设新开发项目).zip
- ArcEngine二次开发的专题图自动生成系统(含源码+说明文档+设计报告等全部资料).zip
- BleiData OAG-WholsWho消歧参赛冠军源码.zip
- C++实现腾讯云游长城滑块验证位置计算方法(数学取点法).zip
- C++和Qt开发的五子棋博弈游戏-极大极小搜索+剪枝算法(含设计报告).zip
- CRF与Embedding-Bi-LSTM-CRF医疗数据命名实体识别系统(源码+论文报告).zip
- CCF大数据汽车行业情感分析源码+全部参赛资料.zip
- CCF-BCDI大赛OCR身份证提取冠军源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈