Top

Redis

Datenbanken - Datentypen - Transactions - Publish Subscribe - Lua

Ist ein advanced Key-Value Speicher im RAM der auf Port 6379 lauscht.
Redis ist im März 2009 unter BSD-Lizenz erschienen und wurde in C geschrieben.
Single-threaded und kommuniziert über TCP in einem simplen Textformat.

Der Key ist binary-save, kann also jede Art von Zeichen enthalten.

Die folgenden Datentypen können verwendet werden.

  • Strings
  • Hashes
  • Liste von Strings
  • Sets von Strings
  • Sortierte Sets von Strings

Den Client startet man einfach auf der Konsole.

$ redis-cli
redis 127.0.0.1:6379>

Die Version von Redis abfragen.

$ redis-cli --version

Security

Redis ist konzipiert um in einer vertrauten Umgebung zu laufen.
In der Konfiigurationsdatei redis.conf kann ein Password vergeben werden.

requirepass thisShouldBeAVeryLongPassword

Datenbanken

In der Konfiigurationsdatei redis.conf ist die Anzahl der Datenbanken eingetragen.

databases 16

Die Datenbanken haben einen null basierten Index und werden über diesen angesprochen.

redis> select 4
OK

Die Anzahl der Datenbanken

CONFIG GET databases
1) "databases"
2) "16"

Datentypen nutzen

Daten mit get, set eintragen und abfragen.

redis> set key "value"
OK

redis> get key
"value"

Mit incr, decr, incrby, decrby kann man sehr einfach Counter erstellen.

redis> set counter 1
OK

redis> incr counter
(integer) 2

redis> incrby counter 10
(integer) 12

Hashes kann man mit hset, hget, hincrby, hgetall, hkeys und hvals nutzen.

redis> hset product:123 name "Produktname"
(integer) 1

redis> hset product:123 price 35.00
(integer) 1

redis> hset product:123 quantity 20
(integer) 1

redis> hget product:123 name
"Produktname"

redis> hincrby product:123 quantity 10
(integer) 30

redis> hgetall product:123
1) "name"
2) "Produktname"
3) "price"
4) "35.00"
5) "quantity"
6) "30"

redis> hkeys product:123
1) "name"
2) "price"
3) "quantity"

redis> hvals product:123
1) "Produktname"
2) "35.00"
3) "30"

Listen kann man mit rpush, lpop, rpop, llen und lrange nutzen.

redis> rpush news "Erste Nachricht"
(integer) 1

redis> rpush news "Zweite Nachricht"
(integer) 2

redis> rpush news "Dritte Nachricht"
(integer) 3

redis> lpop news
"Erste Nachricht"

redis> rpop news
"Dritte Nachricht"

redis> llen news
(integer) 1

redis> lrange news 0 1
1) "Zweite Nachricht"

Sets kann man mit sadd, smembers und sismember nutzen.

redis> sadd dataset 1
(integer) 1

redis> sadd dataset 2
(integer) 1

redis> sadd dataset "drei"
(integer) 1

redis> smembers dataset
1) "drei"
2) "1"
3) "2"

redis> sismember dataset 2
(integer) 1

Sortierte Sets kann man mit zadd und zrange nutzen.

redis> zadd highscore 1 "Peter"
(integer) 1

redis> zadd highscore 3 "Anja"
(integer) 1

redis> zadd highscore 2 "Mathias"
(integer) 1

redis> zrange highscore 0 -1
1. "Peter"
2. "Mathias"
3. "Anja"

Transactions

Seit Version 2.2 kann Redis eine Gruppe von Kommandos ausführen, eine Transaktion startet man mit multi die anschliessenden Kommandos werden nicht direkt ausgeführt sondern erst wenn exec ausgeführt wird.

redis> MULTI
OK
redis> incr counter
QUEUED
redis> incrby counter 10
QUEUED
redis> EXEC
1) (integer) 1
2) (integer) 11

Publish Subscribe

Seit Version 2.0.0 kennt Redis noch weitere Kommandos publish, subscribe und unsubscribe.
Redis nutzt Kanäle, wo Empfanänger registriert werden. Wenn Sender an einen Kanal senden leitet Redis die Nachricht an alle registrierten Empfänger weiter.

redis> SUBSCRIBE notification
redis> PUBLISH notification "Be notified."
redis> UNSUBSCRIBE notification

Lua

Seit Version 2.6.0 kann Redis auch Lua Skripte nutzen. Lua Skripte werden nach einigen Sekunden beendet, während der Ausführung wartet alles andere.

$ redis-cli EVAL <script> <numkeys> <keys> <args>
$ redis-cli EVAL "$(cat script.lua)" 0
$ redis-cli --eval script.lua

Die Anzahl der Keys wird mit dem zweiten Parameter gesetzt, weitere Parameter werden als Args behandelt.

$ redis-cli EVAL "return {KEYS[1],ARGV[1],ARGV[2]}" 1 key arg1 arg2
1) "key"
2) "arg1"
3) "arg2"

$ redis-cli EVAL "return {KEYS[1],KEYS[2],ARGV[1]}" 2 key1 key2 arg1
1) "key1"
2) "key2"
3) "arg1"

Lua Skripte können in einen Cache geladen und dann über einen SHA1 ausgeführt werden.

$ redis-cli SCRIPT LOAD "$(cat script.lua)"
"9a75deb3062cf54f7b68e90630a8961bb841e2ef"

$ redis-cli EVALSHA 9a75deb3062cf54f7b68e90630a8961bb841e2ef 0
Schauen ob Skripte im Cache vorhanden sind und den Cache löschen.

$ redis-cli SCRIPT EXISTS 9a75deb3062cf54f7b68e90630a8961bb841e2ef
1) (integer) 1

$ redis-cli SCRIPT FLUSH
OK

$ redis-cli SCRIPT EXISTS 9a75deb3062cf54f7b68e90630a8961bb841e2ef
1) (integer) 0

Ein einfaches Skript um die Werte mehrerer Keys (sumA, sumB, etc.) zu addieren.

local sum = 0
local matches = redis.call('KEYS', 'sum*')

for _,key in ipairs(matches) do
    local val = redis.call('GET', key)
    sum = sum + tonumber(val)
end

return sum

$ redis-cli --eval sum_values.lua
(integer) 6