In-memory база данных GridGain поддерживает ACID-транзакции и ANSI-99 SQL

Платформа GridGain® включает в себя In-memory базу данных, которая поддерживает API обработки данных, включая SQL, key-value, вычисления, машинное обучение и многое другое. In-memory СУБД GridGain может обеспечить работу современных высокодоступных, высокопроизводительных приложений в решении, которое обеспечивает скорость оперативной памяти и может быть масштабировано для хранения петабайтов данных.

In-memory база данных GridGain в памяти поддерживает не только сценарии OLTP и OLAP, но и гибридную транзакционно-аналитическую обработку (HTAP). GridGain распределяет датасет по кластеру серверов, а возможности распределенного SQL позволяют читать и записывать в базу данных, используя стандартные команды через интерфейс ODBC / JDBC. Система поддерживает ACID-транзакции и ANSI-99 SQL, включая DDL и DML.

Memory-centric архитектура GridGain позволяет выполнять распределенные SQL, key-value и другие операции на разных уровнях памяти. Если в вашей организации используются различные технологии памяти, такие как DRAM, энергонезависимая память и 3D XPoint, вы можете настроить конфигурацию своей системы на использование комбинации параметров памяти, которая обеспечивает наилучший компромисс между ценой и производительностью.

In-Memory Database
In-memory база данных GridGain обеспечивает гарантии ACID-транзакций и соответствие ANSI-99 SQL

In-memory СУБД GridGain обеспечивает до 1 000 раз более высокую производительность приложений, чем дисковые базы данных, потому что ваши данные хранятся и обрабатываются в оперативной памяти. GridGain разворачивается на распределенном кластере серверов, которые обеспечивают масштабируемость базы данных. GridGain можно легко масштабировать, добавляя узлы в кластер, а система автоматически перебалансирует ваши данные.

Вы можете узнать больше о возможностях In-memory СУБД GridGain и о том, как они вписываются в архитектуру платформы, прочитав наш технический документ (на русском языке). Чтобы узнать больше о разнице между In-memory базой данных и in-memory дата гридом, прочитайте пост в блоге (на английском).

In-memory база данных с архитектурой, ориентированной на память

Встроенная функция постоянного хранилища позволяет совместить производительность и масштабируемость In-memory вычислений с надежностью диска. Распределенное дисковое хранилище, ACID- и ANSI-99 SQL совместимо. Его можно развернуть на HDD на SSD дисках, 3D XPoint и других технологиях хранения. В память помещаются только актуальные пользовательские данные. Регулируя их объем, можно достичь приемлемого в каждом конкретном случае компромисса между затратами на инфраструктуру и производительностью приложений. При этом данные на диске полностью работоспособны, и нет необходимости ждать их полной загрузки в оперативную память до начала обработки в случае перезапуска кластера. Постоянное хранилище предоставляет преимущества HTAP без необходимости держать все свои данные в памяти.

Примеры


Ignite ignite = Ignition.ignite();
// Get an instance of named cache.
final IgniteCache<integer, string=""> cache = ignite.jcache("cacheName");</integer,>
// Store keys in cache.
for (int i = 0; i &lt; 10; i++)
  cache.put(i, Integer.toString(i));
// Retrieve values from cache.
for (int i = 0; i &lt; 10; i++)
  System.out.println("Got [key=" + i + ", val=" + cache.get(i) + ']');
// Remove objects from cache.
for (int i = 0; i &lt; 10; i++)
  cache.remove(i);
// Atomic put-if-absent.
cache.putIfAbsent(1, "1");
// Atomic replace.
cache.replace(1, "1", "2");

Ignite ignite = Ignition.ignite();
// Clone every object we get from cache, so we can freely update it.
IgniteCache<integer, account=""> cache = ignite.jcache("cacheName");</integer,>
try (IgniteTx tx = Ignition.ignite().transactions().txStart()) {
  Account acct = cache.get(acctId);
  assert acct != null;
  // Deposit $20 into account.
  acct.setBalance(acct.getBalance() + 20);
  // Store updated account in cache.
  cache.put(acctId, acct);
  tx.commit();
}

Ignite ignite = Ignition.ignite();
// Get an instance of named cache.
final GridCache<string, integer=""> cache = ignite.jcache("cacheName");</string,>
// Lock cache key "Hello".
Lock lock = cache.lock("Hello");
lock.lock();
try {
  cache.put("Hello", 11);
  cache.put("World", 22);
}
finally {
  lock.unlock();
}

Ignite ignite = Ignition.ignite();
// Get an instance of named cache.
GridCache<long, person=""> cache = ignite.jcache("cacheName");</long,>
// Create query which selects salaries based on range.
CacheQuery<map.entry<long, person="">&gt; qry =
cache.queries().createSqlQuery(Person.class, "salary &gt; ? and salary &lt;= ?");</map.entry<long,>
// Execute queries for salary ranges.
print("People with salaries between 0 and 1000: ", qry.execute(0, 1000).get());
print("People with salaries between 1000 and 2000: ", qry.execute(1000, 2000).get());
 

Ignite ignite = Ignition.ignite();
// Get an instance of named cache.
GridCache<long, person=""> cache = ignite.jcache("cacheName");</long,>
// Create query which joins on 2 types to select people for a specific organization.
CacheQuery<map.entry<long, person="">&gt; qry =
cache.queries().createSqlQuery(Person.class, "from Person, Organization " +
"where Person.orgId = Organization.id " +
"and Organization.name = ?");</map.entry<long,>
// Execute queries for find employees for different organizations.
print("Following people are 'Ignite' employees: ", qry.execute("Ignite").get());
print("Following people are 'Other' employees: ", qry.execute("Other").get());

Learn More