Redis的键值设计

一.前言

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

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

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

Redis数据库是一个键值对数据库,提供了5种基本数据类型,利用键名对数据进行保存和读取。Redis的业务处理逻辑,包含在了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的值    
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列表
6 2: 实体名: key = loginlog: value = 日志列表
  扩展用法 结合多个列,甚至多个实体的组合键设计
  • 特别说明

       在redis 中,键名是唯一的,都在同一个级别;但不同的键,保存的信息各不相同:

  • 保存整个 entity的相关内容,
    • 保存entity的一条记录;
    • 保存entity的一条记录的一个字段的值,
    • 保存一对多的关系,
    • 保存多对多的关系,等等

 

   
   

发表评论