Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Packages
 Make 
 Iptables 
 Nmap 
 Apache 
 LFS 
 TUX 
 cURL 
 libpcap 
 Parted 
 Httpd 
 File managers 
 FFMPEG 
 RTMP 
 SQL 
 Test 
 Git 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...5170 
 Trees...940 
 Максвелл 3...871 
 Go Web ...823 
 William Gropp...803 
 Ethreal 3...787 
 Gary V.Vaughan-> Libtool...774 
 Ethreal 4...771 
 Rodriguez 6...766 
 Ext4 FS...755 
 Clickhouse...755 
 Steve Pate 1...755 
 Ethreal 1...742 
 Secure Programming for Li...732 
 C++ Patterns 3...716 
 Ulrich Drepper...698 
 Assembler...695 
 DevFS...662 
 Стивенс 9...651 
 MySQL & PosgreSQL...632 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

Redis

Redis — сетевое журналируемое хранилище данных типа «ключ — значение» с открытым исходным кодом. Хранит ключи в оперативной памяти, снабжена механизмами снимков и журналирования для обеспечения постоянного хранения. Также предоставляет операции для реализации механизма обмена сообщениями в паттерне publish — subscribe. Поддерживает репликацию данных с основных узлов на несколько подчинённых (master — slave replication).

Redis работает на большинстве POSIX систем, таких как Linux, *BSD, Mac OS X без каких-либо дополнений. Linux и Mac OS X — две операционные системы, в которых был разработан и в большей степени протестирован Redis, поэтому VMware рекомендует использовать именно их для развертывания. По состоянию на 2011 года, разработка Redis спонсируется компанией VMware.

Имеются клиенты для большого списка языков: C, C++, C#, Clojure, Lisp, Erlang, Java, JavaScript, Haskell, Lua, Perl, PHP, Python, Ruby, Scala, Go, Tcl, Rust.

Инсталляция

Идем по адресу http://redis.io/download и качаем исходники. На момент написания этой статьи последняя версия - 2.8.17. Распаковываем архив и запускаем команды:
 make
 make test
 make install
 
По умолчанию бинарники будут положены в /usr/local/bin. Для того, чтобы redis прописать в автозагрузку, нужно войти в подкаталог utils и запустить файл install_server.sh. Он задаст вам несколько вопросов, после чего пропишет все, что нужно:
 Port           : 6379
 Config file    : /etc/redis/6379.conf
 Log file       : /var/log/redis_6379.log
 Data dir       : /var/lib/redis/6379
 Executable     : /usr/local/bin/redis-server
 Cli Executable : /usr/local/bin/redis-cli
 Successfully added to chkconfig!
 Successfully added to runlevels 345!
 Starting Redis server...
 Installation successful!
 
После этого можно проверить redis. Запускаем команды:
  redis-cli
  ping
 

Типы данных

Redis - это не просто сервер, который хранит пары ключ-знаяение, это сервер, который может хранить произвольные структуры данных. Список поддерживаемых типов данных:
бинарные строки
списки
сеты
отсортированные сеты
хэши
битовые массивы
логи

Ключ по умолчанию имеет строковый тип. В качестве ключа можно использовать не просто строки, а бинарные строки. Для оптимального использования строк нужно придерживаться следующих правил:
длинные ключи - это плохо, например ключ размером в килобайт, поскольку операции с ключами в памяти начнут тормозить
очень короткие ключи - это тоже плохо, например, вместо "u1000flw" лучше использовать "user:1000:followers"
обычно ключ для читабельности состоит из составных частей, разделенных точкой или двоеточием, например "comment:1234:reply.to"
вообще говоря, допустим максимальный размер ключа - аж 512 метров

Для того, чтобы записать что-то в базу или прочитать из базы, используются команды get и set. Команда set по умолчанию затирает значение, которое уже существует в базе, в противном случае добавляет. Команде set можно добавить дополнительный параметр - nx либо xx. В первом случае, если в базе уже будет значение для данного ключа, никакой записи не будет, во втором будет записано новое значение поверх старого.

В redis имеются специальные операторы INCR, INCRBY, DECR, DECRBY., которые делают вычисления над строками, конвертируя их в числа (redis не хранит числа, но хранит строки, которые могут быть числами):

 
 > set counter 100
 OK
 > incr counter
 (integer) 101
 > incr counter
 (integer) 102
 > incrby counter 50
 (integer) 152
 
Можно за одну операцию сразу записывать или читать несколько ключей - команды MSET, MGET:
 
 > mset a 10 b 20 c 30
 OK
 > mget a b c
 1) "10"
 2) "20"
 3) "30"
 
Проверить наличие ключа можно с помощью команды EXISTS., удалить ключ вместе со значением можно командой DEL.:
 
 > set mykey hello
 OK
 > exists mykey
 (integer) 1
 > del mykey
 (integer) 1
 > exists mykey
 (integer) 0
 
