开发者学堂课程【HBase 入门教程:HBase 表设计_7】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/397/detail/5087
HBase 表设计_7
一、微博表
微博表
粉丝关注用户表
rowkey cf1(
存放关注列表) cf2(存放粉丝列表)
uid cf1:uid=uname cf2:uid=uname
微博表
rowkey cf1
uid_(long.max-time) cf1:content=
微博内容
如果想要找到关注过的好友发送过的微博需要做以下步骤:
找到自己 id,找到关注的好友列表,找到所有的微博,找到之后
此时时间不是一个降序:
每一个用户发布的微博,肯定实现一个降序,把这些全部用户的微博放在一起,就不一定是个降序了,所以此时查看首页,单纯靠着两张表是无法解决的,需要再加一张表,这张表叫做收微博表,如下:
收微博表
rowkey cf1
uid cf1:id=uid_(long.max-time) version=1000
rowkey 查看首页的时候,直接查询这张表,可以直接找到首页里面所有的关注的好友发布的微博,
uid_(long.max-time),cf1
里放所有的微博表 id,查询首页的时候,数据在 HBase 里连续存储的,数据本身按照降序的方式排序的,找到对应的微博表,把信息加载出来,这样查看首页的时候,所查看的微博就是降序的方式。
假如 A 用户发布了一些微博,B 用户也发布了一些微博,如果你只关注过 A 和 B,那么在做查询的时候,把 A 和 B 所有的微博进行降序。在做插入的时候,假如A发布一条微博,微博表里添加一条数据,收微博里也添加一条数据,发布微博的时候插入两条数据,收微博的也添加两条数据。
B 发布一条微博,微博表添加一条,收微博表也添加一条。后面不管A和B怎么添加,收微博表里发微博的顺序添加了多个数据,数据在 HBase 里存储的时候,都是降序。
在做查询的时候,降序是所有发的微博的整体降序,而不是每一个用户的降序。
之所以将表格分开的原因是:这样操作既可以查看首页,又可以查看自己发布哪些微博,当查看每一个用户,可以通过查询 uid_wid 来做。
设计表的时候降序的方式有两种方式:一种通过版本的方式,另一种是通过时间的方式。
发布微博,在微博表里添加数据,把用户 id,时间最小值,最大值减去之后,然后再把微博内容添加到微博表里,具体发多少条微博,对应的就有多少行数据,按照发布时间做一个降序的排序,发布微博之后有很多粉丝,另起一个线程,根据用户 id 查看粉丝列表,每一个粉丝列表,可以拿到用户 id,找到用户 id 对应的收微博表,添加一个数据存储,id 这个是微博 id,值存刚刚那个用户发布的微博 id。可以单独开一个线程来做,并不影响主业务逻辑,点击提交,就完成了。
后台再开一条线程,把所有粉丝列表里面每一个粉丝,关注的好友里发微博都添加过来了,当粉丝登录之后根据用户id 找到数据,数据代表关注的好友发过哪些微博,这些微博通过版本做了一个降序,查看关注的好友发布过的所有的微博,时间是一个降序的效果,查看首页功能完成了,
查看自己发布的微博,首先知道自己的用户 id,这个微博表来存储数据,发多少行就有多少行数据,加上前缀的过滤,根据 rowkey 拿到跟 uid 相同的,在 HBase 相同的一段连续的存储空间。把这组数据拿出来,发布过的所有微博,uid_(long.max-time) 最大值减去最小值实现降序,所以在查看自己发布微博的时候,拿到列表也是一个降序的,把业务满足了。