Redkale 功能
- Redkale虽然不到1M大小,但是麻雀虽小五脏俱全。既可作为服务器使用,也可当工具包使用。作为独立的工具包提供以下功能:
+
Redkale虽然只有1M左右大小,但是麻雀虽小五脏俱全。既可作为服务器使用,也可当工具包使用。作为独立的工具包提供以下功能:
1、convert包提供JSON的序列化和反序列化功能,类似Gson、Jackson。
2、convert包提供Java对象二进制的序列化和反序列化功能,类似Protobuf。
3、source包提供很简便的数据库操作功能,类似JPA、Hibernate。
diff --git a/source.html b/source.html
index ebf274d2a..598b926cb 100644
--- a/source.html
+++ b/source.html
@@ -71,7 +71,7 @@
以上接口除了directXXX,其他都有等同的异步接口。insert、delete、update接口与JPA同名接口用法一样。DataSource提供了丰富的查询接口,且有独特的翻页查询功能。每以系列的方法主要重载三类: 单个字段过滤、FilterBean过滤和FilterNode过滤。
@@ -193,57 +193,56 @@
public class LoginRecord extends BaseEntity {
@Id
- @Column(comment = "主键ID; 值=UUID+create36time")
- private String loginid = ""; //主键ID; 值=UUID+create36time
+ @Column(comment = "主键ID; 值=create36time(9位)+'-'+UUID(32位)")
+ private String loginid = ""; //主键ID; 值=create36time(9位)+'-'+UUID(32位)
- @Column(updatable = false, comment = "C端用户ID")
+ @Column(updatable = false, comment = "C端用户ID")
private long userid; //C端用户ID
- @Column(updatable = false, comment = "登录网络类型; wifi/4g/3g")
- private String netmode = ""; //登录网络类型; wifi/4g/3g
+ @Column(updatable = false, comment = "登录网络类型; wifi/4g/3g")
+ private String netmode = ""; //登录网络类型; wifi/4g/3g
- @Column(updatable = false, comment = "APP版本信息")
- private String appversion = ""; //APP版本信息
+ @Column(updatable = false, comment = "APP版本信息")
+ private String appversion = ""; //APP版本信息
- @Column(updatable = false, comment = "APP操作系统信息")
- private String appos = ""; //APP操作系统信息
+ @Column(updatable = false, comment = "APP操作系统信息")
+ private String appos = ""; //APP操作系统信息
- @Column(updatable = false, comment = "登录时客户端信息")
- private String loginagent = ""; //登录时客户端信息
+ @Column(updatable = false, comment = "登录时客户端信息")
+ private String loginagent = ""; //登录时客户端信息
- @Column(updatable = false, comment = "登录时的IP")
- private String loginaddr = ""; //登录时的IP
+ @Column(updatable = false, comment = "登录时的IP")
+ private String loginaddr = ""; //登录时的IP
- @Column(updatable = false, comment = "创建时间")
+ @Column(updatable = false, comment = "创建时间")
private long createtime; //创建时间
/** 以下省略getter setter方法 */
-
+
//创建对象
public static void main(String[] args) throws Throwable {
LoginRecord record = new LoginRecord();
long now = System.currentTimeMillis();
record.setCreatetime(now); //设置创建时间
- String create36time = Long.toString(now, 36); //时间的36进制
- if (create36time.length() < 9) create36time = "0" + create36time; //当前时间值的36进制只可能是8位或9位,不足9位填充0
- record.setLoginid(Utility.uuid() + create36time); //主键的生成规则
+ record.setLoginid(Utility.format36time(now) + "-" + Utility.uuid()); //主键的生成规则
//.... 填充其他字段
source.insert(record);
}
+
public static class TableStrategy implements DistributeTableStrategy<LoginRecord> {
- private static final String dayformat = "%1$tY%1$tm%1$td";
+ private static final String dayformat = "%1$tY%1$tm%1$td"; //一天一个表
- private static final String yearformat = "%1$tY";
+ private static final String yearformat = "%1$tY"; //一年一个库
//过滤查询时调用本方法
@Override
public String getTable(String table, FilterNode node) {
- Serializable day = node.findValue("#day");
+ Serializable day = node.findValue("#day"); //LoginRecord没有day字段,所以前面要加#,表示虚拟字段, 值为yyyyMMdd格式
if (day != null) getTable(table, (Integer) day, 0L); //存在#day参数则直接使用day值
- Serializable time = node.findValue("#createtime"); //存在createtime则使用最小时间,且createtime的范围必须在一天内,因为本表以天为单位建表
+ Serializable time = node.findValue("createtime"); //存在createtime则使用最小时间,且createtime的范围必须在一天内,因为本表以天为单位建表
return getTable(table, 0, (time == null ? 0L : (time instanceof Range ? ((Range.LongRange) time).getMin() : (Long) time)));
}
@@ -256,15 +255,14 @@
//根据主键ID查询单个记录时调用本方法
@Override
public String getTable(String table, Serializable primary) {
- String loginid = (String) primary;
- String create36time = loginid.substring(loginid.length() - 9); //固定最后9位为创建时间的36进制值
- return getTable(table, 0, Long.parseLong(create36time, 36));
+ String id = (String) primary;
+ return getTable(table, 0, Long.parseLong(id.substring(0, 9), 36));
}
- private String getTable(String table, int day, long createtime) {
- int pos = table.indexOf('.');
- String year = (day > 0 ? "" + day / 10000 : String.format(yearformat, createtime));
- return "platf_login_" + year + "." + table.substring(pos + 1) + "_" + (day > 0 ? day : String.format(dayformat, createtime));
+ private String getTable(String table, int day, long createtime) { //day为0或yyyyMMdd格式数据
+ int pos = table.indexOf('.');
+ String year = day > 0 ? String.valueOf(day / 10000) : String.format(yearformat, createtime); //没有day取createtime
+ return "platf_login_" + year + "." + table.substring(pos + 1) + "_" + (day > 0 ? day : String.format(dayformat, createtime));
}
}
}