Базы данных: введение, часть четвертая
Илья Тетерин
2011-10-12
(use arrow keys or PgUp/PgDown to move slides)
Илья Тетерин
2011-10-12
(use arrow keys or PgUp/PgDown to move slides)
The calculation of the Fibonacci value for a number is a serious issue.
I request as a feature the command FIB.
Use of the command: redis-cli > FIB 10
55
ИТАР ТАСС: В работе российского почтового интернет-сервиса "Мейл.ру" произошел сбой
МОСКВА, 10 октября. /ИТАР-ТАСС/. Пользователи крупнейшего российского почтового сервиса "Мейл.ру" ... испытывают трудности с доступом к своим почтовым ящикам. При попытке проверить почту или открыть письмо на экране появляются сообщения то об ошибке сервера, то о перегрузке базы данных.
Проблемы с доступом к почтовому сервису начались примерно в полдень, при этом остальные сервисы портала "Мейл.ру" работают нормально.
roem.ru 11.10.2011: В результате внедрения новой более оптимальной системы хранения данных произошел программно-аппаратный сбой. Наши специалисты устранили проблему в течении 2-х часов. Сбой состоял в недоступности почты для примерно 8-10% пользователей. Никаких потерь или утечей данных не было.
wikipedia:mail.ru ... почта (22,7 млн человек ежемесячно) ...
pulser: 22.7м в месяц ... 756k в день ... 30 000 человек в час ... 10% - это 3 000 человек в течение часа
это не много, не мало - это проблемы availability в кластере ... но они заметны на уровне ИТАР-ТАСС ...
Oracle / MySQL / PostgreSQL / HSQLDB
Key Value - Memcached, Redis
Document Store - MongoDB, CouchDB
Graph DB - Neo4j, HyperGraphDB, FlockDB
... etc ...
wikipedia:NoSQL ( рус )
На примере: дайте седьмую запись
Мы точно знаем что мы хотим получить и хотим получить одну единственную запись.
http://host:port/select?id=7
get 7\r\n
select * from users where id = 7
-- ключевое слово - команда
select
-- какие поля ( * )
fio, phone
-- ключевое слово - разделитель
from
-- имя коллекции
phones
-- ключевое слово - ограничения
where
-- ограничения через AND / OR
id = 7
String sql = "select * from persons where id = " + id
Person p = new Person(); // всё остальное null
p.setLastName("Smith");
ObjectCollection oc = QueryExecutor.execute(p);
Query q = new Query();
q.From("PERSON").Where(new EqCriteria("PERSON.LAST_NAME", "Smith"));
ObjectCollection oc = QueryExecutor.execute(q);
Class.forName("com.mysql.jdbc.Driver");
String myDatabaseURL = "jdbc:mysql://mydomain.com/database?user="
+ myUsername + "&password=" + myPassword;
java.sql.Connection con = DriverManager.getConnection(myDatabaseURL);
public interface Command {
void process(Processor p, String cmd) throws IOException;
boolean isApplicable(String cmd); }
public abstract class AbstractDump implements Command {
public boolean isApplicable(String cmd) {
return "/dump".equals(cmd) || "Dump".equals(cmd); }}
public class MasterDump extends AbstractDump {
public void process(Processor p, String cmd) throws IOException {
boolean result = PhoneBook.getPhoneBook().dump();
p.writeResponse(result ? "OK" : "ERROR"); }}
COMMANDS = new ArrayList();
COMMANDS.add(new MasterCommit());
COMMANDS.add(new MasterDump());
for (MasterCommand cmd : COMMANDS) {
if (cmd.isApplicable(string)) {
cmd.process(this, string);
break; }}
Person p = new Person();
p.setName(request.getParameter("name"))
p.setPhone(request.getParameter("phone"));Что можно сделать, дабы было быстрее
All you ever wanted to know about writing bloom filters
Bloom Filters - the math
m - колво битов, k - колво hash функций, n - колво ключей ... интересно при k > 2 и m/n > 10 ...
PreparedStatement ps = connection.prepareStatement( "select * from person where id = ?"); ps.setLong(1,7L); final ResultSet rs = ps.executeQuery();
http://code.google.com/apis/protocolbuffers/docs/overview.html
Why not just use XML?
Protocol buffers: