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