Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
SVEUČILIŠTE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
V A R A Ž D I N
Mateo Tišljar
REDIS
ZAVRŠNI RAD
Varaždin, 2016.
SVEUČILIŠTE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
V A R A Ž D I N
Mateo Tišljar
Matični broj: 41452/12-R
Studij: Informacijski sustavi
REDIS
ZAVRŠNI RAD
Mentor:
Doc.dr.sc. Markus
Schatten
Varaždin, kolovoz 2016.
1. Uvod ...................................................................................................................................... 1
2. NoSQL ................................................................................................................................... 2
2.1. Polustrukturirani model podataka ................................................................................... 2
2.2. NoSQL tipovi baza podataka .......................................................................................... 5
2.2.1. Ključ-vrijednost ....................................................................................................... 5
2.2.2. Baza dokumenata .................................................................................................... 5
2.2.3. Grafovi ..................................................................................................................... 6
2.2.4. Stupci ....................................................................................................................... 6
2.3. Prednosti NoSQL-a ........................................................................................................ 6
2.4. Nedostaci NoSQL-a ........................................................................................................ 7
2.5. Primjeri SQL-a i NoSQL-a ............................................................................................. 7
2.5.1. Veze u ključ-vrijednost načinu pohranjivanja ....................................................... 10
3. Redis .................................................................................................................................... 12
3.1. Podržani programski jezici i tipovi podataka ............................................................... 12
3.2. Tko ga koristi? .............................................................................................................. 12
3.3. Instaliranje i uspostava Redis-a na Windows računalu ................................................ 13
3.4. Redis naredbe ............................................................................................................... 14
3.4.1. Pomoć .................................................................................................................... 15
3.4.2. Povratna poruka ..................................................................................................... 15
3.4.3. Nizovi .................................................................................................................... 16
3.4.3.1. SET ................................................................................................................. 16
3.4.3.2. GET ................................................................................................................ 17
3.4.3.3. INCR .............................................................................................................. 17
3.4.3.4. DECR ............................................................................................................. 18
3.4.3.5. APPEND ........................................................................................................ 18
3.4.3.6. GETRANGE .................................................................................................. 19
3.4.3.7. SETRANGE ................................................................................................... 20
3.4.4. Liste ....................................................................................................................... 20
3.4.4.1. LPUSH ........................................................................................................... 20
3.4.4.2. RPUSH ........................................................................................................... 20
3.4.4.3. LLEN .............................................................................................................. 21
3.4.4.4. LRANGE ........................................................................................................ 21
3.4.4.5. LPOP, RPOP .................................................................................................. 21
3.4.4.6. LINDEX ......................................................................................................... 22
3.4.4.7. LTRIM ........................................................................................................... 22
3.4.4.8. RPOPLPUSH ................................................................................................. 22
3.4.4.9. EXPIRE .......................................................................................................... 23
3.4.4.10. TTL, PERSIST ........................................................................................... 24
3.4.5. Sažetak ................................................................................................................... 25
3.4.5.1. HSET .............................................................................................................. 25
3.4.5.2. HGET ............................................................................................................. 25
3.4.5.3. HGETALL ..................................................................................................... 26
3.4.6. Skupovi .................................................................................................................. 26
3.4.6.1. SADD ............................................................................................................. 27
3.4.6.2. SMEMBERS .................................................................................................. 27
3.4.6.3. SDIFF, SDIFFSTORE ................................................................................... 27
3.4.6.4. SINTER, SINTERSTORE ............................................................................. 28
3.4.7. Sortirani skup ........................................................................................................ 29
3.4.7.1. ZADD ............................................................................................................. 29
3.4.8. HYPERLOLOGS .................................................................................................. 30
4. Aplikacija............................................................................................................................. 31
5. Zaključak ............................................................................................................................. 39
Literatura .................................................................................................................................. 40
1
1. Uvod
Tema ovog završnog rada je Redis. U uvodu će se nešto općenito govoriti o Redis-u i
NoSQL-u (eng. Not Only SQL), a kasnije će se detaljnije objasniti i opisati. Nakon toga će se
opisati naredbe Redis-a, pokazati implementacija, te na kraju pokazati i opisati aplikacija koja
je izrađena korištenjem nekih od programskih jezika u kombinaciji s Redis-om.
Redis je otvorenog koda, služi za pohranjivanje struktura podataka, služi kao baza
podataka, predmemorija te posrednik poruka. Podržava strukture podataka tipa znakovne
nizove (eng. String), sažetke (eng. Hash), liste, skupove (eng. Set), sortirane skupove, mape
bitova (eng. Bitmape), HyperLogLog algoritme (eng. Hiperloglogs) i geoprostorne indekse.
Redis održava i razvija Salvatore Sanfilippo, a za razvoj i pružanje koda također su značajnu
ulogu imali Pieter Noordhuis i Matt Stancliff. Njih dvojica su davali razne ideje, kodove i slično
za razvitak Redis-a i klijentskih biblioteka. Isto tako, svatko može biti dio razvitka Redis-a na
način da daje ideje, testira ili prijavljuje pogreške (eng. Buggs) koje zapazi. Svu se dosadašnju
arhivu može pronaći na Github-u na sljedećem linku: https://github.com/antirez/redis/issues.
Rad Salvatorea Sanfilippa za Redis sponzoriran je od strane Redis Labs-a, a također postoje i
mnogi drugi sponzori Redis-a. (Redis.io, dostupno 2016.)
U Redis-u se ne koriste uobičajeni upiti kao u SQL-u, već je on NoSQL sustav. NoSQL
obuhvaća vrlo široke varijacije različitih tehnologija koje su razvijene kao odgovor na zahtjeve
u modernim tehnologijama i aplikacijama. Tehnolozi rade s aplikacijama koje kreiraju mnogo
novih, konstantno mijenjajućih tipova podataka, strukturiranih i nestrukturiranih tipova te
polimorfne podatke. Danas aplikacije moraju konstantno biti dostupne, na svim uređajima i u
cijelome svijetu što je vrlo težak zadatak i on zahtijeva nove tehnologije. Relacijske baze
podataka nisu izrađene kako bi podržale današnje takve aplikacije pa je zato i nastao NoSQL
koji je fleksibilan i brz. Najjednostavnije i najpoznatije NoSQL baze podataka su tipa ključ-
vrijednost. Sam naziv nam govori da je svaki podatak pohranjen tako da ima svoje ime (ključ)
i svoju vrijednost. Redis, za razliku od nekih, dozvoljava da vrijednosti mogu imati tipove poput
cjelobrojne vrijednosti ili znakovnog niza. U idućem će se poglavlju detaljnije opisati i prikazati
NoSQL sustav, te razlika između NoSQL-a i SQL-a.
2
2. NoSQL
2.1. Polustrukturirani model podataka
Schatten i Ivković (2012) predstavili su jezik za postavljanje upita nad grafovima i
kontekstno slobodnu implementaciju u Prologu. Razvitkom svjetskog interneta, sve su se više
prenosili sve veći podaci koji su kompleksni i nepotpuni. Radi toga, bio je predstavljen
polustrukturirani model podataka kojemu su najveće prednosti mogućnost da reprezentira
podatke koji ne mogu tako lako biti ograničeni shemom. Polustrukturirani model podataka u
biti je temelj za većinu NoSQL baza podataka. Polustrukturirani model podataka često se naziva
i bezshemni model podataka. Ostale prednosti su fleksibilnost u prenošenju podataka, lakoća
reprezentiranja strukturiranih podataka i mogućnost promjene vlastite strukture po potrebi. Radi
svoje velike fleksibilnosti strukture proizlazi njegov nedostatak, a to je teško implementiranje
algoritama i upita pretraživanja podataka. Radi toga su predstavljeni razni programski jezici za
dohvaćanje i korištenje polustrukturiranih podataka. Među njima je i RPE (eng. Regular Path
Expression) kojeg su predstavili Schatten i Ivković (2012), no to nije tema ovog rada pa se time
ovdje nećemo baviti. Ako Vas zanima više, možete pogledati na sljedećoj web adresi :
https://bib.irb.hr/datoteka/594133.SchattenIvkovic2012.pdf.
Polustrukturirani model podataka bit će objašnjen preko definicija i grafova.
Definicija 1. (Usmjereni graf)
Neka je V skup vertikalnih čvorova i neka je 𝐵 ⊆ 𝑉 𝑥 𝑉 skup usmjerenih bridova (skup
usmjerenih parova i čvorova). Usmjereni graf ili digraf G je usmjeren par (V,B). Za svaki brid
𝑏 = (𝑣𝑖 , 𝑣𝑗) kažemo da je 𝑣𝑖 izvor, a 𝑣𝑗 odredište brida (Schatten, Ivković 2012).
Definicija 2. (Put)
Neka je 𝐺 = (𝑉, 𝐵) digraf. Svaki slijed bridova 𝑏1|𝑏2| … |𝑏𝑘 za koji je 𝑑𝑒𝑠𝑡(𝑏𝑖) =
𝑠𝑜𝑢𝑟𝑐𝑒(𝑏𝑖+1), 𝑖 = 1, 2, … , 𝑘 − 1 zove se put u grafu G od izvora 𝑠𝑜𝑢𝑟𝑐𝑒(𝑏1) do odredišta
𝑑𝑒𝑠𝑡(𝑏𝑘). Broj bridova na putu k nazvan je udaljenost (Schatten, Ivković 2012).
Definicija 3. (Korijen)
Tjeme 𝑣𝑘 zove se korijen digrafa 𝐺 = (𝑉, 𝐵), ako postoji put od 𝑣𝑘 do svakog tjemena 𝑣𝑖 ∈
𝑉, 𝑖 ≠ 𝑘 (Schatten, Ivković 2012).
3
Definicija 4. (Ciklus)
Ciklus je svaki put od nekog tjemena do njega samoga. Graf bez ciklusa naziva se aciklični
(Schatten, Ivković 2012).
Primjer
Neka su 𝐺 = (𝑉, 𝐵), 𝑉 = {𝑣1, 𝑣2, 𝑣3, 𝑣4}, 𝐵 = {𝑏1, 𝑏2, 𝑏3, 𝑏4, 𝑏5}.
Slika 1. Graf G (Schatten, Ivković 2012)
Taj se graf može prikazati grafički na sljedeći način:
Slika 2. Grafički prikaz grafa G (Schatten, Ivković 2012.)
Na grafu iznad mogu se vidjeti sljedeći putevi:
𝑏1 ; 𝑏2|𝑏3 ; 𝑏2|𝑏4|𝑏5 ; 𝑏5|𝑏4|𝑏5𝑏4|𝑏5 ; 𝑏2|𝑏4|𝑏5|𝑏3
Korijen grafa G je 𝑣1.
Ciklusi grafa G su: 𝑏4|𝑏5 ; 𝑏5|𝑏4 ; 𝑏4|𝑏5|𝑏4|𝑏5
4
Definicija 5 (Stablo)
Digraf (V, B) je stablo ako postoji jedinstveni put od 𝑣𝑘 do 𝑣𝑖 za svaki 𝑣𝑖 ∈ 𝑉. Prema tome,
svako stablo je aciklično i ima jedinstveni korijen (Schatten, Ivković 2012).
Definicija 6 (List)
Tjeme 𝑣 ∈ 𝑉 je list digrafa (V, B) ako ne postoji brid 𝑏 ∈ 𝐵 gdje je source(b) = v (Schatten,
Ivković 2012).
Definicija 7 (Dijagram podataka)
Dijagram podataka je digraf 𝐺𝐷 = (𝑉, 𝐵) čiji su bridovi označeni, a vertikale su objekti
podataka koji mogu biti atomski (list) i spojevi (imaju listove prema drugim vertikalama).
Nadalje, govorit će se o grafovima podataka koji imaju samo jedan korijen. Prema tome, za
dijagrame podataka se može reći da su to u biti trojke 𝐺𝐷 = (𝑉𝑎 ∪ 𝑉𝐶 , 𝐵, 𝑟) gdje je 𝑟 ∈ 𝑉𝐴 ∪ 𝑉𝑐
(Schatten, Ivković 2012).
Slika 3. Graf G1 (Schatten, Ivković 2012)
5
Na grafu iznad, objekti identiteta označeni su sa 𝑜1, 𝑜2, 𝑜3. Derp, Derpina i Derpson su atomičke
vertikale, pa je prema tome 𝑉𝑎 = {𝐷𝑒𝑟𝑝, 𝐷𝑒𝑟𝑝𝑖𝑛𝑎, 𝐷𝑒𝑟𝑝𝑠𝑜𝑛}. Vertikale 𝑜1, 𝑜2, 𝑜3 su spojevi pa
je prema tome 𝑉𝑐 = {𝑜1, 𝑜2, 𝑜3 }. (Schatten, Ivković 2012)
Kao što je već navedeno, NoSQL ne koristi relacije, odnosno tablice za pohranu podataka.
Strukture podataka se brzo mijenjaju i zato trebaju i brz pristup. Aplikacije koje su se prije
koristile bile su uglavnom statične, nisu se previše mijenjale, dok su današnje aplikacije
dinamične i prilagođavaju se korisniku, koriste mnogo različitih resursa, moraju biti dostupne
neprestano, na različitim uređajima i u cijelome svijetu. Relacijske baze podataka nisu bile
dizajnirane da se nose s takvim aplikacijama i s takvom agilnosti koje zahtijevaju današnje
aplikacije i korisnici, pa se već i u prošlosti tražio neki novi način spremanja podataka u bazu.
2.2. NoSQL tipovi baza podataka
Postoji nekoliko pristupa i načina klasificiranja NoSQL baza podataka, svaki sa
različitim kategorijama i potkategorijama, pa radi toga postoji neko osnovno klasificiranje po
modelu podataka.
2.2.1. Ključ-vrijednost
Ovaj način spremanja koristi asocijativnu listu (koja je poznata kao i mapa ili rječnik)
kao fundamentalni model podataka. U ovome su modelu podaci prikazani kao kolekcije para
ključ-vrijednost i kao takvi, svaki je ključ jedinstven u toj kolekciji. Ovaj model je jedan od
najjednostavnijih modela te se često koristi kao dio nekog kompliciranijeg modela. Neke baze
podataka podržavaju i sortiranje ključeva. Primjeri ključ-vrijednost načina spremanja podataka
su Riak i Barkley DB, dok za razliku od većine, Redis omogućuje da vrijednost može imati svoj
tip podataka poput znakovnog niza ili cjelobrojnog broja. Mnogo različitih hardware-a koristi
ovakav način, poput RAM-a, SSD-a ili tvrdih diskova. Primjer ovakvog načina vidjeti će se
kasnije gdje će se pokazati razlike između SQL-a i NoSQL-a.
2.2.2. Baza dokumenata
Svaka implementacija orijentirana na bazu dokumenata se razlikuje po nečemu, ali
svaka od njih pretpostavlja da dokument enkapsulira i kodira podatke i informacije u nekom
standardnome formatu. Dokumenti su adresirani u bazi putem jedinstvenog ključa. Uglavnom
baze dokumenata uparuju ključ s kompleksnim strukturama podataka, odnosno dokumentima.
6
Dokumenti mogu sadržavati mnogo različitih ključeva-parova ili ključeva-lista ili čak nekih
ugniježđenih dokumenata.
2.2.3. Grafovi
Grafovi se koriste kako bi spremili informacije o mreži podataka. Sadrže povezane
entitete (čvorove) koji mogu sadržavati bilo koji broj atributa. Čvorovi mogu biti označeni bilo
kakvim nazivljem ovisno o onome što predstavljaju. Tipovi podataka mogu biti društvene veze,
javne prijevozne veze, putevi ili topološke mreže. Veze predstavljaju poveznicu između dva
čvora.
2.2.4. Stupci
Stupac sadrži distribuiranu pohranu podataka koji je NoSQL objekt. On je u biti ključ –
vrijednost par koji sadrži tri elementa:
- Jedinstveni naziv
- Vrijednost
- Vremensku oznaku
Stupac je korišten kao pohrana za vrijednosti i sadrži vremensku oznaku kako bi se razlikovale
novije vrijednosti od starijih.
Među NoSQL baze podataka spadaju još dokumenti, objektno pohranjivanje, multi-model i
ostali.
2.3. Prednosti NoSQL-a
U odnosu na relacijske baze podataka, NoSQL baze podataka su više skalabilne i
pružaju puno bolje performanse. Njihovi modeli podataka rješavaju nekoliko problema
relacijskih baza podataka:
- veliki volumen stalno promjenjivih struktura, polu struktura i nestrukturiranih
podataka
- stalna i velika kretanja podataka, brza iteracija, česta promjena koda
- objektno orijentirano programiranje
- geografska distribuirana arhitektura
Tu nam dolazi pitanje, kada da koristimo NoSQL, a kada SQL način? To ovisi o tome trebamo
li fleksibilnu shemu, da se mogu mijenjati vrijednosti, stupci i ostalo ili želimo nešto što je
7
strukturirano, dobro organizirano i gdje se mogu pisati složeni upiti. Sve to ovisi o našem
modelu podataka, čime se bavimo i hoće li će se to kasnije mijenjati ili neće. (mongodb.com,
dostupno 2016.)
2.4. Nedostaci NoSQL-a
NoSQL baze podataka prisutne su tek nekoliko godina te su donijele pregršt prednosti i
novosti u informatičkome svijetu vezanom uz pohranu podataka. Uz sve prednosti, postoje i
nedostaci NoSQL bazi, a to su:
- Nedovoljna zrelost – relacijske baze podataka koriste se već više od 20 godina i s
godinama su se mnogo razvile i dovele na visoku razinu. NoSQL baze podataka
postoje tek nekoliko godina i nisu postigle tu stabilnost kao relacijske baze.
- Manja podrška – relacijske baze imaju administracijsku podršku 24 sata dnevno koji
rješavaju problem kada neki od sustava upravljanja padne. Za NoSQL baze podataka
postoje tek nekoliko tvrtki koje se time bave, a to su sve tvrtke koje su tek počele s
radom, ali one nemaju podršku raširenu za cijeli svijet.
- Poslovna inteligencija i analitika – NoSQL baze podataka su razvijene prema
zahtjevima web 2.0 modernim aplikacijama. Nadilaze standardne „insert-read-
update-delete“ cikluse tipičnih aplikacija i nude nekoliko svojstava analiza.
Jednostavni upiti zahtijevaju određenu razinu znanja u programiranju i većina alata
na koje se oslanjaju ne pružaju spajanje na NoSQL baze podataka.
- Administracija – krajnji cilj NoSQL bazi podataka bio je da neće biti potrebna
administracija, no u stvarnosti je to drugačije i zahtijevaju tehničke sposobnosti kao
što su instalacija i održavanje.
- Nedovoljno naprednih eksperata – pošto su NoSQL baze podataka još relativno
nove, većina ljudi koji se time bave još uvijek uče i nisu eksperti. To će se s
vremenom naravno promijeniti. (Jenny Richards, Advantages andd Disadvantages
od NoSQL databases, 2015)
2.5. Primjeri SQL-a i NoSQL-a
Ovdje će se prikazati neki primjeri za SQL i za NoSQL baze, a to će se prikazati na
primjeru osoba i automobila. Svaka osoba može imati nekoliko automobila. U prvoj tablici
može se vidjeti tablica osoba, a u drugoj tablica automobila.
8
ID IME PREZIME
0 Ivo Ivić
1 Petra Petrić
Tablica 1. Osobe
ID MARKA VRSTA MOTOR SERIJSKI
BROJ
ID_OSOBE
0 VW Golf 1.9 TDI 3356565165 0
1 Opel Astra 1.4 Twinport 5641651651 1
2 Mercedes C220 2.2 Dizel 5454354355 1
3 BMW 320d 2.0 Dizel 3788275287 0
4 Peugeot 307 2.0 HDI 7525272722 1
Tablica 2. Automobili
To je primjer SQL načina. Svaki redak ima ID kako bi se identificirali i razlikovali
redovi, odnosno osobe. Vidi se samo ime i prezime što je dovoljno za ovaj primjer. U drugoj se
tablici također vidi ID, ali ID automobila. Dalje je potrebno saznati koji automobil je u posjedu
neke osobe, znači to je neka veza između osoba i automobila. Za to je potreban vanjski ključ u
tablici „Automobili“. Pošto je SQL način dovoljno detaljno obrađen na kolegijima Baze
podataka 1 i Baze podataka 2, neće se ići u dublje i detaljnije u objašnjavanje kako on
funkcionira već se daljnji tekst orijentira na zanimljiviji i noviji način, NoSQL, a SQL će se
spominjati samo u primjerima kao usporedba sa NoSQL-om.
Sada će se objasniti NoSQL način, odnosno ključ-vrijednost. To je u srži neka kolekcija
ključa-vrijednosti, odnosno kao neka asocijativna lista. Sadržava kolekciju ključeva i
vrijednosti, no ključ mora biti jedinstven. Umjesto da se spremaju samo podaci u tablice
pomoću stupaca i redaka, ovaj način može spremati bilo kakvu vrijednost u polje za vrijednost,
pa tako možemo izraditi svoju strukturu podataka.
KLJUČ VRIJEDNOST
Ključ1 {ime: Marko, mail: [email protected]}
Ključ2 [artikl1, artikl 2, artikl3…]
Ključ3 Vrijednost3
Tablica 3. Primjer NoSQL-a
9
To se može gledati kao memorija, postoji adresa (ključ) i poslije toga vrijednost.
Najbolji primjer gdje je ovaj način koristan je predmemorija. Ako se predmemorira web
stranica, odnosno sprema rezultat neke kalkulacije dodjeljivanjem ključa, dobiva se vrlo brz
način dolaženja do određene vrijednosti jer se izbjegavaju dodatne kalkulacije i operacije.
Odnosno, ako se zna ključ, odmah se dohvati i vrijednost. Nije potrebno koristiti složene upite
kao u SQL-u da bi se došlo do određene vrijednosti, nema prolaženja kroz velike iteracije, liste
ili tablice i to uvelike pomaže u performansama.
U idućoj tablici vidi se način i razlika između pisanja SQL-a i NoSQL-a na primjeru
tablice 1 i tablice 2.
KLJUČ VRIJEDNOST
osoba:0:ime Ivo
osoba:0:prezime Ivić
osoba:1:ime Petra
osoba:1:prezime Petrić
Tablica 4. Osobe u NoSQL-u
U ovome načinu može se vidjeti da se kao ključ uzima ime tablice, pa ID, pa naziv
stupca odvojenih dvotočkom. Ovo je jedan način nomenklature i označavanja, tako da se za
početak uvijek uzme naziv tablice pa onda slijedi ID i tako dalje. Znači, uzima se redak te se
razdijeli asocijacija između ID-a i vrijednosti i dodijeli ključ i vrijednost. Moguće je također
primijetiti da se takvim razdvajanjem dobije više redaka. Tablica 5 sadrži dio podataka iz tablice
2 napisane pomoću ključ-vrijednosti načina pohranjivanja.
KLJUČ VRIJEDNOST
automobil:0:marka VW
automobil:0:vrsta Golf
automobil:0:motor 1.9 TDI
automobil:0:serijski_broj 3356565165
automobil:1:marka Opel
automobil:1:vrsta Astra
automobil:1:motor 1.4 Twinport
automobil:1:serijski_broj 5641651651
automobil:2:marka Mercedes
10
automobil:2:vrsta C220
automobil:2:motor 2.2 Dizel
automobil:2:serijski_broj 5454354355
Tablica 5. Automobili u NoSQL-u
2.5.1. Veze u ključ-vrijednost načinu pohranjivanja
U tablici 5 vidi se da ne postoji stupac za vanjski ključ prema osobama kako bi se znalo
tko posjeduje koji automobil. Razlog tome je što u ovakvom načinu pohranjivanja opisivanje
vanjskih ključeva je malo drugačije što je posljedica drugačijeg rada. U ovome načinu
aplikacijski sloj odlučuje kako da interpretira vrijednost, odnosno da li je vrijednost vezana na
neki drugi ključ. To se može vidjeti u sljedećoj tablici.
KLJUČ VRIJEDNOST
automobili:0:id_osobe osobe:0
automobili:1:id_osobe osobe:1
automobili:2:id_osobe osobe:1
automobili:3:id_osobe osobe:0
Tablica 6. Vanjske veze u ključ-vrijednost pohranjivanju
Ovdje se ne mogu pisati neki upiti da bi se dobila tražena vrijednost već je potrebno više
puta raditi iteracije. Da bi se došlo do tražene vrijednosti preko ovakvog načina poput svih
automobila koje posjeduje Ivo Ivić. Više se neće kao prije tražiti, već će se kreirati obrnuti
indeks. Obrnuti indeks je kada se ne traže automobili koje posjeduje neka osoba, već da se zna
da se traži osoba s nekim ID-em koja je zapisana u tablici sa vanjskim ključevima i tada je to ta
osoba koja posjeduje te automobile. Može se također tražiti cijela lista i pronaći željena
vrijednost, iz toga se može zaključiti da je složenost toga algoritma O(n). U idućoj tablici vidi
se odgovor na pitanje koje sve automobile posjeduje Ivo Ivić.
KLJUČ VRIJEDNOST
osoba:0:automobili [automobil:0, automobil:3]
Tablica 7. Automobili koje posjeduje Ivo Ivić
Ovdje je za početak objašnjeno kako izgleda ključ-vrijednost način pohranjivanja i koja
je razlika između SQL i NoSQL-a, a detaljnije će se opisivati po potrebi kako će se objašnjavati
što je Redis i koje su njegove naredbe. Ovo je bilo samo objašnjenje kako Redis funkcionira na
11
nižoj razini zapisivanja podataka. U idućem poglavlju dolazi objašnjenje Redis-a gdje se
detaljno objašnjava što je to, za što se koristi, kako ga instalirati, te će se kasnije objasniti i
pokazati neke od najčešćih korištenih naredbi.
12
3. Redis
Njegova svrha je pohranjivanje podataka u bazu u obliku ključ-vrijednost načina
pohranjivanja koji je objašnjen u ranijem poglavlju. Osim pohranjivanja podataka, Redis služi
i kao predmemorija i posrednik između poruka. Pomoću Redis-a mogu se raditi liste, skupovi,
sortirani skupovi, sažetci, hiperloglog algoritmi i slično. Redis je popularan jer je vrlo dobar u
predmemorijskom pohranjivanju. Također, Redis podržava publish-subscribe poruke. Ideja
toga je da postoji lista u koju ljudi stavljaju stvari (publish), a drugi ljudi (subscriberi) uzimaju
s te liste. Redis kod takvog načina ima prednost jer podržava stavljanje i uzimanje iz liste s
prvog mjesta ili zadnjeg mjesta. Naredbe za to će se objasniti u kasnijim poglavljima. (redis.io,
dostupno 2016.)
Razvitak samog Redisa sponzoriran je od strane Redis Labs-a od lipnja 2015.godine, a do
tada je bio sponzoriran od Pivotal i VMware tvrtki. Po nekim istraživanjima, Redis je
najpopularnija baza s ključ-vrijednost pohranjivanjem, kao i najpopularnija NoSQL baza. Redis
je skraćenica za Remote Dictionary Server, što u prijevodu znači udaljeni server rječnika.
(redis.io/documentation, dostupno 2016.)
3.1. Podržani programski jezici i tipovi podataka
Redis podržava većinu programskih jezika od kojih su najpoznatiji: C, C++, Java,
JavaScript, Perl, PHP, Python, Ruby i ostali. Za svaki od njih postoje dodaci za preuzeti na
službenoj stranici Redis-a (www.redis.io). Redis podržava mnogo tipova podataka od kojih su
najčešće korišteni i najpoznatiji skupovi, sažetci, liste i hiperloglog algoritmi. Kasnije će se
objasniti i implementirati svaki od tih tipova i operacija koje su podržane.
3.2. Tko ga koristi?
Redis koriste kompanije čije se aplikacije koriste svakodnevno. Neke od najpoznatijih
kompanija su:
- GitHub
- SnapChat
- StackOverflow
- Flickr
13
- Craigslist
Prema ovome može se vidjeti da je Redis doista poznat u svijetu te da je očito dovoljno pouzdan
i performansama zadovoljavajući.
3.3. Instaliranje i uspostava Redis-a na Windows računalu
Redis je prvobitno namijenjen Linux operacijskom sustavu, no postoji tim nazvan
MSOpenTech koji radi s tehnologijama otvorenog koda i prilagođava Microsoft operacijskom
sustavu. Da bi preuzeli Redis za Microsoft Windows, mora se otići na stranicu Github-a:
http://github.com/MSOpenTech/redis/ i preuzeti najnovija inačica. Podržana je i postoji samo
64-bitna verzija. Verzija za Windows je malo drugačija nego na Linux operacijskom sustavu
radi interakcije sa soketima i kako koriste portove, no naredbe su iste tako da nema problema
sa korištenjem bilo kojega operacijskog sustava. Za preuzimanje može se koristiti Chocolatey
što je package manager za Windows koji odmah preuzima i instalira pakete. Za prikaz u ovome
radu koristiti će se standardni MSI instaler koji je također preuzet za GitHub stranice
MSOpenTech tima.
Slika 4. Instalacija Redis-a
Standardna putanja do Redis-a je C:\Program Files\Redis i u tome direktoriju se nalazi
poslužitelj i klijent koji se moraju pokrenuti. Postoji konfiguracijska datoteka u kojoj se može
mijenjati port, IP adresa koja se sluša, TCP keepalive za održavanje veze i ostale postavke.
Pošto se Redis često koristi kao predmemorija, nema smisla da se svi podaci pohranjuju trajno,
14
pa se u konfiguraciji mogu podešavati postavke koliko često da se pohranjuje i slično, ovisno o
vremenu ili koliko se ključeva promijenilo.
Slika 5. Pokretanje Redis servera
Slika 6. Pokretanje Redis klijenta
3.4. Redis naredbe
Za pisanje Redis naredbe postoje dvije opcije. Ako se želi samostalno nešto kreirati,
potrebno je pokrenuti server i klijent kako bi mogli to koristiti. Druga opcija je njihov
interaktivni vodič na web stranici gdje je podržano pisanje svih naredbi što je dovoljno za
vježbu i shvaćanje rada Redis-a. Taj vodič nalazi se na sljedećoj web adresi: http://try.redis.io/.
Pokretanjem toga vodiča, korisnika se interaktivno vodi kroz najvažnije naredbe uz objašnjenja
i primjere. Vodič je vrlo korisna stvar za početnike koji se dosad nisu susretali s takvom vrstom
baza podataka. Naredbe su podijeljene u nekoliko podskupina i cjelina koje su srodne i kako bi
ih se jednostavnije objasnilo.
15
3.4.1. Pomoć
Redis sadržava mnogo naredbi koje su vrlo slične pa može doći do zamjene ili krive
sintakse pisanja naredbi. Zbog toga postoji help, odnosno pomoć koja se može pozvati prilikom
pisanja naredbi na način da se upiše „HELP“ te naredbu za koju je potrebna sintaksa i pomoć.
Primjer se može vidjeti na slici ispod.
Slika 7. Pomoć u Redis-u
Na slici 7 može se vidjeti kako izgleda „HELP“ te koje sve stvari sadržava. Vidi se da
je prva sintaksa naredbe koja u ovom slučaju glasi: „GET key“, gdje je GET naredba, a „key“
ključ koji je postavljen pomoću naredbe SET i pohranjivanjem vrijednosti. Nakon sintakse
dolazi opis naredbe, u ovom slučaju GET vraća vrijednost traženog ključa. Ispod opisa dolazi
od koje se verzije Redis-a koristi spomenuta naredba, a nakon toga dolazi u koju grupu naredba
spada, u ovom slučaju u grupu nizova.
3.4.2. Povratna poruka
Nakon svakog izvršavanja naredbe, klijent vrati neku poruku. Kod Redis-a je povratna
poruka malo drugačije interpretirana. Ona može biti tipa: 0, 1, OK. Poruka koja će biti vraćena
ovisi o naredbi koja se koristi i o tome da li je naredba izvršena ili nije. „OK“ naravno govori
da je naredba izvršena i da je sve u redu te se koristi kod bool operacija i naredbi. Ako se radi
nešto kompliciranije, vratit će 0 ili 1. Nakon izvršavanja GET naredbe, vraćena će biti poruka,
odnosno vrijednost (ako postoji) koja se nalazi spremljena pod tim ključem. Pisanje naredbi je
mnogo olakšano novijom inačicom Redis-a gdje pri pisanju naredbe, klijent nudi sintaksu te
naredbe kao što se može vidjeti na slici ispod.
16
Slika 8. Pomoć pri pisanju komandi
3.4.3. Nizovi
3.4.3.1. SET
Sintaksa - SET „ključ“ „vrijednost“
Ta naredba služi za pohranjivanje neke vrijednosti u neki ključ. Vrijednost se pohranjuje
kao niz. Ako taj ključ već sadrži neku vrijednost, ta vrijednost će biti prepisana novom
vrijednošću bez obzira kojeg je tipa. Od verzije 2.6.12., naredba SET podržava nekoliko
dodatnih opcija:
- EX sekundi – postavlja vrijeme istjecanja u sekundama
- PX milisekundi – postavlja vrijeme istjecanja u milisekundama
- NX – postavlja vrijednost samo ako taj ključ ne sadrži neku vrijednost
- XX – postavlja vrijednost samo ako taj ključ sadrži neku vrijednost
Pošto ove opcije mogu zamijeniti naredbe SETNX, SETEX, PSETEX, moguće da će te naredbe
u nekoj budućnosti biti obustavljene i uklonjene. To je dobra ideja jer će se smanjiti broj naredbi
koje se moraju pamtiti i imaju raznovrsne sintakse koje je teško upamtiti, a ovo su vrlo
jednostavne opcije već postojećih naredbi. Isto tako broj riječi i linija se smanjuje ovim
dodatnim opcijama naredbi. Na slici ispod vidi se korištenje tih naredbi. U prvoj naredbi
postavljen je istek na 5 sekundi te se nakon toga vrijednost toga ključa briše. Ako navedeni
ključ ne postoji, javlja poruku „nil“, odnosno da je taj ključ prazan i ne sadrži neku vrijednost.
17
Slika 9. Primjer korištenja GET, SET (sa opcijama NX, EX)
Također se može vidjeti povratna poruka ako se krivo napiše sintaksa naredbe, koja
javlja da je napravljena pogreška u sintaksi.
3.4.3.2. GET
Sintaksa – GET „ključ“
GET naredba služi kako bi se vratila vrijednost određenog ključa. Ako taj ključ ne sadrži
vrijednost, vraća se poruka „nil“. Primjer kako izgleda ta naredba u korištenju može se vidjeti
također na prethodnoj slici.
3.4.3.3. INCR
Sintaksa – INCR “ključ“
Ova naredba povećava broj spremljen u ključu za vrijednost jedan. Ako ključ ne postoji,
postavlja vrijednost toga ključa na 0. Ako vrijednost toga ključa nije broj, tada javlja pogrešku.
Iako je ovo operacija nad brojem, u biti je to operacija nad nizom pošto naredba SET sprema
sve vrijednosti kao niz.
18
Slika 10. Naredbe INCR i DECR
Na slici 10 može se vidjeti primjer korištenja naredbi INCR i DECR. Također se može
vidjeti da nakon izvršenja INCR naredbe, vraćen je broj uvećan za 1. Zanimljiva stvar ovdje je
to što iako SET sprema i vraća broj kao niz, svejedno ga prepoznaje kao broj i može ga uvećati
ili smanjiti.
Primjer korištenja ove naredbe je recimo kod brojenja slanja zahtjeva. Recimo da se ograniči
korisnicima da u sekundi mogu poslati maksimalno N zahtjeva kako ne bi došlo do zatrpavanja
poslužitelja ili slično. Ako korisnik pređe tu granicu, pojavi se pogreška i korisniku se blokira
račun i šalje mail da provjeri da li je računalo ili neki drugi uređaj zaražen štetnim softverom
kojemu je cilj prenatrpati neki od poslužitelja. Tu je potrebna i naredba EXPIRE koja bi brisala
vrijednost ključa odnosno brojača svake sekunde ili više, ovisno o konfiguraciji.
3.4.3.4. DECR
Sintaksa – DECR „ključ“
Ova naredba radi suprotno od INCR, smanjuje brojčanu vrijednost nekog ključa. Primjer
korištenja DECR naredbe može se vidjeti također na slici 10.
INCRBY, INCRBYFLOAT, DECRBY i DECRBYFLOAT su inačice INCR I DECR
naredbi koje smanjuju/povećavaju broj za unesenu veličinu.
3.4.3.5. APPEND
Sintaksa – APPEND „ključ“ „vrijednost“
Naredba APPEND dodaje unesenu vrijednost na već postojeću vrijednost, ili kreira novu
praznu vrijednost. Nakon izvršavanja ove naredbe, klijent vraća broj znakova te vrijednosti.
19
Ukoliko je vrijednost brojčana i dodamo joj još neku brojčanu vrijednost, brojevi se ne zbrajaju
već dodaju. Primjer ove naredbe može se vidjeti na slici 11.
Slika 11. Naredba APPEND
Na slici 11 također se vidi da ukoliko se doda broj 5 na broj 4, dobije se broj 45. Ako se
nakon toga izvrši naredba INCR (ili DECR) ta vrijednost će se tretirati kao broj pa će se naredba
izvršiti ili uvećati za 1.
3.4.3.6. GETRANGE
Slika 12. Naredbe GETRANGE i SETRANGE
Sintaksa – GETRANGE „početak“ „kraj“
Ova naredba vraća znakove u navedenom rasponu što može biti korisno ako je poznato
što je zapisano u tom ključu i potreban je neki određeni raspon. Primjer je JMBG (jedinstveni
matični broja građana), poznato je da se on sastoji od nekoliko podataka, tipa datuma rođenja i
slično. Ako je potrebno iz JMBG-a očitati datum rođenja, to se može pomoću ove naredbe.
20
3.4.3.7. SETRANGE
Sintaksa – SETRANGE „ključ“ „odstupanje“ „vrijednost“
Ova naredba zapisuje određenu vrijednost u neki ključ s početkom koji je unesen kao
odstupanje. Odnosno, ako je vrijednost 0123456789 kao u primjeru na slici 12 i izvrši se
naredba „SETRANGE kljuc1 5 01234“, vrijednost 01234 zapisat će se u ključ „kljuc1“ s
početkom na petom mjestu i tada će vrijednost zapisana u tom ključu biti 0123401234.
3.4.4. Liste
Redis podržava listu nizova i te liste podržavaju nasumični pristup bilo kojem indeksu.
Pomoću lista mogu se izrađivati redovi i umetati u njih vrijednosti te izbacivati vrijednosti na
određenim indeksima. Postoji mnogo naredbi za upravljanje listama u Redis-u koje će se sada
pokazati i objasniti pojedinačno.
3.4.4.1. LPUSH
Sintaksa – LPUSH „ključ“ „vrijednost„
Dodaje unesenu vrijednost u ključ na početak liste, odnosno na lijevu stranu. Ako
navedeni ključ ne postoji, prvo kreira praznu listu i dodaje vrijednost na početak te liste. S
verzijom 2.4., moguće je dodati i više vrijednosti odjednom na način da se vrijednosti pišu jedna
za drugom. Posljednja vrijednost umeće se na početak, pretposljednja na desno mjesto uz
početnu vrijednost i tako dalje. Nakon izvršavanja te naredbe, vraća se broj elemenata u listi.
Slika 13. Naredbe LPUSH, RPUSH, LLEN, LRANGE
3.4.4.2. RPUSH
Ova je naredba ista kao i LPUSH, jedino što ona dodaje elemente liste s desne strane,
odnosno na kraj navedene liste. Primjer korištenja može se vidjeti na prethodnoj slici.
21
3.4.4.3. LLEN
Sintaksa – LLEN „ključ“
Ova naredba vraća veličinu liste, odnosno broj elemenata koji se nalaze u listi. Primjer
korištenja može se također vidjeti na slici 13.
3.4.4.4. LRANGE
Sintaksa – LRANGE „ključ“ „početak“ „kraj“
Naredba LRANGE vraća elemente liste koji se nalaze na indeksu unesenim kao početak
i kraj, kao i između njih. Kao što se vidi na slici 13, naredba „LRANGE lista2 0 1“ vraća
elemente liste na nultom i prvom indeksu.
3.4.4.5. LPOP, RPOP
Na primjeru ovih komandi može se vidjeti kako se gradi red, odnosno stog. Pomoću
ovih dviju naredbi izbacuje se i ispisuje vrijednost iz liste s lijeve ili desne strane. Primjer
korištenja i načina rada ovih naredbi može se vidjeti na slici 14.
Slika 14. Naredbe LPOP, RPOP
22
3.4.4.6. LINDEX
Sintaksa – LINDEX „ključ“ „vrijednost“
Ova naredba vraća vrijednost na određenom indeksu. Ako se ne zna broj elemenata liste,
a želi se dohvatiti posljednji element, može se napisati -1 kao indeks. -2 vraća element prije
posljednjeg i tako dalje.
3.4.4.7. LTRIM
Sintaksa – LTRIM „ključ“ „početak“ „kraj“
Naredba LTRIM briše elemente liste. Pošto se unosi početna i završna vrijednost,
odnosno indeks, moguće je brisati jedan element, a moguće je obrisati i cijelu listu. Kod ove
naredbe mogu se također koristiti negativne vrijednosti kao što je već objašnjeno kod naredbe
LINDEX.
3.4.4.8. RPOPLPUSH
Sintaksa – RPOPLPUSH „izvor“ „destinacija“
Ovom naredbom uzima se posljednji element iz liste (izvora) i stavlja ga u drugu listu
(destinaciju) na prvo mjesto, odnosno početak liste. Ako izvor ne postoji, vraćena je vrijednost
„nil“. Ako su izvor i destinacija isti, odnosno ako se radi o istoj listi, element će se samo
prebaciti s posljednjeg na prvo mjesto pa se to može smatrati naredbom rotiranja elemenata
liste.
Redis se često koristi kao poslužitelj za slanje i primanje poruka te njihovo obrađivanje.
Tu se koristi već spominjani stog jer se poruke stavljaju u listu od strane kreatora kako bi se
obradile te se čeka na njih od strane potrošača. Za to se koristi naredba RPOP, ali ona nije
dovoljno pouzdana jer poruke mogu biti izgubljene ako dođe do nestanka interneta ili električne
energije za vrijeme kada je poruka u obradi, a nije još stigla do potrošača. Zato tu dolazi naredba
RPOPLPUSH jer tu potrošač prima poruku i stavlja je u listu za obradu. Nakon što je poruka
obrađena, naredbom LREM će se maknuti poruka iz liste za obradu. To je primjer korištenja
ove naredbe kao pouzdanog stoga. Kako se koristi i koji je rezultat korištenja ove naredbe može
se vidjeti na slici 15.
23
Slika 15. Naredba RPOPLPUSH
3.4.4.9. EXPIRE
Već je nekoliko puta spomenuto da se Redis često koristi kao stog, ali koristi se i kao
predmemorija. Podaci spremljeni u predmemoriju su samo privremeno tamo spremljeni, a za to
pomažu naredbe EXPIRE, TTL i PERSIST. Parovi ključ-vrijednost istječu i brišu se nakon
nekog određenog vremena.
Sintaksa – EXPIRE „ključ“ „sekundi“
Na ovoj naredbi se temelji uglavnom predmemorija. Pošto su podaci tamo samo
privremeno zapisani, pomoću EXPIRE metode se oni brišu nakon nekog određenog vremena.
Ako se preimenuje lista ili skup, vrijeme istjecanja se nasljeđuje. Primjer korištenja može se
vidjeti na slici ispod.
24
Slika 16. Naredba EXPIRE
3.4.4.10. TTL, PERSIST
TTL (eng. Time To Live(vrijeme postojanja)) naredba vraća vrijeme nakon kojeg će neka
lista ili općenitije neki ključ biti obrisan.
PERSIST naredba uklanja vrijeme istjecanja.
Primjere korištenja ovih dviju naredbi može se vidjeti na slici ispod.
Slika 17. Naredbe TTL i PERSIST
Na slici 17 također se vidi da ukoliko određena lista ili skup nemaju postavljeno vrijeme
istjecanja, TTL naredba vraća negativnu vrijednost, odnosno -1.
25
3.4.5. Sažetak
Redis ne pohranjuje samo obične tipove podataka, već može pohranjivati već spomenute
liste, skupove, ali može pohranjivati i sažetke. Sažetci su u biti kolekcije parova ključ-
vrijednost. Najkorisniji su kod reprezentiranja objekata i tabličnih podataka. Sažetak može
pohraniti mnogo elemenata-parova, preko 4 milijarde, a zauzima jako malo memorijskog
prostora što je velika prednost.
3.4.5.1. HSET
Slika 18. Naredbe HSET, HMSET, HGET
Sintaksa – HSET „ključ“ „polje“ „vrijednost“
Naredba HSET postavlja vrijednost polja. Na slici 18 može se vidjeti korištenje te
naredbe. Tom naredbom je rečeno: kreiraj objekt račun s ID-em 0 tipa vrsta i vrijednosti
ulaganje. Odnosno druga naredba kaže: kreiraj objekt računa s ID-em 0, a stanje tog računa
iznosi 50 000.
Može se vidjeti i naredba HMSET koja dozvoljava da se unese više vrijednosti
odjednom.
3.4.5.2. HGET
Sintaksa – HGET „ključ“ „polje“
Ova naredba vraća vrijednost polja određenog ključa. Kao što se vidi na slici 18, naredba
„HGET osoba:0 ime“ vraća ime osobe s ID-em 0.
26
3.4.5.3. HGETALL
Sintaksa – HGETALL „ključ“
HGETALL vraća sve parove ključeve-vrijednosti u nekom ključu. Primjer korištenja ove
naredbe može se vidjeti na slici 19.
Slika 19. Naredba HGETALL
Ova naredba vraća vrijednosti kao listu koja je tipa polje pa ispod toga vrijednost. Neće
nam se prikazati kao par ključ – vrijednost zato što Redis sve pohranjuje kao niz što je već
spomenuto. Ako se želi saznati samo vrijednost ili samo koja su polja, za to postoje naredbe
HVALS i HKEYS koje se također može vidjeti na slici 19.
Slika 20. Naredba HINCRBY
Na slici 20 može se vidjeti naredba HINCRBY koja uvećava brojčanu vrijednost nekog
polja. Redis sažetci podržavaju naredbe iste kao i Redis nizovi koji su navedeni ranije, a to su:
HINCRBYFLOAT, HLEN, HEXISTS, HDEL, EXPIRE, TTL i slično. Te naredbe su praktički
iste pa ih se neće dodatno objašnjavati.
3.4.6. Skupovi
Skupovi (eng. Set) su neuređene kolekcije nizova. Razlika između skupa i niza je ta što
skup ne dozvoljava ponavljanje članova. Zato ih se može koristiti kod nekih složenijih stvari,
27
recimo ako se vodi evidencija klijenata u banci. Da ne bi došlo do ponavljanja računa, sve
račune se stavlja u set što garantira da se neće ponoviti dva ista računa za razliku od toga kad
bi se koristio običan niz.
3.4.6.1. SADD
Sintaksa – SADD „ključ“ „vrijednost“
Naredba SADD dodaje vrijednost u određeni skup. Ako ta vrijednost postoji već u tom
skupu, vraća se poruka 0 odnosno false jer kao što je već rečeno, skup sadrži samo jedinstvene
vrijednosti. Korištenje te naredbe može se vidjeti na slici 21.
3.4.6.2. SMEMBERS
Na slici 21 također se može vidjeti naredba SMEMBERS koja vraća sve članove,
odnosno sve vrijednosti toga niza. Ako skup ne sadrži članove, javlja se pogreška da je skup
prazan.
Slika 21. Naredbe SADD, SMEMBERS
Isto tako, skupovi podržavaju međusobne unije, razlike i presjeke. Da ponovimo, unija
je spoj dva skupa, odnosno u uniji se nalaze svi (jedinstveni) elementi oba skupa. U presjek
spadaju svi jedinstveni elementi koji se nalaze i u prvom skupu i u drugom skupu. Razlika vraća
elemente koji se nalaze u prvom skupu, a u drugom skupu ne i obratno.
3.4.6.3. SDIFF, SDIFFSTORE
Naredba SDIFF vraća razliku između dva skupa. U primjeru na slici 22 može se vidjeti
da se u prvom skupu nalaze element2 i element1, a u drugome skupu element1, clan1 i clan2.
Razlika prvog i drugog skupa daje elemente koji se nalaze u prvom skupu, a ne nalaze se u
drugome skupu što je u ovom slučaju element2.
28
SDIFFSTORE radi isto što i SDIFF, pronalazi razliku između dva skupa, ali ova naredba
također te elemente sprema u treći skup kako bi se kasnije oni mogli obrađivati ili slično, ovisno
o aplikaciji.
Slika 22. Naredbe SDIFF i SDIFFSTORE
3.4.6.4. SINTER, SINTERSTORE
Slika 23. Naredbe SINTER, SINTERSTORE
Na slici 23 mogu se vidjeti naredbe SINTER i SINTERSTORE. SINTER radi presjek dva
skupa i vraća elemente koji se nalaze i u jednom i u drugom skupu. SINTERSTORE radi isto to,
samo te elemente pohranjuje u treći skup.
29
3.4.7. Sortirani skup
Sortirani skupovi su vrlo slični običnim skupovima, samo je kod sortiranih skupova
članovima dodijeljena pozicija. Ovo je jako korisno kod nekih lista s pozicijama u igrama, ali
isto tako se u računalnom svijetu koristi i kao lista zadataka s prioritetima. Članovi moraju biti
jedinstveni, ali rang ne mora jer prioriteti mogu biti jednaki. Ova vrsta skupa sadrži algoritam
koji odmah sortira članove po rangu pa korisnik ne mora voditi brigu o tome. Tako u primjeru
ako se koristi kao lista zadataka s prioritetima, svakome zadatku daje se neki rang, a Redis sam
sortira. Ako dva ili više elementa imaju isti rang, sortirani su abecedno međusobno. Radi tog
algoritma koji je cijelo vrijeme uključen i sortira, dodavanje, brisanje i ažuriranje elemenata je
složenosti O log(n) što je vrlo brzo. Sortirani skup ima mogućnost vraćanja elemenata po
poziciji na kojoj se nalazi ili rangu što će se kasnije pokazati. Isto tako, podržava operacije
unije, razlike i presjeka kao i običan skup. Naredbe su vrlo slične kao i na običnom skupu.
(redis.io/data-types, dostupno 2016.)
3.4.7.1. ZADD
Sintaksa – ZADD „ključ“ „rang“ „element“
Ova naredba je skoro identična naredbi SADD običnog skupa, samo što kod ove naredbe
mora se dodati i rang elementu kako bi on mogao biti sortiran. Nakon izvršavanja ove naredbe,
vrati se broj elemenata koji je unesen u skup. Primjer korištenja te naredbe može se vidjeti na
slici ispod.
Slika 24. Naredbe ZADD, ZRANGE (WITHSCORES)
30
Na slici 24 također se može vidjeti da se algoritam sortiranja radi svaki put nakon što se
doda, obriše ili ažurira element skupa. Naredba ZRANGE WITHSCORES vraća sve elemente s
pripadajućim rangom koji su također sortirani.
Postoji još mnogo naredbi koje se vrše nad sortiranim skupovima poput ZCOUNT,
ZINCRBY, ZINTERSCORE, ZRANK, ZREM, ZUNIONSTORE koje su praktički identične
naredbama nad običnim skupom i koje su već prethodno objašnjene i pokazane tako da ih sada
nema potrebe ponovo objašnjavati. (redis.io/commands, dostupno 2016.)
3.4.8. HYPERLOLOGS
HyperLogLog algoritam dizajniran je kako bi prebrojavao jedinstvene elemente. U
računalnom svijetu je to vrlo bitno, pogotovo na internetu gdje se to koristi kao mrežna analiza.
Na primjeru web stranica, pomoću HyperLogLog algoritma broji se koliko korisnika je posjetilo
stranicu jer svaki korisnik ima jedinstvenu IP adresu. Obično brojenje takvih elemenata
zahtjeva dovoljno veliku memoriju jer bi se morali spremati svi korisnici koji su posjetili
stranicu, no Redis to radi na drugačiji način. Redis ima algoritme kojima ne treba toliko
memorije kao kod ostalih tehnologija, već koristi konstantnu memoriju.
31
4. Aplikacija
Proučavanjem i korištenjem Redis-a donesen je zaključak da se on uglavnom koristi kao
Pub/sub mehanizam, odnosno da je on vrlo brz i pouzdan sistem za slanje i primanje poruka.
Redis ima naredbe PUBLISH, SUBSCRIBE kako bi mogli komunicirati dva ili više klijenta.
Pošiljatelji nisu programirani tako da se poruke šalju nekim određenim primateljima, odnosno
klijentima, već su te poruke karakterizirane u kanale bez znanja i kontroliranja kojim će
primateljima poruka doći jer ne postoji popis. Primatelji se mogu pretplatiti na kanale koje će
„slušati“ i primati njihove poruke, bez znanja koji su sve pošiljatelji na tome kanalu. Isto tako,
primatelj naredbom UNSUBSCRIBE može prestati pratiti određeni kanal. Poruka koja se dobije
je tipa list sa 3 elementa. Elementi ovise o naredbi koja se koristi, ako je prvi element:
- SUBSCRIBE – znači da je pretplata na neki kanal uspješna. Treći element je broj
kanala za koje je korisnik trenutno pretplaćen.
- UNSUBSRIBE – znači da je prekinuta pretplata na neki kanal koji je naveden u
drugom elementu. Treći element je broj trenutno pretplaćenih kanala.
- message – to je poruka koja je rezultat PUBLISH naredbe nekog drugog klijenta.
Drugi element je ime klijenta koji je poslao poruku. (Redis pub/sub, dostupno
2016.)
Daljnjim istraživanjem i pisanjem ovog rada, zaključeno je da se Redis također često
koristi za dvije stvari: chat aplikacije i predmemorija. Kao primjer kreirana je aplikacija kako
bi se Redis iskoristio u onome u čemu je očito najpouzdaniji i najbolji. Napraviti će se chat
aplikacija koja će pohranjivati poruke, točnije, zadnjih 100 poruka pomoću Redis-a. Iako autor
ovog rada nije ranije bio upoznat s nijednom od tehnologija koje je koristio, gledanjem mnogih
vodiča i proučavanjem primjera, uspio je izraditi funkcionalnu aplikaciju sa sljedećim
funkcijama:
- ulaskom u aplikaciju, potrebno je unesti korisničko ime pomoću skočnog prozora
- obavještavanje ostalih korisnika tko se je prijavio/odjavio
- slanje poruke svima
- pamćenje zadnjih 100 poruka tokom zadnja 24 sata u lokalnu memoriju
- pamćenje datuma poruke
- ulaskom u aplikaciju, također se vidi zadnjih 100 poruka
Tehnologije koje su korištene za izradu ove aplikacije su sljedeće:
- Redis
32
- Socket.IO
- Express
- Jade
Korišten je Node.js, popularni JavaScript pogon za izradu aplikacija na serverskoj strani.
Pomoću Express-a se obavljaju HTTP zahtjevi, a preko Jade-a se programira korisničko sučelje.
Jade je vrlo sličan HTML-u, jedino što nema oznake (eng. tagg) već ovisi o podvlačenju kao
Python. Socket.IO služi za komunikaciju sa soketima, a pomoću Redis-a se spremaju poruke.
Za početak je kreiran novi direktorij na C: disku gdje će biti spremljene sve potrebne datoteke
za rad ove aplikacije. Kreiran je „package.json“ datoteka u koju je potrebno upisati podatke o
aplikaciji. Upisani su podaci o imenu aplikacije, verziji, a pod start je potrebno upisati datoteku
koja se pokreće izvršavanjem naredbe za pokretanje koja će kasnije biti pokazana. Postoji i
element „dependencies“ kojeg je potrebno ostaviti praznog, a koji će se kasnije automatski
popuniti instaliranjem potrebnih modula. Potrebni moduli koji se moraju instalirati su Redis,
Socket.IO, Express i Jade. Da bi njih instalirali, potrebno je pokrenuti naredbenu liniju i napisati
sljedeću naredbu: „npm install –save redis socket.io express jade“. Izvršavanjem te naredbe
instaliraju se navedeni moduli, ali i moduli o kojima ovisi rad tih modula. Oni se instaliraju u
mapu „node_modules“, te svaki kreira svoju dodatnu mapu sa svojim imenom.
Slika 25. Instaliranje potrebnih modula
33
Na slici 25 mogu se vidjeti izlazni podaci koji su dobiveni instaliranjem potrebnih
modula aplikacije.
Sljedeće dolazi programiranje serverske strane, „server.js“ datoteke. Na početku te
datoteke potrebno je konfigurirati podatke o korištenju modula, putanji do potrebnih
tehnologija i datoteke za grafička sučelja poput Jade i CSS datoteka. Također se vidi i
konfiguriranje Redis-a i spajanje na Redis server. Pomoću „redisClient“ varijable kasnije se
pristupa naredbama Redis-a. Kod postavljanja express modula, treba postaviti naredbu kojom
se sluša određeni port, u ovom slučaju to je port 8000. Kao što je poznato, Redis radi na
standardnome portu, 6379. Sve te podatke može se vidjeti na slici 26.
Slika 26. Server.js datoteka
Sada dolazi programiranje korisničkog sučelja u Jade-u. Kako bi ono bilo prikazano,
treba imati funkciju koja će rukovati nadolazećim zahtjevima URL-a i koja će renderirati i
prikazati „index.jade“ datoteku. Kao što je navedeno na početku poglavlja, ulaskom u
aplikaciju, korisnik će također vidjeti zadnjih 100 poruka, gdje je potrebno koristiti Redis kako
34
bi se dohvatilo zadnjih 100 poruka. To će se također nalaziti u ovoj funkciji, a naredba koja će
se koristiti je već spomenuta naredba LRANGE. Korisničko sučelje ove aplikacije neće biti
nešto pretjerano komplicirano, jer je ovdje naglasak na korištenju Redis-a. Na sučelju možemo
vidjeti veliki naslov pisan u elementu „h1“, a u elementu „body“ nalazi se „div“ element sa
listom poruka, a nakon toga forma s elementom „textarea“ i gumbom za slanje poruka. U
„head-u“ je uključena potrebna biblioteka CSS-a za vizualno podešavanje elemenata. Na kraju
„body-a“ je potrebno uključiti JavaScript skripte za JQuery, socket.io te klijentsku datoteku
„client.js“ koja će se pokazati malo kasnije. Sadržaj „index.jade“ datoteke može se vidjeti na
slici 27. Unutar „ul“ elementa za listu vidi se „for“ petlja koja služi za ispisivanje dohvaćenih
poruka iz Redis baze podataka.
Slika 27. Index.jade datoteka
35
Slika 28. server.js datoteka
Na drugom dijelu datoteke „server.js“ vidi se na početku korištenje Redis-a. Naredbom
„socket.emit('poruka', data);“ koja se može vidjeti na slici 29, šalje se poruka soketu, a
funkcijom na slici 28 rukuje se tom porukom. Primljenu poruku naredbom LPUSH sprema se
na početak liste kojoj je ključ pod nazivom „poruke“. Naredbom LTRIM ograničava se listu s
porukama da sadržava maksimalno 100 poruka. Pošto se uvijek dodaje nova poruka na početak
liste, odnosno na indeks 0, dok se dosegne maksimalni broj poruka, izbaciti će ona poruka koja
je na posljednjem, 99.mjestu. Ostale dvije funkcije služe kako bi se samo obavijestilo korisnike
o tome tko je ušao i izašao s chata. Ove obavijesti se ne spremaju kao poruke u Redis bazu
podataka. Ova funkcija sluša port 8000 koji je postavljen na početku ove datoteke. For petlja
na slici 27 dohvaća poruke iz Redis baze podataka i parsira ih kao JSON u JavaScript objekte
koje onda šalje u obliku liste u chat.
36
Slika 29. client.js datoteka
Na slici 29 vidi se klijentska strana koja ima funkcije za dodavanje poruke u chat i slanje
poruke. Kada se chat pokrene, otvara se prozor za unos željenog nadimka koji će se koristiti u
chatu. Nakon unosa toga nadimka, server obavještava druge korisnike pomoću obavijesne
poruke o ulasku novog korisnika u chat. Kad kreira tu poruku, stavlja ga u „div“ element s
klasom „obavijest“. Dok se poruka šalje, ona je prikazana u obliku liste gdje se unutar svake
liste kreiraju tri „div“ elementa s klasama „tko“, „datum_vrijeme“ i „poruka“. Kreiraju se i
istoimene varijable u koje se sprema tko je napisao poruku što se zna iz onoga što je uneseno u
prozor na ulasku u chat (a što je poslano na server pomoću soketa), vrijeme i datum koje uzima
sa računala, a poruku uzima kao vrijednost „textarea“ elementa kojemu se pristupa pomoću ID-
a. Ti se svi podaci dodaju u „li“ element pomoću naredbe APPEND, a kasnije se on dodaje u
varijablu „listaPoruka“ pomoću naredbe PREPEND koja u biti dodaje poruke u chat. Tu je
također i poruka za obavještavanje i dodavanje obavijesne poruke u chat.
Kako bi se aplikacija mogla pokrenuti i koristiti, prvo je potrebno pokrenuti Redis
server naredbom: „redis-server.exe“. Nakon toga u novom prozoru naredbene linije, potrebno
se premjestiti u mapu s aplikacijom i naredbom „npm start“ pokreće se aplikacija. Aplikacija
se pokreće jer je ranije u datoteci „package.json“ navedeno da se pod ključnom riječi „start“
misli na datoteku „server.js“.
37
Slika 30. CSS aplikacije
Na slici 30. vidi se CSS koji je korišten za korisničko sučelje aplikacije, a na slici 31 i 32 vidi
se primjer kako aplikacija izgleda i funkcionira.
Slika 31. Unos nadimka i prikaz zadnjih 100 poruka
Na slici 31 također se vidi prozor za unos korisničkog imena, a u pozadini se vide zadnjih 100
poruka ostalih korisnika.
38
Slika 32. Izgled chata i prikaz obavijesnih poruka
Na slici iznad vidi se izgled chata, zadnje poruke i poruke koje služe kao obavijest kada netko
uđe ili izađe iz chata. Pritiskom na gumb „Pošalji“ poruka se sprema u bazu na prvo mjesto,
čita se i upisuje u prozor za poruke.
39
5. Zaključak
Korištenje SQL baza podataka najčešći je način za spremanje podataka, a na temelju
iznesenih činjenica u ovom završnom radu može se vidjeti da to nije jedini način za pohranu
podataka. Tijekom studiranja najviše se uči SQL, iako su često spominjani nedostaci i loše
performanse, može se dobiti utisak da je to najbolji i najlakši način pohrane podataka.
Korištenje NoSQL načina pohrane podataka vrlo brzo pokazuje da je to pouzdan, brz, a također
i zanimljiv način upravljanja podacima u bazi. Ovaj način pohrane može svakom korisniku
približiti na koji se način spremaju podaci u radnu memoriju, stog i predmemoriju. Redis uz
MongoDB svrstavaju u jedan od najkorištenijih tehnologija koje podržavaju NoSQL načine
spremanja podataka u bazu. Redis koristi ključ-vrijednost način koji je najrašireniji način
NoSQL-a.
Kod prvog korištenja Redis možda ne pokazuje širok spektar svojih mogućnosti, ali
postoje mnogi video vodiči i primjeri koji pokazuju njegove prednosti. Korištenje Redisa u
kreiranju aplikacije značajno skraćuje vrijeme i pokriva mnoge naredbe. Iako za kreiranje
aplikacije koja je prezentirana u ovome radu nije se koristilo mnogo naredbi niti tipova
podataka, samo korištenje listi i naredbi poput LPUSH i LTRIM pokazalo se kao jednostavan
način manipuliranja podacima. Usporedbom ove aplikacije s nekim drugima vidljivo je kako
ova aplikacija ima nedostataka i mjesta za napredak, no cilj ove aplikacije bio je da se prikaže
kako se Redis koristi s drugim tehnologijama. Neki od nedostataka su dodavanje liste
prijavljenih korisnika, spremanje korisnika u kolačić ili sesiju, uređivanje profila prijavljenog
korisnika i tome slično. Iako se spremalo 100 poruka u aplikaciji, nije primijećeno sporo
učitavanje poruka ili slično. Također u aplikaciji je bilo prijavljeno nekoliko desetaka korisnika,
ali ni to nije utjecalo na performanse. Ako se prisjetimo 2008.godine kada se koristio IRChat u
većini chat aplikacija, loše performanse su se osjećale nakon što se prijavilo pedesetak
korisnika. Ideja da se dođe do podataka korištenih tehnologija u izradi IRChat aplikacija nije
ostvarena jer su takve aplikacije davno ugašene i zamijenjene aplikacijama boljih performansi.
Prilikom pozvanog predavanja u sklopu kolegija Web Dizajn i Programiranje 2015.
godine na Fakultetu Organizacije i Informatike u Varaždinu gostovao je predstavnik Inchoo
tvrtke iz Osijeka te je spomenuo kako oni u svome radu koriste Redis. Samo spominjanje Redis-
a izazvalo je zanimanje među studentima jer nisu bili upoznati s njime. To upućuje na to da je
Redis nažalost u Hrvatskoj malo zastupljen i korišten jer među studentima postoje mnogi već
iskusni programeri koji surađuju s poznatim tvrtkama u Hrvatskoj i šire.
40
Literatura
[1] Josiah L.Carlson (2013) Redis in action. Manning: Shelter Island
[2] Karl Seguin (2012) The Little Redis Book
[3] Fred Oliviera, Tiago Macedo (2011) Redis Cookbook. Sebastrol: O'Reilly Media
[4] RedisLabs Who's using Redis? Dostupno 6.9.2016. na: http://redis.io/topics/whos-using-
redis
[5] Redis.io Comands dostupno 6.9.2016. na: http://redis.io/commands
[6] Redis.io Documentation, dostupno 6.9.2016. na: http://redis.io/documentation
[7] Redis.io Pub/Sub, dostupno 6.9.2016. na: http://redis.io/topics/pubsub
[8] Microsoft Virtual Academy Redis Tutorials: Zero to Hero with NoSQL Redis, dostupno
6.9.2016. na: https://www.youtube.com/watch?v=A4gRg-9jNF4
[9] Microsoft Virtual Academy Redis Tutorials: Zero to Hero with NoSQL Redis, dostupno
6.9.2016. na: https://github.com/sayar/RedisMVA
[10] Matthew Daly (2014) Building a chat server with node.js and Redis, dostupno 6.9.2016.
na: http://matthewdaly.co.uk/blog/2014/12/31/building-a-chat-server-with-node-dot-js-and-
redis/
[11] garydenblog (2013) Simple Chat Application using Redis, Socket.io and Node.js,
dostupno 6.9.2016. na: https://garydengblog.wordpress.com/2013/06/28/simple-chat-
application-using-redis-socket-io-and-node-js/
[12] Dan Sackett (2014) Create a simple chat room with Redis pubsub, dostupno 6.9.2016.
na: http://programeveryday.com/post/create-a-simple-chat-room-with-redis-pubsub/
[13] Schatten, M. i Ivković, K. (2012). Regular Path Expression for Querying Semistructured
Data - Implementation in Prolog. Fakultet Organizacije i Informatike u Varaždinu, Central
European Conference on Information and Intelligent Systems. Varaždin, Hrvatska, 19.-21.
Rujna 2012.godine, Varaždin : Fakultet Organizacije i Informatike u Varaždinu.