44
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.

Redis - Ruđer Bošković Institute · 2017-10-02 · Dijagram podataka je digraf 𝐺 =(𝑉,𝐵) čiji su bridovi označeni, a vertikale su objekti podataka koji mogu biti atomski

  • 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:

- Twitter

- GitHub

- Pinterest

- SnapChat

- StackOverflow

- Flickr

13

- Weibo

- 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.