1. 书和书签系统
  2. create table book (
  3. bookid int,
  4. title char(20)
  5. )engine myisam charset utf8;
  6.  
  7. insert into book values
  8. (5 , 'PHP圣经'),
  9. (6 , 'ruby实战'),
  10. (7 , 'mysql运维')
  11. (8, 'ruby服务端编程');
  12.  
  13. create table tags (
  14. tid int,
  15. bookid int,
  16. content char(20)
  17. )engine myisam charset utf8;
  18.  
  19. insert into tags values
  20. (10 , 5 , 'PHP'),
  21. (11 , 5 , 'WEB'),
  22. (12 , 6 , 'WEB'),
  23. (13 , 6 , 'ruby'),
  24. (14 , 7 , 'database'),
  25. (15 , 8 , 'ruby'),
  26. (16 , 8 , 'server');
  27.  
  28. # 既有web标签,又有PHP,同时还标签的书,要用连接查询
  29. select * from tags inner join tags as t on tags.bookid=t.bookid
  30. where tags.content='PHP' and t.content='WEB';
  1. 换成key-value存储用kv 来存储,
  2.  
  3. book就是表,5idtitle是字段
  4.  
  5. 6377:0>set book:5:title 'PHP圣经'
  6. 6377:0>get book:5:title
  7. "PHP圣经"
  8. set book:6:title 'ruby实战'
  9. set book:7:title 'mysql运难'
  10. set book:8:title ruby server
  11.  
  12. sadd tag:PHP 5
  13. sadd tag:WEB 5 6
  14. sadd tag:database 7
  15. sadd tag:ruby 6 8
  16. sadd tag:SERVER 8
  17.  
  18. 查: 既有PHP,又有WEB的书
  19. Sinter tag:PHP tag:WEB #查集合的交集
  20.  
  21. 查: PHP或有WEB标签的书
  22. Suion tag:PHP tag:WEB
  23.  
  24. 查:含有ruby,不含WEB标签的书
  25. Sdiff tag:ruby tag:WEB #求差集
  1. Redis key 设计技巧
  2. //先根据a分组,再根据b分组,再根据c分组,再根据d分组,d组只有一个值是1

  1. 1: 把表名转换为key前缀 如, tag:
  2. 2: 2段放置用于区分区key的字段--对应mysql中的主键的列名,如userid
  3. 3: 3段放置主键值,如2,3,4...., a , b ,c
  4. 4: 4段,写要存储的列名
  5.  
  6. 用户表 user , 转换为key-value存储
  7. userid   username   passworde   email
  8. 9   Lisi        1111111   lisi@163.com
  1. //先根据user分组,再根据userid分组,再根据9分组,最后根据username分组,这个组只有一个值就是lisi
  2. set user:userid:9:username lisi
  3. set user:userid:9:password 111111
  4. set user:userid:9:email lisi@163.com
  5.  
  6. set user:userid:10:username yyy
  7. set user:userid:10:password 222222
  8. set user:userid:10:email yyy@163.com

  1. 6380:0>get user:userid:9:username
  2. "lisi"
  3. 6380:0>get user:userid:9:password
  4. "111111"

  

  1. 6380:0>keys user:userid:9* //9号用户有多少字段
  2. 1) "user:userid:9:email"
  3. 2) "user:userid:9:password"
  4. 3) "user:userid:9:username"
  5.  
  6. //查询用户名叫lisi的,redis毕竟不是传统数据库,查起来比较复杂
  7. keys user:userid:*:username lisi
  1. 2 注意:
  2. 在关系型数据中,除主键外,还有可能根据其他列来查询,例如根据用户名来查询,没有什么好的方法,只能根据冗余信息来维护。
  3. Set user:username:lisi:userid 9 //再维护一个用户名对应的userid的信息
  4. 6380:0>Get user:username:lisi:userid
  5. "9" //根据username查询到userid,然后根据userid找到哪一行

  1. 如果还要根据email来查询,那么就要又维护一个冗余的email,查询的时候先根据email找到userid,然后根据userid找到那一行。
  2. Set user:email:yyy@163.com:userid 10
  3. Set user:email:lisi@163.com:userid 9

  1. 这就跟索引一样,如果经常要根据哪个列查询,就要维护一个索引表,这里就是要维护一个指向主键的kv表。以空间换时间。

  

