User Portrait 시리즈 - Portrait 태그 만료 정책에 HBase 적용

1. 배경

이전 기사 시리즈에서는 사용자 초상화의 개념, 사용자 초상화의 레이블 처리 및 사용자 초상화의 적용에 대해 소개했습니다. 이 기사는 주로 초상화의 일부 기술적 세부 사항을 소개하여 모든 사람이 초상화 데이터 저장 및 처리 논리를 더 자세히 이해할 수 있도록 합니다.

실제 예를 들면 다음과 같습니다.

예 1: 전염병으로 인해 (전염병 관련) 플랫폼이 시작되고 사용자가 전염병 플랫폼을 따랐습니다. 사용자가 전염병에 대해 우려하는지 여부를 나타내는 레이블이 있습니다. 그러나 정책의 자유화와 함께 , 이 레이블은 분명히 회사용이 아닙니다.전염병 상황이 해제되고 보관 비용이 낭비된 후 식별을 위해 별도의 필드가 필요합니다.

예 2: 전자상거래 플랫폼의 웹 버전, 모바일 버전(Android, ios) 또는 패드 버전 등 쇼핑 또는 동영상 시청 시 계정이 여러 장치에 로그인하지만 사용자를 따라갈 수 있습니다. 기기 변경(휴대전화, 컴퓨터 또는 패드 변경), 이전 기기 정보를 저장하는 것은 의미가 없으며, 결국 휴대전화 또는 컴퓨터는 더 이상 사용할 수 없으며 적어도 이 계정 시스템에 연결되지 않습니다.

예 3: 사용자가 비회원이고 회원이 될 확률을 예측하는 라벨이 있지만 어느 날 회원이 된 후 이 데이터는 분명히 가치가 없으므로 삭제해야 합니다.

위의 예를 통해 우리는 시간이 지남에 따라 비즈니스에 가치가 없고 저장 공간을 낭비하며 심지어 만료되지 않아 오해를 불러일으키는 일부 태그가 있음을 알 수 있습니다.

2. 솔루션

그런 계획이 있나요? 그러한 태그를 만료시키는 것은 어떻습니까?

예: 특정 계정의 장치가 반년 동안 업데이트되지 않거나 특정 레이블이 반년 동안 업데이트되지 않는다고 생각되면 이 레이블을 삭제하시겠습니까?

 위의 흐름도는 태그 쓰기 프로세스와 태그 만료 프로세스를 소개합니다.

태그 만료: 모든 세로 데이터를 읽고 각 태그를 판단해야 하며 현재 시간 - 태그의 업데이트 시간 > 태그의 TTL 시간이면 태그를 삭제해야 합니다.

즉, 전체 프로세스는 데이터베이스 열 수준에서 TTL을 지원하며 레이블이 업데이트되는 시간, 즉 열의 업데이트 시간을 얻기 위해 필요합니다.

3. 실현

현재는 Hbase + Mysql을 통째로 사용하여 구현하는데, Hbase는 컬럼 업데이트 시 업데이트 시간 설정을 지원함과 동시에 컬럼을 읽어서 컬럼 업데이트 시간을 획득할 수 있도록 지원하며, 전체적인 과정은 TTL을 구성하여 완료할 수 있다. Mysql을 통한 레이블 정보.

hbase写入时设置列的时间
@Test
    public void insert() throws IOException {
        Calendar calendar = Calendar.getInstance();
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH) - 1, 0, 0, 0);
        long preZero = calendar.getTime().getTime();
        System.out.println(preZero);

        Connection connection = createConnection();
        Table table = connection.getTable(TableName.valueOf("tmp_test_info"));
        ArrayList<Put> puts = new ArrayList<>();
        Put put4 = new Put("0005".getBytes());
        put4.addColumn("f1".getBytes(), "name".getBytes(), preZero, Bytes.toBytes("小杰"));
        put4.addColumn("f1".getBytes(), "age".getBytes(), Bytes.toBytes(24));
        //不设置则用当前时间
        puts.add(put4);
        table.put(puts);
        table.close();
        connection.close();
 }
@Test
public void scan() throws IOException {
        Map<String, Long> cellTTL = new HashMap<>();
        cellTTL.put("name", 1L);//单位天
        cellTTL.put("age", 2L);//单位天
        List<Delete> deleteList = new ArrayList<>();
        long currentTime = System.currentTimeMillis();
        Table table = createConnection().getTable(TableName.valueOf("tmp_test_info"));
        Scan scan = new Scan();
        scan.withStartRow("0001".getBytes());
        scan.withStopRow("0008".getBytes());
        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            List<Cell> cells = result.listCells();
            for (Cell cell : cells) {
                String rk = Bytes.toString(CellUtil.cloneRow(cell));
                String family = Bytes.toString(CellUtil.cloneFamily(cell));
                String column = Bytes.toString(CellUtil.cloneQualifier(cell));
                long timestamp = cell.getTimestamp();
                if (column.equals("name")) {
                    String value = Bytes.toString(CellUtil.cloneValue(cell));
                    System.out.println(rk + ":" + family + ":" + column + ":" + value + ":" + timestamp);
                } else {
                    int value = Bytes.toInt(CellUtil.cloneValue(cell));

                    System.out.println(rk + ":" + family + ":" + column + ":" + value + ":" + timestamp);
                }
                if (cellTTL.containsKey(column)) {
                    if (currentTime - timestamp > cellTTL.get(column)*24*60*60*1000) {
                        //判断列标签是否过期
                        Delete delete = new Delete(Bytes.toBytes(rk));
                        delete.addColumn(Bytes.toBytes(family), Bytes.toBytes(column));
                        deleteList.add(delete);
                    }
                }
            }
        }
        if (!deleteList.isEmpty() && deleteList.size() > 0) {
            table.delete(deleteList);
        }
        table.close();
}

만료 정책 처리 코드의 간단한 버전은 위에 나와 있습니다.

Supongo que te gusta

Origin blog.csdn.net/weixin_43291055/article/details/130382185
Recomendado
Clasificación