`

TT/TC 遍历Key解决方案

 
阅读更多

 

项目中要遍历,对Key进行处理,弄了N个方案,记录下,具体选哪个再说,呵呵

需求:TC服务中通过KEY-VALUE存储了准备删除的文件KEY和时间,需要定期全量遍历KEY,进行删除,然后清理TC对应的数据。由业务决定了删除数据的量不大,目前主要要求可靠。

 

1、给TT加个补丁,让其支持memcached协议访问,本人只会JAVA,困难(同时被鄙视了),网上的那个补丁说有问题...

代码:无

2、使用TC的JAVA-API直接访问TC数据问题,已测试通过,注意在TT启动的时候,打开文件时候,mode需要加HDB.ONOLCK,不然,是读取不到数据的,一直卡在哪儿(我的需要是读取KEY,所有mode使用的是:HDB.OREADER|HDB.ONOLCK),这需要部署程序到TC服务,有点不爽,而且JAVA打包也麻烦(有业务逻辑和功能基础包,都是maven依赖的,我靠,如果不人工清理,好多jar啊)。

代码:

 

import tokyocabinet.*;

public class TCHDBEX {
  public static void main(String[] args){

    // create the object
    HDB hdb = new HDB();

    // open the database
    if(!hdb.open("/mnt/ttserver/tt_11212.tch", HDB.OREADER | HDB.ONOLCK)){
      int ecode = hdb.ecode();
      System.err.println("open error: " + hdb.errmsg(ecode));
    }

    String key;
    String value;
    hdb.iterinit();
    while((key = hdb.iternext2()) != null){
        System.out.println(key);
    }

    // close the database
    if(!hdb.close()){
      int ecode = hdb.ecode();
      System.err.println("close error: " + hdb.errmsg(ecode));
    }

  }
}

 

3、使用程序在本地指定tchmgr的cli工具直接读取命令行范围的流,得到keys.比较不好的是需要部署程序到TC服务器了。问题同方案2

代码:

 

package com.feinno.storage.console.task.clean;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

public class LocalCliTCListKeys implements TCListKeys {

	private String charset = "UTF-8";

	@Override
	public List<String> list(int top) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<String> list() {
		String shellCommand = "tchmgr list -nl /mnt/ttserver/tt_11211.tch";
		String[] cmd = { "/bin/sh", "-c", shellCommand };
		BufferedReader reader = null;
		List<String> keys = new ArrayList<String>();
		try {
			Process process = Runtime.getRuntime().exec(cmd);
			reader = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName(charset)));
			String buf = null;
			while ((buf = reader.readLine()) != null) {
				keys.add(buf);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (Exception e2) {
					// ig
				}
			}
		}
		return keys;
	}

}

 

 

4、远端使用程序远程SSH执行命令,获取返回的流,得到Keys,但是,需要获得TC服务的账户,会有一定的安全问题,因为是内部系统,如果使用普通用户SUDO,其实也是可行的。

代码:

public class SSHCliTCListKeys implements TCListKeys {

	private String charset = "UTF-8";
	private String SSHUser = "root";
	private String SSHPswd = "!QAZ2wsx";
	private String SSHHost = "192.168.30.142";
	private String dataFileLocalPath = "/mnt/ttserver/tt_11212.tch";

	@Override
	public List<String> list(int top) {
		String shellCommand = "tchmgr list -nl -m " + top + " " + dataFileLocalPath;
		return executeRemoteShellCommand(shellCommand);
	}

	@Override
	public List<String> list() {
		String shellCommand = "tchmgr list -nl " + dataFileLocalPath;
		return executeRemoteShellCommand(shellCommand);
	}

	private List<String> executeRemoteShellCommand(String shellCommand) {
		List<String> keys = new ArrayList<String>();
		BufferedReader reader = null;
		Channel channel = null;
		Session session = null;
		JSch jsch = new JSch();
		try {
			session = jsch.getSession(SSHUser, SSHHost, 22);
			session.setPassword(SSHPswd);
			java.util.Properties config = new java.util.Properties();
			config.put("StrictHostKeyChecking", "no");
			session.setConfig(config);
			session.connect();
			channel = session.openChannel("exec");
			((ChannelExec) channel).setCommand(shellCommand);
			channel.setInputStream(null);
			((ChannelExec) channel).setErrStream(System.err);

			channel.connect();
			reader = new BufferedReader(new InputStreamReader(channel.getInputStream(), Charset.forName(charset)));
			String buf = null;
			while ((buf = reader.readLine()) != null) {
				keys.add(buf);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (Exception e2) {
					// ig
				}
			}
			channel.disconnect();
			session.disconnect();
		}
		return keys;
	}

	public String getCharset() {
		return charset;
	}

	public void setCharset(String charset) {
		this.charset = charset;
	}

	public String getSSHUser() {
		return SSHUser;
	}

	public void setSSHUser(String sSHUser) {
		SSHUser = sSHUser;
	}

	public String getSSHPswd() {
		return SSHPswd;
	}

	public void setSSHPswd(String sSHPswd) {
		SSHPswd = sSHPswd;
	}

	public String getSSHHost() {
		return SSHHost;
	}

	public void setSSHHost(String sSHHost) {
		SSHHost = sSHHost;
	}

	public String getDataFileLocalPath() {
		return dataFileLocalPath;
	}

	public void setDataFileLocalPath(String dataFileLocalPath) {
		this.dataFileLocalPath = dataFileLocalPath;
	}

}

 

5、在TC服务器上写个简单的Socket server,代理远端请求,在服务器上支持API或cli,返回给调用端。这个方法感觉最完美,没有安全问题,也实现了服务也业务解耦,只是,部署和维护麻烦了,多出来一个server,故障的可能性也稍微变大了些

 

6、另类方案,直接从业务本身出发,修改数据结,使用TT支持的memcached现有的API解决。

需要延迟删除的文件的数据结构:

key1:[{'deleteFileKey1':'yyyy-mm-dd'},..] //配置定义为:10-N个

key2:[....]

key3:[....]

key4:[....]

 

业务中,执行删除的时候,向使用循环遍历方式,找到空位或新插入keyN保存需要删除的fileKey

扫描遍历的逻辑(伪代码):

int i = 1;

while(memcacheClient.get("key"+i) != null){

    // do busi

    i++;

}

 

 

特点:程序逻辑实现和控制稍微复杂。好处是部署维护相当简单。

兄弟们,你们选哪个!?

 

 

 

分享到:
评论

相关推荐

    Zebra 888-TT/DT中文用户手册

    ### Zebra 888-TT/DT 中文用户手册知识点总结 #### 一、重要声明与合规性 - **所有权声明**:本手册提供的专有信息仅供操作和维护Zebra 888-TT/DT打印机的人员使用。未经Zebra Technologies Corporation明确书面...

    leetcode2sumc-LeetCode-practice-group:LeetCode-练习组

    解决方案 分享者 困难 124 二叉树最大路径和 标记 难的 297 序列化和反序列化二叉树 兰斯 难的 8/26 不 标题 解决方案 分享者 困难 895 最大频率堆栈 兰斯 难的 144 二叉树先序遍历 兰斯 中等的 145 二叉树后序遍历 ...

    2006南开上机100题

    while (*tt) { // 遍历字符串 switch (*tt) { case 'a': pp[0]++; break; case 'b': pp[1]++; break; case 'c': pp[2]++; break; // ... 其他情况省略 ... } tt++; // 指针后移 } } ``` **知识点总结:** ...

    C语言上机题目值得参考

    1. **数组操作**:遍历数组并进行数值累积,计算平均值。 2. **条件判断**:使用`if`语句判断每个元素是否低于平均值。 3. **返回值处理**:函数返回低于平均分的成绩数量。 #### 示例代码分析 ```c int fun(int ...

    TC-TT热电偶输入温度变送隔离器.pdf

    TC-TT热电偶输入温度变送隔离器是一种专门设计用于将热电偶信号转换为隔离的标准直流信号的变送器,适用于工业温度监测与控制系统。以下是关于TC-TT热电偶输入温度变送隔离器的主要知识点: 1. 热电偶信号输入与...

    南开二级C上机100题

    2. **循环结构**:利用`for`循环遍历数组中的每一个元素。 3. **条件判断**:使用`if`语句来决定是否将某个成绩加入到新数组中。 4. **算术运算**:计算平均分,这里涉及到了加法和除法运算。 **示例代码分析**: `...

    java实现递归调用

    在Java中,递归常用于解决需要重复执行相同任务但每次处理的数据不同的问题,例如遍历树形结构、计算阶乘、求解斐波那契数列等。本篇文章将详细介绍如何使用Java实现递归调用来遍历一棵树,并结合SQL代码进行说明。 ...

    Origamizer047汉化版(3D折纸模拟器)

    http://www.tsg.ne.jp/TT/software/Origamizer047.zip 其它: RigidOrigami009 模拟了运动学的刚性折纸从 *.opx 或 *.dxf 的折痕 http://www.tsg.ne.jp/TT/software/RigidOrigami009.zip FreeformOrigami030 任意...

    哈夫曼编解码完整c程序代码.pdf

    void Convert_tree(Huff HT, unsigned char T[100][100], int tt[100][100], int s, int *i, int j) { // 此函数用于转换哈夫曼树为字符矩阵表示 // 输入:哈夫曼树、字符矩阵、标记矩阵、起始列、当前行索引、列...

    NETBeans+IDE使用说明

    下载地址为 http://www.neea.edu.cn、http://www.ncre.cn/和 http://211.151.94.22/TT/NB_NCRE_V2_0711.zip。下载完成后,解压缩到 C 盘根目录下,启动快捷方式 nbncre.exe。 2. 基本概念 NetBeans IDE 中国教育...

    tair与redis比较

    Tair支持key/value和关系数据库两种数据方式,而Redis支持key/value方式。 Tair和Redis都是分布式缓存系统,但它们有不同的架构、功能和性能特点。Tair适用于缓存和持久化的场景,而Redis适用于缓存和持久化的场景...

    农产品肉类蔬菜可追溯平台的业务和技术解决方案-2.0.docx

    农产品肉类蔬菜可追溯平台的业务和技术解决方案-2.0.docx 本文将详细介绍农产品肉类蔬菜可追溯平台的业务和技术解决方案,涵盖平台简介、系统实现方案、肉类蔬菜追溯监管平台构成、平台功能介绍、项目实施方案和...

    TT 项目方案 計劃書

    TT的宗旨是简化用户的生活,通过提供自动化、智能化的解决方案,帮助用户节省时间、提升效率。它不仅关注技术层面的功能实现,更注重用户体验和实际问题的解决。 1.4. 市场及需求 TT瞄准的是一个庞大且不断增长的...

    tt:基于终端的打字测试

    安装Linux sudo curl -L https://github.com/lemnos/tt/releases/download/v0.4.0/tt-linux -o /usr/local/bin/tt && sudo chmod +x /usr/local/bin/ttsudo curl -o /usr/share/man/man1/tt.1.gz -L ...

    电装SMT智能制造行业MES整体解决方案qy_pptt.pptx

    电装SMT智能制造行业MES整体解决方案qy_pptt.pptx

    智能工厂解决方案.pptx

    2个生产基地 4个物流中心 15个维修中心 21个国家 研华全球布局 成立于 1983年5月 上市时间1999年12月 彭博资讯代码2395 TT MSCI综合 市值 3,860百万美金 全球员工数7,300多人 智能工厂解决方案全文共27页,当前为第...

    TT网页协议

    "TT网页协议"是一种专为特定网页交互设计的通信...为了更好地理解并使用这个协议,我们需要深入研究这些文件,尤其是`TT.cds`、`Adam.exe`和`解决方案.txt`,它们可能分别提供了协议的核心规则、主要执行体和部署指南。

    tt.rar_TT计算器_TT软件代码_tt.r_计算器中TT

    【标题】"tt.rar"是一个压缩包文件,其中包含了名为"TT计算器"的软件源代码。这个"TT软件代码"是作者初次尝试编程的作品,它主要用于实现计算功能。"tt.r"可能是源代码文件或者某种特定格式的资源文件,与计算器程序...

    tt打字+dosbox

    tt打字软件,附加dosbox;因为tt是很老的一个dos程序了,在windows下不能直接打开,需要安装dosbox。安装完dosbox之后,打开,并执行一下命令: 》mount c E:\tt 其中E:\tt是存放了tt.exe文件的目录。该命令是指将E:...

Global site tag (gtag.js) - Google Analytics