zoukankan      html  css  js  c++  java
  • Atitit 数据库映射到redis存储的模式 1. 常规 每条db记录映射一个redis记录 1 1.1. 表名:主键为key ,记录序列化为json为val 1 2. 每个字段映射一个redi

    Atitit 数据库映射到redis存储的模式

     

    1. 常规 每条db记录映射一个redis记录 1

    1.1. 表名:主键为key  ,记录序列化为json为val 1

    2. 每个字段映射一个redis记录 1

    2.1. key为user:主键:字段 1

    2.2. 探索之三:Where are my tables? 1

    3. 段页区块式样存储page segment block 3

    3.1. key为表名:page1    表名:page2,val为若干条记录list 3

    4. 索引映射 3

    4.1. 每个索引映射若干条记录 表名:索引名:主键名,val数据 3

    4.2. 索引的段页式模式存储于管理 表名:索引名:page1 3

    5. 大数据量表的redis存储,可以分开存放在多个redis实例上 方便维护 3

     

     

    1. 常规 每条db记录映射一个redis记录
      1. 表名:主键为key  ,记录序列化为json为val
    2. 每个字段映射一个redis记录 
      1.  key为user:主键:字段
      2. 探索之三:Where are my tables?

    使用Redis与我们之前使用的SQL数据表完全不同,没有语言支持你在服务器上查询数据,这里仅有一些命令帮你操作数据库中的keys值。Redis中的命令是数据类型敏感型的,也就是说你不能在list上执行set命令,否则你将得到一个执行错误的提示。可以通过redis-cli或其他你使用的编程语言中的接口给Redis server发送命令。在下面的示例中,我们只强调命令本身,而不关注你通过哪种方式提交给Redis server。

    想像一下,一个简单的SQL数据库表,像一些应用中会用到的保存用户数据的表:

    id username password name surname 
    1 user1 pass1 Bob Smith 
    2 user2 pass2 Mario Rossi

          1. 存储数据

    假如我们想把上面的数据存储到Redis中,你会如何在Redis中设计数据库方案呢?也许以应用的视觉来看会更直观一些。使用SQL,我们在SELECT中通过指定用户id来获得一个用户信息,换句话说就是需要有用于区分不同数据实体的方式,所以我们可以通过一个唯一的标识来标识和获取用户信息。所以如果在redis的key中加入用户的id信息,那么我们的查询需求就解决了,在redis中,数据被存储成如下形式:

    Key Value 
    user:1:username user1 
    user:1:password pass1 
    user:1:name Bob 
    user:1:surname Smith 
    user:2:username user2 
    user:2:password pass2 
    user:2:name  Mario 
    user:2:surname Rossi

    那么,给出任一个用户id,我们就可以通过key user:id:username,user:id:password,user:id:name,user:id:surname的形式读出用户信息。

          1. 用户登录

    上面的存储形式也能用于用户登录,但需要一种方式能根据username来查询用户的id。也就是说我们还需要在username和id之间建立联系。这可以通过添加另外一个redis key"user:username:id"来实现。

    key value 
    user:user1:id 1 
    user:user2:id 2

    现在如果Mario Rossi想要登录进来,我们可以通过key"user:user2:id"先查出username,进而获得用户的所有信息。

          1. 主键

    在Redis中如何保证id值的唯一性呢。在SQL中,可以通过"id int primary key auto_increment"定义自增主键来实现,现在我们也需要一种类似的方式为每个用户生成一个不同的id。根据前面可用的数据类型中提到的数字数据,Redis中的方案是这样的:创建一个key"user:next_id",并把它作为计数器,每当要添加新用户时,就对key"user:next_id"执行INCR命令。

          1. SELECT * FROM users;

    下一个面临的问题是查询用户列表。也许你认为我们上面的数据存储已经足以查询出用户列表:可以先获得"user:next_id"的当前值counter,然后通过一步或多步遍历0到counter获得用户数据。但如果某个用户从系统中删除(下面会讲到删除操作),而我们会遍历0到counter中的所有id,这时就会有些id查询不到任何数据。

    尽管这通常不是问题,但我们不想在不存在的用户数据上浪费时间,所以需要创建另外一个key"user:list",其value为list或set类型,用于存储每一个新增的用户id,并在必要的时候从"user:list"中删除该id。我更倾向于使用list,因为它可能通过LRANGE命令实现分页功能。

          1. 删除用户

    还有一个要面临的问题是"数据完整性",看看我们在删除用户时会发生什么吧。我们需要删除每一个对此用户的引用,也就是说,需要删除下面所有的key"user:id:*","user:username:id",以及"user:list"中的用户id。

     

    1. 段页区块式样存储page segment block
      1.  key为表名:page1    表名:page2,val为若干条记录list
    2. 索引映射
      1. 每个索引映射若干条记录 表名:索引字段名:主键名,val数据
      2. 索引的段页式模式存储于管理 表名:索引名:page1
    3. 列表查询
          1. SELECT * FROM users;

    下一个面临的问题是查询用户列表。也许你认为我们上面的数据存储已经足以查询出用户列表:可以先获得"user:next_id"的当前值counter,然后通过一步或多步遍历0到counter获得用户数据。但如果某个用户从系统中删除(下面会讲到删除操作),而我们会遍历0到counter中的所有id,这时就会有些id查询不到任何数据。

    尽管这通常不是问题,但我们不想在不存在的用户数据上浪费时间,所以需要创建另外一个key"user:list",其value为list或set类型,用于存储每一个新增的用户id,并在必要的时候从"user:list"中删除该id。我更倾向于使用list,因为它可能通过LRANGE命令实现分页功能。

     

    1. 大数据量表的redis存储,可以分开存放在多个redis实例上 方便维护

     

    1. 同时使用几种映射模式方便不同场景与模式的使用
    2. 关系join查询

    对于每本book,我们需要知道它属于哪些topics;同样对于每个topic,也要处理它包含的每本book。换句话说,对每本book,需要一个存储它所关联的topic的id列表,对于每个topic,同样需要一个存储它关联的book的id列表。这正是set大展身手的地方。我们将创建两个sets:"book:id:topic"和"topic:id:books",前者保存book的topics'id列表,后者存储topic的books'id列表。以前面SQL场景中的数据为例,图书"Programming Erlang"(books表中的id为2),将有一个key为"book:2:topics",value为set类型且数据为(1,3)的数据信息;而主题"programming"则会有一个key为"topic:1:books",值为(1,2)的数据集

    可以看出,在SQL中的多对多关联,在Redis中可以通过两个set来实现。你会发现这种实现相当有用,它给我们提供了一种可

     

     

    1. Ref

     

      1. Redis学习:如何跳出SQL这个坑 - 伟gg - 博客园.htm
  • 相关阅读:
    centos 6.5 添加静态ip
    质数因子
    sizeof 和 strlen 的区别
    C++输入带空格的字符串
    字符集合
    汽水瓶
    算法汇总
    Word目录生成
    0-1背包问题的动态规划法与回溯法
    vue父元素调用子组件的方法报undefined
  • 原文地址:https://www.cnblogs.com/attilax/p/15197348.html
Copyright © 2011-2022 走看看