Redis 键名的设计

一.前言

结构化数据库的特点在于,需要事先严格定义好字段名,字段类型,长度,缺省值,取值范围,约束条件等,而且必须保证所有记录的所有字段都严格按结构设计来保存数据,否则不允许保存。关系型数据库在入库前进行了大量的检查和处理工作,如 SQL Server, Oracle, MySQL, PostgerSQL。

半结构化数据库则没有这些限制,可以较灵活地保存数据,入库时数据库本身不做严格检查,而是到客户端应用程序使用时,再检查数据的正确性和可用性,这样可极大提高数据的读写性能,如 MongoDB, Hbase ,Redis。

非结构化数据无明显的数据库结构可言,可作为一个整体数据进行保存,如文档,图像,音视频等。

Redis数据库是一个键值对数据库,提供了5种基本数据类型 (String, List, Hash, Set, ZSet),利用键名对数据内容进行保存和读取。Redis的业务处理逻辑,包含在键值的设计中,一般是利用实际的业务数据,动态拼装键名,来进行相关数据的保存和读取。因此客户端应用程序需要有一个统一的键值设计方案,才能有效实现相应的业务逻辑。

 

二.键名设计规则

本文提供了一种对Redis键名(没有包含值类型的设计)进行结构化设计的方案。键名的长度:可达512M, 但键名越长,越占资源,需要权衡

       以下提供的命名项目,中间用冒号(:)分隔,其中(2,3,4,6)项是基本的,其他项目可以根据需要进行取舍使用。

序号

条目

说明

举例

1

实体族

也可理解为命令空间,Schema等

sys

2

实体名

表名,包括系统表

user

3

查询字段名

查找字段,或用于定位相关业务信息

缺省字段可以省略不写,如主键字段

userid

4

查询字段值

具体业务内容,跟查询字段名对应

888

5

数据值对应的列族名

字段族,参考Hbase的结构设计

base

6

数据值对应的列名

当前键要保存的数据值对应的数据列名

即当 【查询字段名】= 【查找字段值】时, 获得的内容对应的数据列名

username

7

数据值的版本号

参考Hbase的结构设计,可保留值的多个版本信息

 

8

数据值的时间戳

参考Hbase的结构设计

 

 

三.举例说明

  • 结构化数据库的表设计

表名: user

序号

字段名

说明

1

userid

用户id

2

username

用户名称

3

userole

用户角色

4

password

用户密码

5

isactive

用户是否有效

表名: role

序号

字段名

说明

1

roleid

关系型数据库的表物理主键,在Redis中,若没有引用,则可不要

2

rolename

角色名称,固定值为 visitor, admin

表名:loginlog :登录历史表

序号

字段名

说明

1

loginlogid

关系型数据库的表物理主键,在Redis中,若没有引用,则可不要

2

userid

用户名称

3

logintime

登录时间

4

logouttime

退出时间

表名:online :在线人员

序号

字段名

说明

1

onlineid

关系型数据库的表物理主键,在Redis中,若没有引用,则可不要

2

userid

用户id

3

logintime

登录时间

4

token

令牌

 

  • Redis 键名设计:

序号

键名设计

(包含的内容)

举例

1

1:2:3:4:5:6:7:8

key = sys:user:userid:888:base:username:1:217453

value = username的值

 

说明:通过userid, 保存、读取 username 信息

2

2:3:4:6

实体名:查询字段名:字段值:列名

key = user:userid:888:username:

value = username的值

说明:通过userid, 获得username

 

key = user:username:edwin:userid

value = userid

说明:通过username 找到 userid

3

2:4:6

实体名:字段值:列名

key = user:888:username (对应主键字段名为 userid)

value = username的值

 

只适合主键字段(或每个实体的缺省字段),开发过程中应该非常明确,没有歧义

不建议根据数据类型来区别不同字段,代码容易混

4

2:4

实体名: 字段值

key = user:888   (对应缺省主键字段: userid)

value = 跟当前userid 相关的值列表

5

2:3

实体名:字段名

key = online:userid

value = userid列表

 

说明:所有在线用户的userid列表

6

2:

实体名:

key = loginlog:

value = 日志列表

7

扩展用法

结合多个列,甚至多个实体的组合键设计

 

  • 特别说明

       在redis 中,所有键名都是唯一的,且都在同一个物理结构级别,不分层级;但不同的键值,保存的业务信息各不相同,业务层级结构各不相同

  1. 保存整个数据库的系统信息
  2. 保存某个 entity的整体信息,
  3. 保存entity的一条记录;
  4. 保存entity的一条记录的一个字段的值
  5. 保存一对多的关系,
  6. 保存多对多的关系,等等

 

你可能感兴趣的:(Redis 键名的设计)