和cassandra数据库交互的方式有两种,一种是通过类似于cassandra-cli命令的thrift api,或者通过cassandra提供的cql(cassandra query lanugage),.

注意:cassandra-cli客户端命令从cassandra V2.2已经弃用,所以想使用cassandra-cli命令的话只能安装cassandra V2.2之前的版本。cassandra-cli命令比较难懂,和传统的sql有很大的区别,对于我们学习起来是比较头疼的事情。cql api的语法风格类似于sql,该api屏蔽了cassandra底层架构,将底层的数据结构以sql的形式展现出来。推荐学习cassandra的时候一定好好研究一下该thrift api的使用,cassandra-cli可以帮助我们深入了解cassandra的内部存储结构。

1. keyspace(键空间)

首先查看当前cluster默认的data center

[cassandra@sht-sgmhadoopcm- bin]$ nodetool status
Datacenter: EAST
================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.16.101.54 51.66 KB 100.0% d821e5e5-e99d-41a9-b11f-a0fd0d3d9b05 RAC1

可以看到当前集群默认有一个data center EAST,当前cassandra节点在RAC1机柜,该data center的定义涉及到两个配置文件

$CASSANDRA_HOME/conf/cassandra.yaml的“endpoint_snitch: PropertyFileSnitch“参数

$CASSANDRA_HOME/conf//cassandra-topology.properties

查看创建keyspace的语法并创建 mytest keyspace

[default@unknown] help create keyspace;
...................
Examples:
create keyspace Keyspace2
with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy'
and strategy_options = {replication_factor:4};
create keyspace Keyspace3
with placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy'
and strategy_options={DC1:2, DC2:2};
create keyspace Keyspace4
with placement_strategy = 'org.apache.cassandra.locator.OldNetworkTopologyStrategy'
and strategy_options = {replication_factor:1}; [default@unknown] create keyspace mytest with placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy' and strategy_options={EAST:1};
78c6f3e9-622c-3ae8-86d2-7733518ca7ff [default@unknown] describe mytest; WARNING: CQL3 tables are intentionally omitted from 'describe' output.
See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details. Keyspace: mytest:
Replication Strategy: org.apache.cassandra.locator.NetworkTopologyStrategy
Durable Writes: true
Options: [EAST:1]
Column Families:

2. column family(列族)

[default@unknown] use mytest;
[default@mytest] create column family users with column_type=Standard and comparator=UTF8Type and key_validation_class=UTF8Type and default_validation_class=UTF8Type;
bd4ffef6-9e93-38ec-a4fc-62b4fc00604c
[default@mytest] describe users; WARNING: CQL3 tables are intentionally omitted from 'describe' output.
See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details. ColumnFamily: users
Key Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Default column value validator: org.apache.cassandra.db.marshal.UTF8Type
Cells sorted by: org.apache.cassandra.db.marshal.UTF8Type
GC grace seconds: 864000
Compaction min/max thresholds: 4/32
Read repair chance: 0.0
DC Local Read repair chance: 0.1
Caching: KEYS_ONLY
Default time to live: 0
Bloom Filter FP chance: default
Index interval: default
Speculative Retry: NONE
Built indexes: []
Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
Compression Options:
sstable_compression: org.apache.cassandra.io.compress.LZ4Compressor

通过上述创建users列族可以看到,我们仅仅是指定了列族级别的属性(相当于表的属性),但是该列族没有任何列。

我们也可以通过meta_data选项在创建column family的时候加入预定义的列以及索引信息

[default@mytest] create column family students
... with column_type = 'Standard'
... and comparator = UTF8Type
... and key_validation_class=UTF8Type
... and default_validation_class=UTF8Type
... and column_metadata = [
... {column_name: age, validation_class: UTF8Type}
... {column_name: birthday, validation_class: UTF8Type, index_type: KEYS,index_name: IDXbirthday}
... {column_name: first, validation_class: UTF8Type}
... {column_name: last, validation_class: UTF8Type}
... ];
[default@mytest] describe students; WARNING: CQL3 tables are intentionally omitted from 'describe' output.
See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details. ColumnFamily: students
Key Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Default column value validator: org.apache.cassandra.db.marshal.UTF8Type
Cells sorted by: org.apache.cassandra.db.marshal.UTF8Type
GC grace seconds: 864000
Compaction min/max thresholds: 4/32
Read repair chance: 0.0
DC Local Read repair chance: 0.1
Caching: KEYS_ONLY
Default time to live: 0
Bloom Filter FP chance: default
Index interval: default
Speculative Retry: NONE
Built indexes: [students.IDXbirthday]
Column Metadata:
Column Name: first
Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Column Name: birthday
Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Index Name: IDXbirthday
Index Type: KEYS
Column Name: age
Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Column Name: last
Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
Compression Options:
sstable_compression: org.apache.cassandra.io.compress.LZ4Compressor

