`
LIMIMGJIE
  • 浏览: 174041 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cassandra(三)--编写java代码对分布式数据库进行操作

阅读更多
本文主要关注两个部分,
1. 怎么写一个最简单cassandra的sample
2. 通过代码,了解cassandra的数据模型及隐藏在后面的交互逻辑


步骤一:
首先我们创建一个工程,然后将cassandra/lib目录下的包,导入到我们的工程中。
步骤二:
创建一个类,内容如下:
import org.apache.cassandra.thrift.Cassandra;
import org.apache.cassandra.thrift.Column;
import org.apache.cassandra.thrift.ColumnPath;
import org.apache.cassandra.thrift.ConsistencyLevel;
import org.apache.cassandra.thrift.InvalidRequestException;
import org.apache.cassandra.thrift.NotFoundException;
import org.apache.cassandra.thrift.TimedOutException;
import org.apache.cassandra.thrift.UnavailableException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;


 public class SampleOne {  
     static Cassandra.Client cassandraClient;  
     static TTransport socket;
   
   
     private static void init() throws TTransportException {  
         String server = "192.168.1.129";  
//    	 String server = "localhost";
         int port = 9160;  
   
         /* 首先指定cassandra server的地址 */  
         socket = new TSocket(server, port);  
         System.out.println(" connected to " + server + ":" + port + ".");  
   
   
         /* 指定通信协议为二进制流协议 */  
         TBinaryProtocol binaryProtocol = new TBinaryProtocol(socket, false, false);  
         cassandraClient = new Cassandra.Client(binaryProtocol);  
   
   
         /* 建立通信连接 */  
         socket.open();  
     }  
   
   
     public static void main(String[] args) throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException {  
         /* 初始化连接 */  
         init();  
   
   
         /* 选择需要操作的Keyspaces, 可以理解成数据库的表 */  
         String keyspace= "Keyspace1";  
         String row = "employee";  
   
         /* 创建一个Table Name */  
         String tableName = "Standard2";
         
         /* 插入一条记录 */
         insertOrUpdate(keyspace,tableName,row,"name","happy birthday!",System.currentTimeMillis());
         /* 删除一条记录 */
         //delete(keyspace,tableName,row,"name",System.currentTimeMillis());
         /* 获取一条记录 (由于插入和删除是同一条记录,有可能会检索不到哦!请大家主意!*/
         Column column = getByColumn(keyspace,tableName,row,"name", System.currentTimeMillis());
         System.out.println("read row " + row);  
         System.out.println("column name " + ":" + new String(column.name));  
         System.out.println("column value" + ":" + new String(column.value));  
         System.out.println("column timestamp" + ":" + (column.timestamp));  
         
         close();
     }
     
     /**
      * 插入记录
      */
     public static void insertOrUpdate(String tableSpace,String tableName, String rowParam,String ColumnName,String ColumnValue,long timeStamp)  
     	throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException{
         /* 选择需要操作的Keyspaces, 存放数据表所在的空间位置 */  
         String keyspace= tableSpace;
         /* 数据所在的行标 */
         String row = rowParam;  
   
         /* 创建一个column path */  
         ColumnPath col = new ColumnPath(tableName);  
         col.setColumn(ColumnName.getBytes()); 
         
         /* 执行插入操作,指定keysapce, row, col, 和数据内容, 后面两个参数一个是timestamp, 另外一个是consistency_level 
          * timestamp是用来做数据一致性保证的, 而consistency_level是用来控制数据分布的策略,前者的理论依据是bigtable, 后者的理论依据是dynamo 
          */  
        cassandraClient.insert(keyspace, row, col,"i don't know".getBytes(), System.currentTimeMillis(), ConsistencyLevel.ONE);
	 }
     
     /**
      * 删除记录
      */
     public static void delete(String tableSpace,String tableName, String rowParam,String ColumnName,long timeStamp) 
     	throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException{
         /* 选择需要操作的Keyspaces, 存放数据表所在的空间位置 */  
         String keyspace= tableSpace;
         /* 数据所在的行标 */
         String row = rowParam;  
   
         /* 创建一个column path */  
         ColumnPath col = new ColumnPath(tableName);  
         col.setColumn(ColumnName.getBytes()); 
         
         /* 执行删除操作,指定keysapce, row, col, 后面两个参数一个是timestamp, 另外一个是consistency_level 
          * timestamp是用来做数据一致性保证的, 而consistency_level是用来控制数据分布的策略,前者的理论依据是bigtable, 后者的理论依据是dynamo 
          */  
        cassandraClient.remove(keyspace, row, col, System.currentTimeMillis(), ConsistencyLevel.ONE);
	 }
     
     /**
      * 获取数据
      */
     public static Column getByColumn(String tableSpace,String tableName, String rowParam,String ColumnName,long timeStamp) 
  	throws TException, TimedOutException, InvalidRequestException, UnavailableException, NotFoundException{
      /* 选择需要操作的Keyspaces, 存放数据表所在的空间位置 */  
      String keyspace= tableSpace; 
      /* 数据所在的行标 */
      String row = rowParam;  

      /* 创建一个column path */  
      ColumnPath col = new ColumnPath(tableName);  
      col.setColumn(ColumnName.getBytes()); 
      
      /* 执行查询操作,指定keysapce, row, col, timestamp 
       * timestamp是用来做数据一致性保证的, 而consistency_level是用来控制数据分布的策略,前者的理论依据是bigtable, 后者的理论依据是dynamo 
       */  
      Column column = cassandraClient.get(keyspace, row, col, ConsistencyLevel.ONE).column;  
      return column;
	 }
     
     
     /**
      *	关闭当前的远程访问连接
      */
     public static void close() {
    	 socket.close();
	}
 }  

为了比较好的理解这些名词解释,我们先看看cassandra的数据模型:


Cassandra 的数据模型的基本概念:
keyspace:
用于存放 ColumnFamily 的容器,相当于关系数据库中的 Schema 或 database,
ColumnFamily :
用于存放 Column 的容器,类似关系数据库中的 table 的概念。

SuperColumn :
它是一个特列殊的 Column, 它的 Value 值可以包函多个 Column

{   // 这是一个SuperColumn
    name: "李明杰",
   // 包含一系列的Columns
   value: {
	street: {name: "street", value: "1234 x street", timestamp: 123456789},
	city: {name: "city", value: "san francisco", timestamp: 123456789},
	zip: {name: "zip", value: "94107", timestamp: 123456789},
   }
}

Columns:
Cassandra 的最基本单位。由 name , value , timestamp 组成
{  // 这是一个column
  name: "李明杰",
  value: "mydream.limj@gmali.com",
  timestamp: 123456789
} 


cassandra的数据模型主要就是由上述几种模型构建而成的,很简单吧,的确是这样,最大的好处就是读写数据的API非常简单.
  • 大小: 11.5 KB
分享到:
评论
4 楼 helloppx 2010-10-25  
我觉的那张图片有些问题
在SuperCloumn下 应该是 name &  value吧
而不是 key & columns
3 楼 vvvpig 2010-09-08  
我实验啦一下查询没问题,插入和删除时有时不成功,还都是原来的数据
2 楼 LIMIMGJIE 2010-08-04  
目前从负载均衡到缓存设计都有简易的通过硬件平行扩充的策略,只有数据库还处于比较单调的单点模式,未来的分布式数据库将成为主流的WEB服务数据承载模式,将有更多的分布式数据存储策略产生
1 楼 jammyjaccy 2010-08-03  
KEY-VALUE型非关系数据库。貌似现在都用这个啦,学学。相信只有好处没有坏处。

相关推荐

    java分布式事务demo

    Java分布式事务是大型分布式系统中不可或缺的一个重要组成部分,它确保在多个网络节点间的数据操作能够保持一致性和完整性。在分布式环境中,由于多个服务之间可能存在数据交互,因此需要一种机制来处理跨服务的数据...

    Java分布式应用学习笔记

    Java分布式应用学习笔记 在Java世界中,分布式应用是指由多个独立组件通过网络通信协同工作的系统。这种架构模式常用于构建大规模、高可用性、可扩展的系统。本笔记将深入探讨Java分布式应用的核心概念、技术和实践...

    kundera-cassandra-pelops-2.12.zip

    【标题】"Kundera-Cassandra-Pelops-2.12.zip" 是一个与Apache Cassandra数据库相关的开源项目,Kundera是一个对象关系映射(ORM)框架,专为分布式NoSQL数据库设计,特别是针对Cassandra。这个版本2.12的Kundera包含...

    Java数据库系统项目开发实践代码大全之2

    在本项目"Java数据库系统项目开发实践代码大全之2"中,我们主要关注的是使用Java语言进行数据库系统的开发和实践。这个项目包含了多个章节的源代码,分别对应不同的主题和功能,包括第4章、第5章、第6章、第7章、第8...

    java技能百练--数据库篇

    11. **NoSQL数据库**:随着大数据和分布式系统的发展,NoSQL数据库(如MongoDB、Cassandra、Redis等)的使用也越来越广泛。Java也有相应的API来支持这些非关系型数据库。 学习“Java技能百练--数据库篇”将有助于你...

    java面试大全涉及到数据库

    7. **数据库复制与集群**:理解主从复制、多主复制、分片等技术,以及如何通过分布式数据库解决高并发和高可用性问题。 8. **NoSQL数据库**:随着大数据和实时分析的需求,NoSQL数据库(如MongoDB、Cassandra、...

    java数据库技术详解ppt

    最后,可能会涉及到Java与NoSQL数据库的集成,如MongoDB、Cassandra等。这些非关系型数据库在大数据处理、高并发场景下有独特优势,Java提供了诸如Jongo、Morphia等库来简化与NoSQL数据库的交互。 总结起来,这份...

    cassandra javaDriver21.pdf

    Cassandra是一个开源的NoSQL分布式数据库系统,而Java Driver是用于在Java应用与Cassandra数据库之间进行通信的客户端库。这份文档详细介绍了如何通过Java操作Cassandra,包括新增、删除、修改、查询数据等操作,...

    Java 数据库编程宝典

    最后,随着NoSQL数据库的兴起,书中可能还会包含MongoDB、Cassandra等非关系型数据库的Java操作,以及如何在Java中实现分布式数据库的解决方案。 综上所述,《Java数据库编程宝典》是一本全面讲解Java数据库编程的...

    Python-分布式系统资源大列表

    在分布式数据库方面,Cassandra、MongoDB和Riak等NoSQL数据库提供了良好的水平扩展能力,适合大数据场景。Python有对应的驱动程序,如cassandra-driver、pymongo和riak-py,便于与这些数据库进行交互。而对于关系型...

    cpp-KairosDB是基于Cassandra存储的快速时间序列数据库

    它以其高性能和可扩展性著称,其背后的核心存储机制是Apache Cassandra,这是一款分布式NoSQL数据库系统,确保了数据的高可用性和水平扩展能力。 KairosDB的优势在于其灵活性和定制化能力。由于它建立在Cassandra之...

    基于Java数据库编程及其应用分析.zip

    分布式数据库如Cassandra、HBase等,以及微服务架构下的数据存储和访问策略也是现代Java数据库编程需要关注的领域。 以上内容仅是对"基于Java数据库编程及其应用分析"主题的初步概述,具体PDF文档可能会深入讨论每...

    java部分数据库课件

    "Java部分数据库课件"可能涵盖了一系列主题,旨在帮助学习者理解和掌握如何使用Java与各种数据库进行交互。下面将详细讨论这些相关知识点。 1. JDBC(Java Database Connectivity):JDBC是Java平台的标准API,用于...

    spring boot与cassandra集成,使用原生驱动。

    在本文中,我们将深入探讨如何将Spring Boot框架与Cassandra数据库集成,并利用其原生驱动进行数据操作。Spring Boot以其简化配置和快速启动的特点,深受开发者喜爱,而Cassandra作为分布式NoSQL数据库,广泛用于...

    Cassandra cpp Driver 2.1

    Apache Cassandra是一个开源的、分布式的NoSQL数据库管理系统,以其高性能、可扩展性和高可靠性而受到广泛关注。随着数据量的不断增加和对数据处理速度要求的提升,Cassandra在大数据存储和分析方面占据着重要位置。...

    数据库系统工程师考试大纲

    - 分布式数据库概念:理解分布式数据库的架构和原理,如CAP定理和BASE原则。 - 数据分片与复制:掌握数据分片策略和数据复制技术(如主从复制、多活架构)。 6. **云数据库服务**: - 云数据库产品:了解主流云...

    数据库 代码 学习 整理

    而非关系型数据库(如MongoDB、Cassandra、Redis)则采用不同的数据模型,如文档型、键值对、图形或列族,适合处理大规模、分布式和实时的数据。 在学习数据库时,理解SQL(Structured Query Language)至关重要。...

    Cassandra JDBC Driver 0.8.2

    2. **遵循 JDBC 规范**:该驱动程序按照 JDBC(Java Database Connectivity)规范设计,提供了一个标准化的接口,使得开发人员能够在不深入了解 Cassandra 本身的底层机制的情况下,使用熟悉的 JDBC 代码来操作 ...

    Java及大数据相关的一些代码

    3. HBase或Cassandra的Java客户端:这些是分布式数据库,用于存储大规模非结构化数据,Java API可以用来进行数据操作。 4. 数据预处理和清洗:Java可以用于数据清洗,例如去除重复值、处理缺失值等。 5. 大数据可视...

Global site tag (gtag.js) - Google Analytics