3.3 - Connexió des de Java
La utilització des de Java és molt senzilla, i podrem utilitzar tots els comandos que hem vist.
Haurem d'incorporar en el projecte una llibreria. Podem utilitzar per exemple la de Jedis (acrònim de Java Redis). A la següent adreça la podeu trobar (no és l'última versió, però ens val):
http://search.maven.org/remotecontent?filepath=redis/clients/jedis/2.9.0/jedis-2.9.0.jar
Per a fer proves, creem un nou projecte anomenat Tema7_2, i incorporem la llibreria de Jedis. Creem un paquet anomenat Exemples, per separar aquestos dels exercicis.
Connexió
La connexió és tan senzilla com el següent:
Jedis con = new Jedis("localhost");
con.connect();
És a dir, obtenim un objecte Jedis passant-li al constructor l'adreça del servidor, i després connectem amb el mètode connect.
Si el servidor no el tenim en la mateixa màquina, només haurem de substituir localhost per l'adreça on estiga el servidor.
L'objecte Jedis representarà una connexió amb el servidor Redis. Tots els comandos que hem vist per a utilitzar des del client de Redis, seran mètodes d'aquest objecte. Només haurem d'anar amb compte amb el que ens torna el servidor quan fem una petició. Moltes vegades serà un String, però en moltes altres ocasions seran col·leccions; sets, lists, ...
Per a tancar la connexió:
con.close();
Comandos que tornen Strings
Tots els comandos que vam veure seran ara mètodes de l'objecte Jedis. En concret obtenir el valor d'una clau (comando get clau) serà el mètode get al qual li passarem la clau com a paràmetre:
Ací tenim ja la primera prova:
import redis.clients.jedis.Jedis;
public class Prova1 {
public static void main(String[] args) {
Jedis con = new Jedis("localhost");
con.connect();
System.out.println(con.get("saludar"));
con.close();
}
}
Si volem guardar una clau amb un valor, utilitzarem el mètode set(clau,valor), al qual com veiem li hem de passar els dos paràmetres:
import redis.clients.jedis.Jedis;
public class Prova2 {
public static void main(String[] args) {
Jedis con = new Jedis("localhost");
con.connect();
String valor = "Aquesta clau és una clau creada des de Java";
con.set("clau_Java", valor);
System.out.println(con.get("clau_Java"));
con.close();
}
}
Comandos que tornen conjunts
En moltes ocasions, el que ens tornarà Redis no és un únic String, sinó un conjunt de Strings. Açò serà cert quan treballem amb Sets, però també en moltes altres ocasions. Per exemple quan demanem unes quantes claus amb MGET, o quan utilitzem KEYS per a que ens torne les claus que coincideixen amb el patró.
En algunes ocasions ho haurem d'arreplegar amb un objecte Set, quan no importe l'ordre. En altres ocasions amb un objecte List quan aquest ordre sí que importe.
Per exemple, si volem obtenir amb MGET els valors d'unes quantes claus, sí que importa l'ordre (el primer valor és de la primera clau, el segon de la segona). Aleshores ho obtindrem en un List:
import java.util.List;
import redis.clients.jedis.Jedis;
public class Prova3 {
public static void main(String[] args) {
Jedis con = new Jedis("localhost");
con.connect();
List<String> c = con.mget("mes1","mes2","mes3");
for (String s : c)
System.out.println(s);
con.close();
}
}
Però en canvi si volem obtenir totes les claus utilitzarem el mètode keys passant-li el patró com a paràmetre. L'ordre no importa,i a més no el podem predir. Per tant hem d'arreplegar el resultat amb un Set:
import java.util.Set;
import redis.clients.jedis.Jedis;
public class Prova4 {
public static void main(String[] args) {
Jedis con = new Jedis("localhost");
con.connect();
Set<String> c = con.keys("*");
for (String s : c)
System.out.println(s);
con.close();
}
}
I evidentment també serà el cas quan accedim als tipus de dades List, Set i segurament també Hash.
Per a accedir a tot el contingut d'un List utilitzem per exemple lrange 0 -1. Si utilitzem aquest mètode de Jedis ens tornarà un List (de Java):
import java.util.List;
import redis.clients.jedis.Jedis;
public class Prova5 {
public static void main(String[] args) {
Jedis con = new Jedis("localhost");
con.connect();
List<String> ll = con.lrange("llista1", 0, -1);
for (String e : ll)
System.out.println(e);
con.close();
}
}
Si és un Set accedirem amb el mètode smembers que tornarà un Set (de Java):
import java.util.Set;
import redis.clients.jedis.Jedis;
public class Prova6 {
public static void main(String[] args) {
Jedis con = new Jedis("localhost");
con.connect();
Set<String> s = con.smembers("colors");
for (String e : s)
System.out.println(e);
con.close();
}
}
I en el cas de Hash, amb el mètode hkeys podem obtenir tots els camps (subclaus), i a partir d'ells els seus valors. El que torna hkeys és un Set (de Java).
import java.util.Set;
import redis.clients.jedis.Jedis;
public class Prova7 {
public static void main(String[] args) {
Jedis con = new Jedis("localhost");
con.connect();
Set<String> subcamps = con.hkeys("empleat_1");
for (String subcamp : subcamps)
System.out.println(subcamp + ": " + con.hget("empleat_1", subcamp));
con.close();
}
}
Tractament dels conjunts ordenats
Els conjunts ordenats (Sorted Sets) tenen mètodes específics, igual que tots els tipus. Alguns d'aquestos mètodes tornen Strings, i un altres conjunts (Set de Java). No hi ha problema amb aquestos tipus, que ja els hem tractat.
Però hi ha uns mètodes que tornen llistes amb més d'un valor per cada element. És el cas dels mètodes ZRANGE (amb les variants ZREVRANGE, ZRANGEBYSCORE i ZREVRANGEBYSCORE), que tenen la possibilitat de dur el paràmetre WITHSCORES. En aquest cas cada element constarà del valor i de la puntuació. El que tornaran els mètodes és un Set de Tuples, objecte proporcionat per Jedis, que disposarà dels mètodes getElement() per al valor i getScore() per a la puntuació.
import java.util.Set;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
public class Prova8 {
public static void main(String[] args) {
Jedis con = new Jedis("localhost");
con.connect();
Set<Tuple> conjOrd = con.zrangeWithScores("puntuacions", 0, -1);
for (Tuple t : conjOrd)
System.out.println(t.getElement() + " ---> " + t.getScore());
con.close();
}
}