您当前的位置: 首页 > 

梁云亮

暂无认证

  • 3浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

谷粒微博:代码实现

梁云亮 发布时间:2020-03-15 21:25:36 ,浏览量:3

常量接口
public interface Constant {
    //命名空间
    String NAMESPACE="weibo";

    //内容表
    String CONTENT="weibo:content";

    //用户关系表
    String RELATIONS="weibo:relations";

    //收件箱表
    String INBOX="weibo:inbox";
}
工具类及测试代码代码
  • WeiBoUtil
public class WeiBoUtil {

    private static Configuration cfg = HBaseConfiguration.create();

    static {
        cfg.set("hbase.zookeeper.quorum", "hcmaster:2181,hcslave1:2181,hcslave2:2181");
    }
}
  • Weibo
public class WeiBoUtilTest {
}
连接池工具类
public class HBasePoolUtil {
    private static Configuration conf = null;
    // 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    private static ExecutorService executor = null;
    private static Connection conn = null;

    static {
        try {
            conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", "hcmaster:2181,hcslave1:2181,hcslave2:2181");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
            conf.set("hbase.defaults.for.version.skip", "true");
            executor = new ThreadPoolExecutor(5, 15, 1000,
                    TimeUnit.MILLISECONDS,
                    new ArrayBlockingQueue(10),  // 使用有界队列,避免OOM
                    Executors.defaultThreadFactory(),
                    new ThreadPoolExecutor.AbortPolicy());
            conn = ConnectionFactory.createConnection(conf, executor);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Connection getConn() {
        return conn;
    }
}
具体代码 创建命名空间以及表名的定义
public static void createNamespace(String namespace) throws IOException {
    Connection conn = HBasePoolUtil.getConn();
    Admin admin = conn.getAdmin();
    NamespaceDescriptor namespaceDescriptor = NamespaceDescriptor.create(namespace).build();
    admin.createNamespace(namespaceDescriptor);
    admin.close();
}

测试代码:

@Test
public void createNamespace() throws IOException {
    WeiBoUtil.createNamespace("weibo");
}

结果:

创建表
public static void creteaTable(String tableName, int version, String... columnFamily) throws IOException {
    Connection conn = HBasePoolUtil.getConn();
    Admin admin = conn.getAdmin();

    boolean tableExists = admin.tableExists(TableName.valueOf(tableName));
    if (tableExists) {
        System.out.println(tableName + " exists!");
        return;
    }
    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));

    for (String cf : columnFamily) {
        ColumnFamilyDescriptor columnFamilyDescriptor = ColumnFamilyDescriptorBuilder.newBuilder(cf.getBytes()).setMaxVersions(version).build();
        builder.setColumnFamily(columnFamilyDescriptor);
    }
    admin.createTable(builder.build());
    admin.close();
}
测试代码:
@Test
public void creteaTable() throws IOException {
    //创建内容表
    WeiBoUtil.creteaTable(Constant.CONTENT, 1, "info");
    //创建用户关系表
    WeiBoUtil.creteaTable(Constant.RELATIONS, 1, "attends", "fans");
    //创建收件箱表
    WeiBoUtil.creteaTable(Constant.INBOX, 3, "info");
}
运行程序发现在weibo命名空间下创建了weibo:contet、weibo:relations、webo:inbox三个表。
发布微博内容

发布微博时,首先需要往微博内容表中添加数据,然后需要更新收件箱表fans的数据,它包括: 1. 获取当前uid的fans 2. 更新收件箱表中fans的数据

public static void createData(String uid, String content) throws IOException {
    Connection conn = HBasePoolUtil.getConn();
    long currentTimeMillis = System.currentTimeMillis();
    String rowKey = uid + "_" + currentTimeMillis;
    //往内容表中添加数据
    Table contentTable = conn.getTable(TableName.valueOf(Constant.CONTENT));
    Put put = new Put(Bytes.toBytes(rowKey));
    put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("content"), currentTimeMillis, Bytes.toBytes(content)); //手动指定时间戳
    contentTable.put(put);
    //用户发了微博,要同时更新它的fans的微博收件列表
    //1.获取关注了微博发送者的用户列表
    Table relationsTable = conn.getTable(TableName.valueOf(Constant.RELATIONS));
    //获取关系表中fans
    Get get = new Get(Bytes.toBytes(uid));
    get.addFamily(Bytes.toBytes("fans"));
    Result result = relationsTable.get(get);
    List cells = result.listCells();
    //如果用户没有关注者,不需要更新微博收件列表表
    if (cells == null || cells.size()             
关注
打赏
1665409997
查看更多评论
0.0550s