Ключу можно задать время жизни - expire - по истечению которого ключ автоматически удаляется. Время устанавливается в секундах либо миллисекундах:
 
 > set key some-value
 OK
 > expire key 5
 (integer) 1
 > get key (immediately)
 "some-value"
 > get key (after some time)
 (nil) 
 

Списки

В redis есть тип данных - список или list. Время вставки элемента в такой список не зависит ни от позиции в списке, ни от размера самого списка, т.е. это величина постоянная. А вот время доступа к элементу зависит от размера списка, и чем больше список, тем больше времени. Добавить элемент в список можно командами LPUSH, RPUSH. Команда LRANGE выделяет диапазон элементов из списка:
 
 > rpush mylist A
 (integer) 1
 > rpush mylist B
 (integer) 2
 > lpush mylist first
 (integer) 3
 > lrange mylist 0 -1
 1) "first"
 2) "A"
 3) "B"
 
Аналогично можно извлекать элементы из списка с помощью команд LPOP, RPOP

Вообще списки удобно использовать при хранении в таких случаях, как например извлечение выборки последних десяти изменений. Для этого есть специальная разновидность списков - ограниченные списки, в которых лишние устаревшие элементы удаляются:

 
 > rpush mylist 1 2 3 4 5
 (integer) 5
 > ltrim mylist 0 2
 OK
 > lrange mylist 0 -1
 1) "1"
 2) "2"
 3) "3"
 
Списки имеют встроенные блокировки, когда с ними работают несколько процессов. Рассмотрим пример: имеется глобальный список, в который элементы ложатся с помощью команды LPUSH, а забираются командой RPOP. В этой схеме есть одно узкое место - клиент, который забирает элементы из списка, может обнаружить, что список пуст, и тогда он начинает долбить базу в бесконечном цикле. Для разрешения этой проблемы есть специальные команды BRPOP , BLPOP , в которых есть таймаут, по истечению которого они отпускают базу - в следующем случае мы ждем 5 секунд :
 
   brpop tasks 5
 

Hashe

Хэш - или словарь - это встроенный тип данных, который представляет из себя коллекцию пар ключ-значение:
 
 > hmset user:1000 username antirez birthyear 1977 verified 1
 OK
 > hget user:1000 username
 "antirez"
 > hget user:1000 birthyear
 "1977"
 > hgetall user:1000
 1) "username"
 2) "antirez"
 3) "birthyear"
 4) "1977"
 5) "verified"
 6) "1"
 
 > hmget user:1000 username birthyear no-such-field
 1) "antirez"
 2) "1977"
 3) (nil)
 
Размер хэша ограничен только размером вашей памяти.

Set

Сет - неотсортированная коллекция уникальных строк. Вставка, удаление, проверка элемента - по времени константа и не зависит от размера сета. Добавление элементов:
 
 > sadd myset 1 2 3
 (integer) 3
 > smembers myset
 1. 3
 2. 1
 3. 2
 
Проверка:
 
 > sismember myset 3
 (integer) 1
 > sismember myset 30
 (integer) 0
 
Копирование сета:
 
 sunionstore myset myset2
 
Получить размер сета:
 
  scard myset
 
Есть отсортированная разновидность сетов. Рассмотрим пример создания такого сета, где год рождения будет выступать в роли индекса сортировки:
 
 > zadd hackers 1940 "Alan Kay"
 (integer) 1
 > zadd hackers 1957 "Sophie Wilson"
 (integer 1)
 > zadd hackers 1953 "Richard Stallman"
 (integer) 1
 > zadd hackers 1949 "Anita Borg"
 (integer) 1
 
Тогда извлечение элементов будет в отсортированном порядке:
 
 > zrange hackers 0 -1
 4) "Alan Kay"
 5) "Anita Borg"
 6) "Richard Stallman"
 7) "Sophie Wilson"
 
Чтобы получить список тех, кто родился после 1950:
 
 > zrangebyscore hackers -inf 1950
 1) "Alan Kay"
 2) "Anita Borg"
 
Можно удалить хакеров в диапазоне:
 
 zremrangebyscore hackers 1940 1960
 
Можно получить индекс:
 
 zrank hackers "Anita Borg"
 (integer) 4
 
Можно использовать лексическую индексацию:
 
  zadd hackers 0 "Alan Kay" 0 "Sophie Wilson" 0 "Richard Stallman" 0
   "Anita Borg" 0 "Yukihiro Matsumoto" 0 "Hedy Lamarr" 0 "Claude Shannon"
   0 "Linus Torvalds" 0 "Alan Turing"
 
После чего получаем список, отсортированный по алфавиту:
 
 zrange hackers 0 -1
 1) "Alan Kay"
 2) "Alan Turing"
 3) "Anita Borg"
 4) "Claude Shannon"
 5) "Hedy Lamarr"
 6) "Linus Torvalds"
 7) "Richard Stallman"
 8) "Sophie Wilson"
 9) "Yukihiro Matsumoto"
 
Извлечь в дипазоне по символам
 
 zrangebylex hackers [B [P
 1) "Claude Shannon"
 2) "Hedy Lamarr"
 3) "Linus Torvalds"
 

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье