← Назад к вопросам
Какие знаешь виды нереляционных БД?
2.3 Middle🔥 151 комментариев
#Кэширование и NoSQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
NoSQL базы данных
Определение и назначение
NoSQL (Not Only SQL) — это класс баз данных, которые отличаются от традиционных реляционных БД отсутствием фиксированной схемы и использованием различных моделей данных. Они масштабируются горизонтально и оптимизированы для специфических типов данных.
1. Документоориентированные БД
Хранят данные в виде документов (обычно JSON или BSON).
MongoDB
// Подключение
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
MongoDatabase database = mongoClient.getDatabase("myapp");
MongoCollection<Document> collection = database.getCollection("users");
// Вставка документа
Document user = new Document()
.append("name", "John")
.append("age", 30)
.append("email", "john@example.com")
.append("skills", Arrays.asList("Java", "MongoDB", "Spring"));
collection.insertOne(user);
// Поиск документов
Document foundUser = collection.find(new Document("name", "John")).first();
// Обновление
collection.updateOne(
new Document("name", "John"),
new Document("$set", new Document("age", 31))
);
// Удаление
collection.deleteOne(new Document("name", "John"));
Особенности:
- Гибкая схема (Schema-less)
- Простое хранение иерархических данных
- Поддержка запросов по вложенным полям
- Горизонтальная масштабируемость через sharding
CouchDB
// CouchDB использует HTTP API
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:5984/mydb"))
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Особенности:
- Distribuированная репликация
- REST API
- Встроенный full-text search
- Оффлайн-первый дизайн
2. Системы типа ключ-значение
Хранят простые пары ключ-значение для максимальной скорости.
Redis
// Подключение через Jedis
Jedis jedis = new Jedis("localhost", 6379);
// Простые строковые значения
jedis.set("username", "john");
String username = jedis.get("username");
// Сложные структуры
jedis.hset("user:1", "name", "John");
jedis.hset("user:1", "age", "30");
Map<String, String> user = jedis.hgetAll("user:1");
// Списки
jedis.rpush("tasks", "task1", "task2", "task3");
List<String> tasks = jedis.lrange("tasks", 0, -1);
// Множества
jedis.sadd("tags", "java", "spring", "database");
Set<String> tags = jedis.smembers("tags");
// С истечением времени (TTL)
jedis.setex("session:123", 3600, "sessionData");
// Кэширование результатов
String cachedResult = jedis.get("query:result");
if (cachedResult == null) {
cachedResult = expensiveQuery();
jedis.setex("query:result", 3600, cachedResult);
}
Особенности:
- Очень быстрый доступ (в памяти)
- Поддерживает различные структуры данных
- Идеален для кэширования
- Pub/Sub для обмена сообщениями
Memcached
// Простой кэш, похож на Redis
MemcachedClient client = new MemcachedClient();
client.set("key", 3600, "value");
String value = (String) client.get("key");
3. Поисковые системы
Оптимизированы для полнотекстового поиска.
Elasticsearch
// Spring Data Elasticsearch
@Document(indexName = "articles")
public class Article {
@Id
private String id;
@Field(type = FieldType.Text, analyzer = "standard")
private String title;
@Field(type = FieldType.Text)
private String content;
}
// Репозиторий
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
List<Article> findByTitleContains(String title);
}
// Использование
@Service
public class SearchService {
@Autowired
private ArticleRepository articleRepository;
public List<Article> search(String query) {
return articleRepository.findByTitleContains(query);
}
}
Особенности:
- Быстрый полнотекстовый поиск
- Анализ текста и морфология
- Аналитика в реальном времени
- Очень масштабируема
4. Графовые БД
Хранят данные в виде графов (узлы, рёбра).
Neo4j
// Spring Data Neo4j
@Node
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
@Relationship(type = "KNOWS")
private Set<Person> knows;
}
// Запросы через Cypher
public interface PersonRepository extends Neo4jRepository<Person, Long> {
@Query("MATCH (p:Person)-[:KNOWS]-(other) WHERE p.name = $name RETURN other")
List<Person> findFriends(@Param("name") String name);
}
// Использование
List<Person> friends = personRepository.findFriends("John");
Особенности:
- Оптимален для социальных сетей
- Быстрые обходы графа
- ACID гарантии
- Пример: LinkedIn, Facebook
5. Колончатые хранилища
Хранят данные по колонкам вместо строк, хороши для аналитики.
Apache Cassandra
// DataStax Driver
Cluster cluster = Cluster.builder()
.addContactPoint("localhost")
.build();
Session session = cluster.connect();
// Вставка данных
session.execute("INSERT INTO users (id, name, age) VALUES (1, John, 30)");
// Выборка
ResultSet results = session.execute("SELECT * FROM users WHERE id = 1");
for (Row row : results) {
System.out.println(row.getString("name"));
}
Особенности:
- Распределённая архитектура
- Высокая доступность
- Масштабируется горизонтально
- Write-heavy приложения
6. Временные ряды БД
Оптимизированы для хранения метрик во времени.
InfluxDB / Prometheus
// Запись метрик в Prometheus
Counter requestCounter = Counter.build()
.name("requests_total")
.help("Total requests")
.register();
requestCounter.inc();
// Гистограмма для отслеживания времени отклика
Histogram responseTime = Histogram.build()
.name("response_time_seconds")
.help("Response time")
.register();
long start = System.currentTimeMillis();
// ... выполнение операции
responseTime.observe((System.currentTimeMillis() - start) / 1000.0);
Особенности:
- Оптимизированы для временных рядов
- Сжатие данных
- Быстрые агрегации
- Мониторинг и метрики
Сравнительная таблица
| БД | Тип | Масштабируемость | Консистентность | Пример |
|---|---|---|---|---|
| MongoDB | Document | Горизонтальная | Eventual | Каталоги продуктов |
| Redis | Key-Value | Вертикальная | Strong | Кэширование, сессии |
| Elasticsearch | Search | Горизонтальная | Eventual | Поиск в контенте |
| Neo4j | Graph | Вертикальная | Strong | Социальные сети |
| Cassandra | Columnar | Горизонтальная | Eventual | Временные ряды, логи |
Выбор БД для Java проекта
- Кэш быстро меняющихся данных → Redis
- Гибкие структуры данных → MongoDB
- Поиск текста → Elasticsearch
- Связи между данными → Neo4j
- Высоконагруженные пишущие нагрузки → Cassandra
- Метрики и логи → InfluxDB / Prometheus