项目中要遍历,对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中文用户手册,中文小王子
解决方案 分享者 困难 124 二叉树最大路径和 标记 难的 297 序列化和反序列化二叉树 兰斯 难的 8/26 不 标题 解决方案 分享者 困难 895 最大频率堆栈 兰斯 难的 144 二叉树先序遍历 兰斯 中等的 145 二叉树后序遍历 ...
TC-TT热电偶输入温度变送隔离器pdf,TC-TT热电偶输入温度变送隔离器
http://www.tsg.ne.jp/TT/software/Origamizer047.zip 其它: RigidOrigami009 模拟了运动学的刚性折纸从 *.opx 或 *.dxf 的折痕 http://www.tsg.ne.jp/TT/software/RigidOrigami009.zip FreeformOrigami030 任意...
安装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 ...
2个生产基地 4个物流中心 15个维修中心 21个国家 研华全球布局 成立于 1983年5月 上市时间1999年12月 彭博资讯代码2395 TT MSCI综合 市值 3,860百万美金 全球员工数7,300多人 智能工厂解决方案全文共27页,当前为第...
独家发布运营版游戏陪玩平台,仿比心游戏陪玩平台源码/tt语音聊天/美女约玩/声优服务/陪玩系统源码开黑/约玩源码下载 好友分享的,看起来还不错,据说来自互站,这个类型的资源不太好评估价值,索性分享给大家,...
文档总结了tair与redis的有缺点,提供给大家应用多为参考
tt打字软件,附加dosbox;因为tt是很老的一个dos程序了,在windows下不能直接打开,需要安装dosbox。安装完dosbox之后,打开,并执行一下命令: 》mount c E:\tt 其中E:\tt是存放了tt.exe文件的目录。该命令是指将E:...
智慧环卫解决方案,智慧环卫管理一体化系统大数据平台综合管理数据可视化解决方案
第一章 概述 第二章 平台简介 第三章 系统实现方案 第四章 肉类蔬菜追溯监管平台构成 第五章 肉类蔬菜追溯监管平台功能介绍 第六章 项目实施方案 第七章 项目预估报价表
1.1. TT概述 2 1.2. TT特性 2 1.3. TT宗旨 2 1.4. 市场及需求 2 第二章、核心模块 2 2.1. TT提醒模块 2 2.2. TT快捷模块 2 2.3. TT自动登录模块 2 2.4. TT网络同步模块 2 第三章、后期扩展及盈利 2 3.1. 后期扩展 2 ...
TT的使用指南,还有一些测试报告 ,很好用
【0.12.4-R2】逃离塔科夫SCAV等级和技能【TT】【2020/05/25】【离线版】【此MOD只对本端SCAV有效,不是所有BOT(因SCAV模式与AI用的同一BOT包,因此修改血量会影响到所有BOT),附加修改了体力,负重,耐力,水和...
本文实例讲述了Python3遍历目录树的方法。分享给大家供大家参考。具体实现方法如下: import os, fnmatch # 检查一个目录,后者某个包含子目录的目录树,并根据某种模式迭代所有文件 # patterns如:*.html,若大小写...
很全的Quartus II中警告总结,对初学者很有帮助
518tt投票软件功能: 智能高效:全自动投票,投票软件能自动拨号换ip 极速体验:投票速度快,正常情况下一台电脑可达每分钟8-12票,可多台电脑一起运行 真实有效:投票软件对数据封包发送,采用智能技术,确保为有效...
TT网页协议
使用与CMS在s = 8 TeV的pp碰撞中收集的19.6 fbâ1积分光度相对应的数据样本,对横截面比率σtt′bb′/ σtt′jj进行首次测量 大型强子对撞机的探测器。 选择具有两个轻子(e或¼)和四个重构喷气机(包括两个被...
TT语音pc