近期简单写了一个基于Cassandra/C++的日志缓存,虽然是Nosql,但是在实际应用中,还是期望能有部分的临时CQL统计 或+-*/可以支持

所以在针对部分字段入库时,选择了作为整形录入,于是麻烦就来了。

1,第一个碰到的是 Not enough bytes to read value of component 0

经过百般测试发现在建表时的WITH COMPACT STORAGE干扰最大。当去掉该语句时,Thrift程序写入会报错,cql执行会通过。翻阅官网HANDBOOK后发现,

也许是出于节省磁盘空间的出发点,在2.0以后cql界面建表不再自带该参数,cli界面建表自动带上该参数。

根据官网解释,如果是复合主键的Column记录一起存储(或者说是打包存储),独立在外的Column记录单独存储(或者说是散列存储)。

话说回来,不管哪种DB,复合KEY用多了性能都会下降,同时有违P2P精神,也无法体现出cas强大的随机写。

2,第二个碰到的是 Exception: Default TException.  [Expected 4 or 0 byte int (1)]

恶心的事情来了:

正常建表全Column都是text,程序负责外部擦屁股,Thrift和cas之间相安无事。

某Column设定为int,cas的cql正常使用,但Thrift开始跟你搞了,报这个错给你看。

按cas源码column定义为:

97 std::string name;
98 std::string value;
99 int64_t timestamp;
100 int32_t ttl;

按thrift源码column定义为:

71 struct Column {
72 1: required binary name,
73 2: optional binary value,
74 3: optional i64 timestamp,
75 4: optional i32 ttl,
76 }

也就是string 转 binary有thrift完成,这一转转出一些道道:

但我们这样去写时会报错

sstemp.clear();
sstemp<<i;
sstemp>>key;

c.name="age";
c.value=i;
cass.insert(key,cparent,c,ConsistencyLevel::ONE);

改成这样去写

sstemp.clear();
sstemp<<i;
sstemp>>key;

c.name="age";
c.value="0021"; //必须4个字符
cass.insert(key,cparent,c,ConsistencyLevel::ONE);

虽然写进去了,但是新问题出现了,转就老老实实转,偏偏对字节进行了拆分补位。。。。

这就没法看了,那为什么会这样?将808464945放到calc中看一下,发现高位4bit被补了0011

也就是 00110000 00110000 00110010 00110001

如果按初始值就是 00110000 00110000 00110000 00110000 按照 2^N SUM,初始值变为了808464432。

继续翻了thrift源码【/root/soft/thrift-0.9.1/lib/cpp/src/thrift/transport】好久,无果,放弃。

这样做意味着写的时候被搞了一把,读的时候,还的再搞一把,而且只能4个字节或者0字节,也就是程序只能写0~9999的整数。这样做显然不合适。

由于insert的源码写的很清楚了,都是封装的对象,不再会有第二种insert 所以,尝试了cas的另外一个datatype:varint

官网解释:精度整形 varint。

依旧是这套写代码,但是value我们不做string ,直接改int赋给string,于是,果然各种强。

至此,搞定了两大数据类型text和int,虽然还是有不少问题有待查证,但是应付一个TASK也算马马虎虎了。

PS:环境 cqlsh 4.1.0 | Cassandra 2.0.2 | CQL spec 3.1.1 | Thrift protocol 19.38.0

关于Cassandra与Thrift在int/text/varint上的暧昧的更多相关文章

  1. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  2. PeopleSoft Rich Text Boxes上定制Tool Bars

      在使用PT8.50或在8.51时,你可能遇到过Rich-text编辑框.该插件使你能够格式化文本,添加颜色.链接.图片等等.下面是效果图: 如果页面中只有这么一个字段,该文本框就会有足够的空间来容 ...

  3. 如何在sublime text 3 上安装插件package control

    今天由于帮同事搞web方面的东西,于是又重新安装了sublime text 这款神器.发现官方网站都更新到sublime text3了,于是下载装了下,突然发现少了很重要的一个功能,竟然没有packa ...

  4. 别在int与float上栽跟头(转)

    源:http://www.cnblogs.com/luguo3000/p/3719651.html int与float是我们每天编程都用的两种类型,但是我们真的足够了解它们吗.昨天在博客园看到一个比较 ...

  5. 别在int与float上栽跟头

    int与float是我们每天编程都用的两种类型,但是我们真的足够了解它们吗.昨天在博客园看到一个比较老的笑话: “昨天晚上下班回家,一民警迎面巡逻而来.突然对我大喊:站住!民警:int 类型占几个字节 ...

  6. 在sublime Text 3上编写并运行java程序

    参考 首先肯定是安装JDK配置环境变量,这个就不多说了. 第二步下载和安装sublime Text3. 第三步,创建一个批处理文件,命名为runJava.bat,放在JDK的bin下: @ECHO O ...

  7. sublime text 3 上安装xdebug

    安装完成之后启动xdebug,缺省设置下会显示warning等信息,很不方便. 可以参考 https://github.com/martomo/SublimeTextXdebug/blob/maste ...

  8. Cassandra 类型转换限制

    原文地址:http://stackoverflow.com/questions/31880381/cassandra-alter-column-type-which-types-are-compati ...

  9. cassandra 存储二进制data

    Blob type The Cassandra blob data type represents a constant hexadecimal number defined as 0[xX](hex ...

随机推荐

  1. HDU 4864Task(更多的联合培训学校1)(贪婪)

    职务地址:pid=4864">HDU4864 这题又是一上来觉得是最小费用流,可是边太多.果然,敲完交上去后不断TLE.. 小优化了两次也没过. . . sad.. 后来看了题解才发现 ...

  2. iOS多用连接、反向协议、安全

    资源 WWDC-2013-Session-708 BlackHat-US-2014-"It Just (Net)works" Understanding Multipeer Con ...

  3. Source insight 3572安装和版本号An invalid source insight serial number was detected解

    Source insight最新版本3572 下载链接:http://www.sourceinsight.com/down35.html,   http://www.sourceinsight.com ...

  4. Java实现 Base64、MD5、MAC、HMAC加密(转)

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  5. 【嵌入式开发】写入开发板Linux系统-模型S3C6410

    笔者 : 万境绝尘 转载请著名出处 最终拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...

  6. dispatch_once认识分析

    dispatch_once为了确保代码运行一次 +(NSDateFormatter*)getDBDateFormat { static NSDateFormatter* format; static ...

  7. Java线

    线程是一个单一的程序流程.多线程是指一个程序,可以在同一时间执行多个任务.每个任务是由一个单独的线程以完成.那.够同一时候在一个程序中执行,而且每个线程完毕不同的任务.程序能够通过控制线程来控制程序的 ...

  8. SQL Server 2008 R2 安全性专题(一):安全原则

    原文:SQL Server 2008 R2 安全性专题(一):安全原则 本系列主要专注与SQL Server 2005以后的DBMS,由于本人工作使用2008 R2,所以目前就针对2008 R2来做说 ...

  9. java类和对象之间的差

    java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...

  10. Sizzle.selectors.relative [ 源代码分析 ]

    1 jQuery 对象Sizzle.selectors.relative中存放了块间关系符和相应的块间关系过滤函数,称为"块间关系过滤函数集" 块间关系符共同拥有4种,其含义和过滤 ...