redis12-----redis 与关系型数据库的对比的更多相关文章

  1. Spring+Redis集成+关系型数据库持久化

    本篇文章主要介绍了"Spring+Redis集成+关系型数据库持久化",主要涉及到Spring+Redis集成+关系型数据库持久化方面的内容,对于Spring+Redis集成+关系 ...

  2. Redis非关系型数据库

    1.简介 Redis是一个基于内存的Key-Value非关系型数据库,由C语言进行编写. Redis一般作为分布式缓存框架.分布式下的SESSION分离.分布式锁的实现等等. Redis速度快的原因: ...

  3. redis相对关系型数据库的优势

    它是键值数据库(非关系),数据查询比关系型数据库快. ps:redis是树状结构,查询快 redis是基于内存的一个数据库,I/O的效率影响较小. ps: 备份数据同步是才进行I/O操作.这个数据同步 ...

  4. Redis 非关系型数据库 ( Nosql )

    简介: Redis 是一个开源的,高性能的 key-value 系统,可以用来缓存或存储数据. Redis 数据可以持久化,并且支持多种数据类型:字符串(string),列表(list),哈希(has ...

  5. mongoDB关系型数据库的对比

    一.基本操作 1.mongoDB和关系型数据库对比 对比项 mongoDB mysql oracle 表 集合list 二维表 表的一行数据 文档document 一条记录 表字段 键key 字段fi ...

  6. redis非关系型数据库的基本语法

    导入并连接数据库: import redis # 导入redis模块,通过python操作redis 也可以直接在redis主机的服务端操作缓存数据库 import time # host是redis ...

  7. redis 非关系型数据库

    redis 类型,数据存在磁盘里面,所以存储速度比较快,其他数据类型还是存储在数据库所以比较慢些 链接redis数据库: r=redis.Redis(host="%%%%%%%", ...

  8. Redis (非关系型数据库) 数据类型 之 list列表类型

    Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边) list即可以作为“栈”也可以作为"队列". 操作: >lpush ...

  9. Redis (非关系型数据库) 数据类型 之 String类型

    Redis 一个内存数据库,通过 Key-Value 键值对的的方式存储数据.由于 Redis 的数据都存储在内存中,所以访问速度非常快,因此 Redis 大量用于缓存系统,存储热点数据,可以极大的提 ...

随机推荐

  1. BZOJ3130 [Sdoi2013]费用流 【网络流 + 二分】

    题目 Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络流方案必须满足:(1)每 ...

  2. KS求有向图强连通分量模板

    #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; *maxn; struct no ...

  3. R语言入门--画图(一)--需要注意的地方

    一.注意‘\t’是‘\t’     不是‘/t’  写'/t'就错了   就不是换行符了 二.程序报错先检查有没有这个包

  4. postman 快捷方式--启动图标

    下载,解压,安装,(此安装位置在/opt) 1.创建全局变量,也就是在任何地方都可以执行postman,不用去到安装目录,执行 : sudo ln -s /opt/postman/Postman /u ...

  5. 2017 ACM/ICPC Asia Regional Shenyang Online 记录

    这场比赛全程心态爆炸…… 开场脑子秀逗签到题WA了一发.之后0贡献. 前期状态全无 H题想复杂了,写了好久样例过不去. 然后这题还是队友过的…… 后期心态炸裂,A题后缀数组理解不深,无法特判k = 1 ...

  6. 使用css绘制六边形

    用css绘制六边形需要使用到三个容器,分别用于绘制六边形的三个部分,如下图所示: 接下来,就是代码了: CSS: ;;border-top: 30px solid #6c6;border-left:  ...

  7. codevs科技庄园

    /* 因为每一秒只能走一个单位长度,而每走一个单位长度又会消耗一个体力值,如果体力值没有了时间还有也只能按照体力值计算,反之一样,所以V对于时间和体力值取小 cnt记录有桃子的树的个数,node[cn ...

  8. org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成,的错误问题

    当时在mapper其中的一个语句是case when ISNULL(b.c_truename) || LENGTH(TRIM(b.c_truename)) < 1 then b.c_ch_nam ...

  9. Ubuntu 16.04下快速在当前目录打开终端的快捷键设置

    说明:不一定每次都准确打开,80%的机会是行的. 原理:使用xdotool模拟键盘按键,打开的文件夹管理界面,然后通过Ctrl+L获取地址栏地址,然后传递到终端上. 安装: 1.安装xdotool s ...

  10. 使用squid架设自己的代理server

    主要參考了 http://blog.chinaunix.net/uid-20778906-id-540115.html Ubuntu下Squid代理server的安装与配置 1 安装 $ sudo a ...