Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4154036
  • 博文数量: 240
  • 博客积分: 11504
  • 博客等级: 上将
  • 技术积分: 4277
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-28 14:24
文章分类

全部博文(240)

分类: 数据库开发技术

2015-12-16 10:13:57

这里来演示下REDIS和MYSQL之间的数据转换问题,REDIS 是典型的KEY -VALUE型NOSQL数据库,并且提供了额外丰富的数据类型。这里简单列举了标签类型的应用问题。


比如在MySQL里面,对内容的标签有以下简单的几张表,我这里只列出来拆分过后的表结构
第一,MySQL部分,

点击(此处)折叠或打开

  1. 内容表:
  2. CREATE TABLE `content` (
  3.   `id` int(10) unsigned NOT NULL, -- 内容ID,唯一。
  4.   `name` varchar(60) DEFAULT NULL, -- 内容的名字
  5.   `created_timestamp` timestamp NULL DEFAULT NULL, -- 内容的加入时间
  6.   PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=latin1


  8. 标签表:
  9. CREATE TABLE `tag` (
  10.   `tag_name` varchar(60) NOT NULL, -- 标签名字,唯一
  11.   `visit_count` int(10) unsigned NOT NULL DEFAULT '0', -- 标签的访问次数
  12.   PRIMARY KEY (`tag_name`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=latin1




  14. 内容与标签的关系,多对多。


  15. CREATE TABLE `content_tag_relation` (
  16.   `content_id` int(10) unsigned NOT NULL, -- 内容ID
  17.   `tag_name` varchar(60) NOT NULL -- 标签名字
  18. ) ENGINE=InnoDB DEFAULT CHARSET=latin1






  19. 假设我们有以下的需求:
  20. 1. 得到标签对应的文章名字,
  21. SELECT a.name FROM content AS a,content_tag_relation AS b
  22. WHERE a.id = b.content_id AND b.tag_name = 'mysql'


  23. 2. 按照访问量显示前三的标签,
  24. SELECT tag_name FROM tag WHERE 1 ORDER BY visit_count DESC LIMIT 3;


下来我们在REDIS里面存储这部分数据。
第二,redis部分,

点击(此处)折叠或打开

  1. 1. a,内容,我们用STRING类型来做,值用JSON来存储,
  2. t_girl:6379> set string:content_id:4 '{"name":"test48601","created_timestamp":"2012-01-01 05:41:01"}'
  3. OK
  4. t_girl:6379> get string:content_id:4
  5. "{\"name\":\"test48601\",\"created_timestamp\":\"2012-01-01 05:41:01\"}"
  6. 但是如果想得到内容对应的名字和创建时间,REDIS方面获取困难,就得交给程序来做了。


  7.  b,或者也可以用HASH类型来存储,
  8. t_girl:6379> hset 'hset:content_id:4' name 'test48601'
  9. (integer) 1
  10. t_girl:6379> hset 'hset:content_id:4' created_timestamp '2012-01-01 05:41:01'
  11. (integer) 1


  12. 那这时想获取对应的名字以及时间非常容易
  13. t_girl:6379> hget hset:content_id:4 name
  14. "test48601"
  15. t_girl:6379> hget hset:content_id:4 created_timestamp
  16. "2012-01-01 05:41:01"
  17. t_girl:6379>


  18. 2. 标签,我们用有序集合来做,这么做的好处是可以用REDIS对应的有序来做访问量的排序。
  19. t_girl:6379> zadd zset:tag 680 database 469 db2
  20. (integer) 2


  21. 比如我们想要得到访问前三的标签名字?
  22. t_girl:6379> zrevrangebyscore zset:tag +inf 0 limit 0 3
  23. 1) "mongodb"
  24. 2) "sql"
  25. 3) "postgresql"


  26. 3. 标签与内容的关系,我们用集合来做,
  27. t_girl:6379> sadd set:content_id:4 role mongodb role database
  28. (integer) 3


  29. 那么也很容易得到指定内容对应的标签
  30. t_girl:6379> smembers set:content_id:4
  31. 1) "database"
  32. 2) "role"
  33. 3) "mongodb"


  34. 4. a, 如果用上面的设计我们实现稍微复杂些的需求:比如得到标签对应的文章名字。这样的需求貌似没有可以直接拿来用的方法,比如下面我写的一段PYTHON代码来获取:
  35.    import redis
  36.    content_id_keys = r.keys('set*')
  37.    content_id_keys_len = len(content_id_keys)

  38.    i = 0
  39.    j = 0
  40.    content_name_list = []
  41.    while i < content_id_keys_len:
  42.        if r.sismember(content_id_keys[i],'mysql') == 1:
  43.            content_name_list.append(eval(r.get(content_id_keys[i].replace('set','string')))['name'])
  44.            print('Content name is :' + content_name_list[j])
  45.            j += 1
  46.        i += 1


  47. b.那其实我们可以在REDIS里面做一份冗余的集合来存储,这样就可以直接把信息拿出来。
  48. t_girl:6379> sadd tag:mysql test123 test133 test144 test155
  49. (integer) 4
  50. t_girl:6379> smembers tag:mysql
  51. 1) "test133"
  52. 2) "test155"
  53. 3) "test123"
  54. 4) "test144"




阅读(9560) | 评论(0) | 转发(0) |
0

上一篇:【原创】Oracle实现PGSQL的generate_series

下一篇:没有了

给主人留下些什么吧!~~