其中

  • column_type定义列的类型,默认为标准列
  • comparator 在查询数据时返回的列的排序方式,注意这里是列名,不是列的值,可以根据long、byte、UTF8等其他排序方式进行,同时也意味着当列名显示在命令行界面时,它们将显示为UTF8Type(可读)文本。在Cassandra中是无法按照关系型数据中的值来排序的,必须按照列名来排序,以便能从一个很宽的行里高效取出一列,而无需把每列都读进内存。
  • key_validation_class 定义row key(主键)的数据类型
  • default_validation_class 定义value的数据类型

3. set&get/list&del/count(插入更新&查询&删除&统计)

语法 set column family[‘row key‘]['key']='value'

[default@mytest] set users['zhangpeng']['first']='zhang';
Value inserted.
Elapsed time: 3.83 msec(s).
[default@mytest] set users['zhangpeng']['last']='peng';
Value inserted.
Elapsed time: 2.69 msec(s).
[default@mytest] set users['zhangpeng']['age']='';
Value inserted.
Elapsed time: 1.97 msec(s).
[default@mytest] set users['wangxing']['first']='wang';
Value inserted.
Elapsed time: 1.64 msec(s).
[default@mytest] set users['wangxing']['last']='xing';
Value inserted.
Elapsed time: 1.4 msec(s).
[default@mytest] set users['wangxing']['age']='';
Value inserted.
Elapsed time: 1.38 msec(s).
[default@mytest] set users['wangxing']['sex']='male';
Value inserted.
Elapsed time: 1.38 msec(s). [default@mytest] get users['zhangpeng'];
=> (name=age, value=18, timestamp=1527690907938000)
=> (name=first, value=zhang, timestamp=1527690887611000)
=> (name=last, value=peng, timestamp=1527690898435000)
Returned 3 results.
Elapsed time: 3.68 msec(s). [default@mytest] get users['wangxing'];
=> (name=age, value=19, timestamp=1527690946003000)
=> (name=first, value=wang, timestamp=1527690926424000)
=> (name=last, value=xing, timestamp=1527690934083000)
=> (name=sex, value=male, timestamp=1527690962938000)
Returned 4 results.
Elapsed time: 3.46 msec(s). [default@mytest] set users[wangxing]['age']='';
Value inserted.
Elapsed time: 10 msec(s).
[default@mytest] get users['wangxing'];
=> (name=age, value=17, timestamp=1527691267345000)
=> (name=first, value=wang, timestamp=1527690926424000)
=> (name=last, value=xing, timestamp=1527690934083000)
=> (name=sex, value=male, timestamp=1527690962938000)
Returned 4 results.
Elapsed time: 3.67 msec(s).
[default@mytest] del users['wangxing']['sex'];
cell removed.
Elapsed time: 14 msec(s).
[default@mytest] get users['wangxing'];
=> (name=age, value=17, timestamp=1527691267345000)
=> (name=first, value=wang, timestamp=1527690926424000)
=> (name=last, value=xing, timestamp=1527690934083000)
Returned 3 results.
Elapsed time: 4.84 msec(s). [default@mytest] count users['wangxing'];
3 cells
[default@mytest] count users['zhangpeng'];
3 cells
[default@mytest] count users['wangxing'];
3 cells
[default@mytest] list users;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: wangxing
=> (name=age, value=19, timestamp=1527692441512000)
=> (name=first, value=wang, timestamp=1527692429554000)
=> (name=last, value=xing, timestamp=1527692435344000)
-------------------
RowKey: zhangpeng
=> (name=age, value=18, timestamp=1527692421898000)
=> (name=first, value=zhang, timestamp=1527692409752000)
=> (name=last, value=peng, timestamp=1527692416150000) 2 Rows Returned.
Elapsed time: 6.55 msec(s).

4. index

默认情况下我们不可以通过where限制条件查询数据,否则会报如下错误,我们可以为需要where条件的列增加索引,但是只局限于where的等值查询

