其他分享
首页 > 其他分享> > 谷粒微博-项目进度--6-24

谷粒微博-项目进度--6-24

作者:互联网

/**
* 关注用户逻辑
* a、在微博用户关系表中,对当前主动操作的用户添加新的关注的好友
* b、在微博用户关系表中,对被关注的用户添加粉丝(当前操作的用户)
* c、当前操作用户的微博收件箱添加所关注的用户发布的微博 rowkey
*/
public void addAttends(String uid, String... attends) {
// 参数过滤
if (attends == null || attends.length <= 0 || uid == null || uid.length() <= 0) {
return;
}
HConnection connection = null;
try {
// 设置zookeeper
conf.set("hbase.zookeeper.quorum", "master");
connection = HConnectionManager.createConnection(conf);
// 用户关系表操作对象(连接到用户关系表)
HTableInterface relationsTBL = connection.getTable(TableName.valueOf(TABLE_RELATIONS));
List<Put> puts = new ArrayList<Put>();
// a、在微博用户关系表中,添加新关注的好友
Put attendPut = new Put(Bytes.toBytes(uid));
for (String attend : attends) {
// 为当前用户添加关注的人
attendPut.add(Bytes.toBytes("attends"), Bytes.toBytes(attend), Bytes.toBytes(attend));
// b、为被关注的人,添加粉丝
Put fansPut = new Put(Bytes.toBytes(attend));
fansPut.add(Bytes.toBytes("fans"), Bytes.toBytes(uid), Bytes.toBytes(uid));
// 将所有关注的人一个一个的添加到 puts(List)集合中
puts.add(fansPut);
}
puts.add(attendPut);
relationsTBL.put(puts);
// c.1、微博收件箱添加关注的用户发布的微博内容(content)的 rowkey
HTableInterface contentTBL = connection.getTable(TableName.valueOf(TABLE_CONTENT));
Scan scan = new Scan();
// 用于存放取出来的关注的人所发布的微博的 rowkey
List<byte[]> rowkeys = new ArrayList<byte[]>();
for (String attend : attends) {
// 过滤扫描 rowkey,即:前置位匹配被关注的人的 uid_
RowFilter filter = new RowFilter(CompareOp.EQUAL, new SubstringComparator(attend + "_"));
// 为扫描对象指定过滤规则
scan.setFilter(filter);
// 通过扫描对象得到 scanner
ResultScanner result = contentTBL.getScanner(scan);
// 迭代器遍历扫描出来的结果集
Iterator<Result> iterator = result.iterator();
while (iterator.hasNext()) {
// 取出每一个符合扫描结果的那一行数据
Result r = iterator.next();
for (Cell cell : r.rawCells()) {
// 将得到的 rowkey 放置于集合容器中
rowkeys.add(CellUtil.cloneRow(cell));
}
}
}
// c.2、将取出的微博 rowkey 放置于当前操作用户的收件箱中
if (rowkeys.size() <= 0)
return;
// 得到微博收件箱表的操作对象
HTableInterface recTBL = connection.getTable(TableName.valueOf(TABLE_RECEIVE_CONTENT_EMAIL));
// 用于存放多个关注的用户的发布的多条微博 rowkey 信息
List<Put> recPuts = new ArrayList<Put>();
for (byte[] rk : rowkeys) {
Put put = new Put(Bytes.toBytes(uid));
// uid_timestamp
String rowKey = Bytes.toString(rk);
// 借取 uid
String attendUID = rowKey.substring(0, rowKey.indexOf("_"));
long timestamp = Long.parseLong(rowKey.substring(rowKey.indexOf("_") + 1));
// 将微博 rowkey 添加到指定单元格中
put.add(Bytes.toBytes("info"), Bytes.toBytes(attendUID), timestamp, rk);
recPuts.add(put);
}
recTBL.put(recPuts);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != connection) {
try {
connection.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

标签:24,--,rowkey,Bytes,用户,微博,toBytes,new
来源: https://www.cnblogs.com/gagachen/p/13371960.html