避免在cassandra中进行脏读和写入

时间:2016-01-22 11:56:07

标签: cassandra datastax cassandra-2.1

我正在使用Cassandra 2.1.12将事件数据存储在列族中。下面是用于创建.net客户端的c#代码,用于管理来自Cassandra的连接。现在的问题是插入/更新数据的速率非常高。所以,现在让我说在随后的请求中我在Cassandra中增加一个列值。但正如我所说的插入/更新率非常高。所以在第一次我的3节点集群中 我写的列的值将是1然后在下一个请求中我将读取此列的值并将其更新为2.但是如果值从其他节点获取,其中值尚未初始化为1.然后再次值将因此,现在为了解决这个问题,我还将consistency的值保持为QUORUM。但问题仍然存在。任何人都能告诉我可能的解决方案吗?

     private static ISession _singleton;

        public static ISession GetSingleton()
        {
            if (_singleton == null)
            {
                Cluster cluster = Cluster.Builder().AddContactPoints(ConfigurationManager.AppSettings["cassandraCluster"].ToString().Split(',')).Build();
                ISession session = cluster.Connect(ConfigurationManager.AppSettings["cassandraKeySpace"].ToString());
                _singleton = session;
            }
            return _singleton;
        }

1 个答案:

答案 0 :(得分:2)

不可能来实现您在cassandra中的目标。原因是,每个分布式应用程序都在CAP theorem范围内。据此,cassandra does not have Consistency

enter image description here

因此,在您的方案中,您尝试在多线程环境中多次更新相同的分区键,因此无法保证在所有线程中都能看到最新数据。如果您尝试使用小间隔间隙,那么您可能会在所有线程中看到最新数据。如果您的要求是递增/递减整数,那么您可以使用cassandra counters。但是cassandra计数器不支持在单个请求中检索更新的值。这意味着您可以请求增加计数器并有单独的请求来获取更新的值。无法在单个请求中递增和获取递增的值。如果您的要求是仅增加该值(例如计算查看页面的次数),那么您可以使用cassandra计数器。 Cassandra计数器不会错过任何增量/减量。你可以看到最后的实际数据。希望它有所帮助。