[default@mytest] get users where age='';
No indexed columns present in index clause with operator EQ
[default@mytest] update column family users with column_metadata=[{column_name : age, validation_class : UTF8Type, index_type : KEYS,index_name : IDXage}];
b2a8c0af-4162-3590-acda-70ccdb7d363c
[default@mytest] get users where age='';
-------------------
RowKey: wangxing
=> (name=age, value=17, timestamp=1527692751954000)
=> (name=first, value=wang, timestamp=1527692429554000)
=> (name=last, value=xing, timestamp=1527692435344000) 1 Row Returned.
Elapsed time: 70 msec(s).

通过cassandra-cli客户端了解cassandra的内部数据结构的更多相关文章

  1. redis底层设计(一)——内部数据结构

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  2. redis内部数据结构

    redis内部数据结构,是指redis在自身的构建中,基于这些特定的内部数据结构进行的. 简单动态字符串:Simple Dynamic String 双端链表 字典:Dictonary 跳跃表:ski ...

  3. redis 源码阅读 内部数据结构--字符串

    redis的内部数据结构主要有:字符串,双端链表,字典,跳跃表. 这里主要记录redise字符串的设计.相关的源码位于:src/sds.h 和 src/sds.c.   一 字符串 sds的结构体 s ...

  4. 你真的懂redis的数据结构了吗?redis内部数据结构和外部数据结构揭秘

    Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有序集合SortedSet. 很多人面试时都遇到过这种场景吧? 其实除了上面的几种常见数据结构,还需要加上数据结 ...

  5. [转]Redis内部数据结构详解-sds

    本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被 ...

  6. redis内部数据结构和外部数据结构揭秘

    Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有序集合SortedSet. 很多人面试时都遇到过这种场景吧? 其实除了上面的几种常见数据结构,还需要加上数据结 ...

  7. Redis学习笔记-Redis内部数据结构

    Redis内部数据结构 Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值.它支持的value值的类型如下: sds (simple dynamic string) ...

  8. 你真的懂了redis的数据结构吗?redis内部数据结构和外部数据结构揭秘

    原文链接:https://mp.weixin.qq.com/s/hKpAxPE-9HJgV6GEdV4WoA Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有 ...

  9. 探索Redis设计与实现6:Redis内部数据结构详解——skiplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

随机推荐

  1. .NET 介绍

    In order to continue our effort of being modular and well factored we don’t just provide the entire ...

  2. jquery 获取元素(父节点,子节点,兄弟节点),元素筛选

    一, js 获取元素(父节点,子节点,兄弟节点)   var test = document.getElementById("test"); var parent = test.p ...

  3. Linux 命令之sed

    简介 sed 是一种在线编辑器,它一次处理一行内容.在处理的时候,会先把当前处理的行存储在临时缓冲区,这被称之为 "末世空间", 然后再使用 sed 命令处理缓冲区的内容,处理完成 ...

  4. Java 基础功底

    Java 基础语法特性: 首先了解并做好Java Web 开发环境配置(包含 JDK 的配置)是非常必要的.其中 CLASSPATH 的值开始必须包含 ".",否则用 javac ...

  5. Bootstrap 固定导航条

    默认情况下,导航条的定位属性为 static,它的位置由它的HTML代码中定义的顺序出现,并随着页面向下滚动而消失.也可以改变它的定位方式,让它固定显示在浏览器窗口的顶部或底部. 1.固定在顶部 如果 ...

  6. hdu 4349 Xiao Ming's Hope 规律

    Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. Tomat和JDK安装配置

    昨天重装了一下系统,升级成了win10,原先配置好的jdk和tomcat信息都没有了,所以重新配置一下,做一个小记录 首先去官网下载java JDK和Tomcat,这个不提了,下载之后安装,安装完毕后 ...

  8. 跳跳虎回家(国庆10.1模拟赛T2)

    题目: [题目描述] 跳跳虎在外面出去玩忘了时间,现在他需要在最短的时间内赶回家. 跳跳虎所在的世界可以抽象成一个含有 n 个点的图(点编号从 1 到 n ),跳跳虎现在在 1 号点,跳跳虎的家在 n ...

  9. sublime3 mac : Package Control There are no packages available for installation

    如下问题: 查看控制台:点击 ctrl+`打开控制台 发现是因为http://packagecontrol.io/channel_v3.json 获取失败,手动下载channel_v3.json文件, ...

  10. java常用技术名词解析

    1.1 token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便 将此Token返回给客户端,以后客户端只需带上这个Token前来请求数 ...