Cassandra学习笔记

Cassandra数据结构

1. Cassandra Terminology

  • 列(column): 一个对象的名/值对(name/value pair).
  • 行(row): 存放列的容器(一组关联的列归为一组),由一个主键引用/标识。
    • 每一行的唯一标识称为主键(primary key)行键(row key)
  • 分区(partition): 将一组相关的行进行分组,一起存储在相同的节点上。
    • 这些相关的行就组成一个分区,每个分区由一个分区键标识
    • 这时的主键比较特殊,称为复合键(composite key)或者组合键(compound key).
    • 复合键由一个分区键(partition key)和一组可选的集群列(clustering column)组成。
      • 分区键确定行存储在哪个节点,可以包含多个列。
      • 集群列用于控制分区中数据如何排序与存储。
      • 静态列(static column): 存储不属于主键但是由一个分区中所有行共享的数据。
  • 表(table): 按分区组织的行的容器。
  • 键空间(keyspace): 按表组织的容器。
  • 集群(cluster): 键空间的容器,包括一个节点或者多个节点。

主键”永恒“: 表创建完成后,主键就不能修改,因为主键会控制集群中数据如何分布,数据如何在不同的节点磁盘上存储。

2. Cassandra数据组织结构图示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 其他

  1. 集群(cluster): 多个节点共同协作,最终用户看来,所有节点表现就像一个实例。Cassandra集群有时也叫做环(ring),因为Cassandra将所有的节点组织成一个环,并依次将数据分配到节点上。
  2. 键空间:类似于关系数据库中的数据库(database),是Cassandra数据模型中标的容器。键空间有一个名字,也有一组属性定义键空间范围的行为,如replica。键空间的容器是集群。
  3. :表也是一个容器,包含一个有序的行集合,每一行本身则是一个有序的列集合
    • 行按分区组织,根据分区键的列(可能有多个)分配到Cassandra集群中的节点。
    • 一个分区中数据的顺序由集群列确定。

    向表中写入数据时,可以为一列或多列指定值,值的集合称为一行。
    主键中包含的列,必须为其中的每一个列都指定值,因为要用它们一起来唯一标识一行数据。

  4. 列: 列是Cassandra数据模型中最基本的数据结构单元,包含一个name/value对。每个列的值根据定义时的数据类型设定对应值。列还包含如下两个属性:
    • 时间戳(timestamp): 每次向Cassandra写入数据时,会为插入或者更新的各个列值生成一个时间戳(单位是微秒)。如果多个写操作试图修改同一个值,Cassandra内部使用”最后写获胜(last write wins)“来解决冲突。可以使用writetime()函数查看列值的写入时间。
      	cqlsh:my_space> select first_name, last_name, writetime(title) from user;
      	 first_name | last_name | writetime(title)
      	------------+-----------+------------------
      	       Bill |    Nguyen | 1722158562120950
      	
      	(1 rows)
      	cqlsh:my_space> 
      
    • 生存时间(TTL): Cassandra提供了一个非常强大的特性,能够让不需要的数据自动过期。可以为列值(列这一级进行操作)设置生存时间(TTL, time to live),指示这个值需要保存多久。
      • TTL默认值为null,标识写入数据不会过期。
      • 可以使用TTL()函数查看列值有些时间。
      • UPDATE时增加USING TTL选项,可以在UPDATE操作时设置列的TTL。
      • INSERT时增加USING TTL选项,整行数据在TTL之后都会过期,数据会被删除。
      • INSERT时未设置TTL,UPDATE时不能对整行设置TTL,因为TTL是基于列级别。可能的方式使用upsert(对于已经存在的主键行,使用INSERT语句执行UPDATE操作)。
        主键不允许设置TTL,也不能通过writetime()查看写入时间。
        cqlsh:my_space> select writetime(first_name) from user;
        InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot use selection function writetime on PRIMARY KEY part first_name"
        cqlsh:my_space> 
        
        upsert操作为行设置TTL
        # 插入时未设置row的TTL
        cqlsh:my_space> insert into  user (first_name, last_name, title) values ('Jim', 'Green', 'Mr.');
        cqlsh:my_space> 
        cqlsh:my_space> 
        cqlsh:my_space> select * from user;
        
         last_name | first_name | title
        -----------+------------+-------
             Green |        Jim |   Mr.
            Nguyen |       Bill |   Mr.
        
        (2 rows)
        #查询结果显示TTL为null
        cqlsh:my_space> select last_name, first_name, ttl(title) from user;
        
         last_name | first_name | ttl(title)
        -----------+------------+------------
             Green |        Jim |       null
            Nguyen |       Bill |       null
        
        (2 rows)
        # upsert方式:insert操作使用同样的primary key,实际执行的是update操作,同时为行设置了TTL
        cqlsh:my_space> insert into  user (first_name, last_name, title) values ('Jim', 'Green', 'Mr.') USING TTL 100;
        cqlsh:my_space> 
        cqlsh:my_space> 
        # 立马查询可以看到TTL行有97秒
        cqlsh:my_space> select last_name, first_name, ttl(title) from user;
        
         last_name | first_name | ttl(title)
        -----------+------------+------------
             Green |        Jim |         97
            Nguyen |       Bill |       null
        
        (2 rows)
        #一段时间后查询,数据已经被删除。
        cqlsh:my_space> select last_name, first_name, ttl(title) from user;
        
         last_name | first_name | ttl(title)
        -----------+------------+------------
            Nguyen |       Bill |       null
        
        (1 rows)
        cqlsh:my_space> 
        
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cassandra中建表的方式有多种,可以使用CQL命令或Java代码来创建表。引用中给出了使用Java代码创建表的示例。通过调用Ddl.createTable方法,可以传递一个Java Bean对象作为第一个参数,该对象包含了表的结构信息,第二个参数指示是否覆盖原来的表。具体示例代码如下: ```java Ddl.createTable(new CassandraTable(), false); ``` 引用中提到了在使用Cassandra建立新表时遇到的错误。该错误可能是由DOWN节点引起的架构版本不匹配导致的。如果不是这个问题,可以检查system.local和system.peers中节点的架构版本。需要确保所有节点的架构版本一致。 引用中给出了一个建表语句的示例,使用CQL命令在tutorialspoint键空间下创建了一个名为emp的表,包含了emp_id、emp_name、emp_city、emp_sal和emp_phone等列。 综上所述,要在Cassandra中建表,可以使用Java代码调用Ddl.createTable方法,也可以使用CQL命令执行CREATE TABLE语句。123 #### 引用[.reference_title] - *1* [根据Javabean创建Cassandra数据表](https://blog.csdn.net/abckingaa/article/details/123523901)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [cassandra建表异常处理 · Messay](https://blog.csdn.net/u011250186/article/details/112608110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [CASSANDRA学习笔记 (五)理解Cassandra的表](https://blog.csdn.net/kexinmei/article/details/103510782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值