欢迎投稿

今日深度:

RDBMS库表与Redis模型间的一种映射方式

RDBMS库表与Redis模型间的一种映射方式


Key Value 备注
类型 取值说明
Tab:id STRING 整数字符串 表主键tab_id取值来源
Key名规则:表名称:id
初始值为0,每次新增记录前调用INCR命令加1
Tab:tab_id值 HASH 列名/列值HASHMAP 主表每条记录除主键以外其他列值存储结构
Key名规则:表名称记录主键值
emp_id ename mgr_id
1 SMITH 8
2 ALLEN 8
3 SALESMAN 7
Key名称 Value值
emp:id 3
emp:1 { ename=” SMITH”, mgr_id=”8” }
emp:2 { ename=” ALLEN”, mgr_id=”8” }
emp:3 { ename=” SALESMAN”, mgr_id=”7” }
Key Value 备注
类型 取值说明
Tab:indices:col_idx:col_idx值 SET 所有col_idx列值等于Key中col_idx值的记录的主键值集合 表非唯一索引列col_idx对应的键值对
Key名规则:表名称:idices:索引列名称:索引列数值
这样的键值对可能存在多个,每个索引列取值对应一个
emp_id ename mgr_id
1 SMITH 8
2 ALLEN 8
3 SALESMAN 7
Key名称 Value值
emp:id 3
emp:1 { ename=” SMITH”, mgr_id=”8” }
emp:2 { ename=” ALLEN”, mgr_id=”8” }
emp:3 { ename=” SALESMAN”, mgr_id=”7” }
emp:indices:mgr_id:7 ( 3 )
emp:indices:mgr_id:8 ( 1, 2 )
Key Value 备注
类型 取值说明
Tab:uniques:col_uniq HASH col_uniq列值/对应记录主键值 表非唯一索引列col_idx对应的键值对
Key名规则:表名称:uniques:索引列名称
emp_id ename email
1 SMITH foo@gmail.com
2 ALLEN bar@163.com
3 SALESMAN zoo@hotmail.com
Key名称 Value值
emp:id 3
emp:1 { ename=” SMITH”, email=” foo@gmail.com” }
emp:2 { ename=” ALLEN”, email =” bar@163.com” }
emp:3 { ename=” SALESMAN”, email =” zoo@hotmail.com” }
emp:uniques:email { foo@gmail.com = “1”, bar@163.com = “2”,
  zoo@hotmail.com = “3”

年前一段时间,在内存数据库选型上,还在Aerospike与Redis两者间游移不定。因为Redis毕竟业界已经有很多成功案例,而且国内互联网大佬们BAT也在使用,网上资源也很丰富;而Aerospike刚刚开源,在应用案例与技术资源这两方面是一穷二白。

在游移的这段时间,也看了不少Redis的网上技术文档和一些ORM开源实现,对关系数据库(RDBMS)表与Redis模型间的映射方式简单总结了下,记录在这里备忘。

由于Redis只是简单的Key-Value(键-值)存储系统,没有RDBMS中表与索引概念,要在Redis中实现原有数据库表模型的访问方式,必须有一种模型的转换方法,即模型间的映射方式,将RDBMS中的表与索引概念转成Redis Key-Value对象。

后面的映射方式说明中,有个前提假设是:关系数据库模型使用非业务含义数值序列做为主键。这可能与实际不符合,需根据情况进行调整。采用数值做为主键,主要目的是节省Redis模型索引数据的内存占用,内存能省点是点儿,地主家也没有余粮啊。

Redis模型中所有Key-Value的创建维护,包括对应RDBMS表索引的Key-Value创建和维护,以及唯一索引的唯一性保证,都是由应用程序自身完成,Redis只负责数据保存。
表模型


另外,Redis模型中所有Key-Value的创建和维护,包括对应于RDBMS库表索引的Key-Value创建和维护,以及唯一索引的唯一性保证,都要由应用程序自身来完成,Redis只负责数据的存储。
表模型

RDBMS表模型
\\

Redis模型
上图中的RDBMS模型转换成Redis模型,各Key-Value键值说明如下:

举例
例如:表emp的数据及转换成Redis模型的数据如下:
\\


非唯一单列索引模型

RDBMS表模型
\\
表在列col_idx上建有非唯一索引。

Redis模型
上图模型中的RDBMS索引转换成Redis模型,索引相关Key-Value键值说明如下:

举例
例如:表emp在mgr_id上建有非唯一索引,表数据及转换成Redis模型的数据如下:
\\


唯一单列索引模型

RDBMS表模型
\\
表在列col_uniq上建有唯一索引。


Redis模型
上图模型中的RDBMS索引转换成Redis模型,索引相关Key-Value键值说明如下:

举例
例如:表emp在email上建有唯一索引,表数据及转换成Redis模型的数据如下:
\\


(非)唯一多列组合索引模型


RDBMS表模型
\\
表在列col_idx1、col_idx2上建有非唯一组合索引,
在列col_uniq1、col_uniq2上建有唯一组合索引。


Redis模型
上图模型中的索引转换成Redis模型,索引相关Key-Value键值说明如下:

Key

Value

备注

类型

取值说明

Tab:indices:col_idx1:col_idx1值:col_idx2:col_idx2值

SET

所有符合索引列值条件的记录的主键值集合

表非唯一索引列col_idx1、col_idx2对应的键值对

Key名规则:表名称:idices:索引列1名称:索引列1数值:索引列2名称:索引列2数值:

这样的键值对可能存在多个,每组索引列取值对应一个

Tab:uniques:col_uniq1:col_uniq2

HASH

col_uniq1列值、col_uniq2列值组合/对应记录主键值

表非唯一索引列col_uniq1、col_uniq2对应的键值对

Key名规则:表名称:uniques:索引列1名称:索引列2名称


其实(非)唯一多列组合索引是没有必要的,可用在组合索引中各列上建立非唯一单列索引的方式替代,因为非唯一单列索引使用的是SET(集合),所有在组合索引上的条件查询可转化成集合的运算来实现:SUNION、SDIFF、SINTER等

关联关系(一对多/一对一)

 

RDBMS表模型
\\

Redis模型
父表不需要特殊处理,将子表关联父表的parent_id列做为非唯一索引处理,参见非唯一单列索引模型。

www.htsjk.Com true http://www.htsjk.com/DB2/20246.html NewsArticle RDBMS库表与Redis模型间的一种映射方式 Key Value 备注 类型 取值说明 Tab:id STRING 整数字符串 表主键tab_id取值来源 Key名规则: 表名称 :id 初始值为0,每次新增记录前调用INCR命令加1 Tab:...
评论暂时关闭