2.3 - Connexió des de Kotlin
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:
https://repo1.maven.org/maven2/redis/clients/jedis/3.5.0/jedis-3.5.0.jar
No és l'última versió, però és suficient per a nosaltres i és molt fàcil d'utilitzar
Per a fer proves, creem un nou projecte anomenat Tema8_1, 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:
val con = 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. Guardeu el següent codi en un fitxer kotlin anomenat Prova1.kt :
import redis.clients.jedis.Jedis
fun main() {
val con = Jedis("localhost")
con.connect()
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. Guardeu el següent codi en un fitxer kotlin anomenat Prova2.kt :
import redis.clients.jedis.Jedis
fun main() {
val con = Jedis("localhost")
con.connect()
val valor = "Aquesta clau és una clau creada des de Kotlin"
con.set("clau_Java", valor)
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. Guardeu el següent codi en un fitxer kotlin anomenat Prova3.kt :
import redis.clients.jedis.Jedis
fun main() {
val con = Jedis("localhost")
con.connect()
val c = con.mget("mes1", "mes2", "mes3") // c serà un MutableList
for (s in c)
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 arreplegarem el resultat amb un Set. Guardeu el següent codi en un fitxer kotlin anomenat Prova4.kt :
import redis.clients.jedis.Jedis
fun main() {
val con = Jedis("localhost")
con.connect()
val c = con.keys("*") //c és un MutableSet
for (s in c)
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 MutableList. Guardeu el següent codi en un fitxer kotlin anomenat Prova5.kt :
import redis.clients.jedis.Jedis
fun main(){
val con = Jedis("localhost")
con.connect()
val ll = con.lrange("llista1", 0, -1) // ll és un MutableList
for (e in ll)
println(e)
con.close()
}
Si és un Set accedirem amb el mètode smembers que tornarà un MutableSet. Guardeu el següent codi en un fitxer kotlin anomenat Prova6.kt :
import redis.clients.jedis.Jedis
fun main(){
val con = Jedis("localhost")
con.connect()
val s = con.smembers("colors") // s és un MutableSet
for (e in s)
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 MutableSet. Guardeu el següent codi en un fitxer kotlin anomenat Prova7.kt :
import redis.clients.jedis.Jedis
fun main(){
val con = Jedis("localhost")
con.connect()
val subcamps = con.hkeys("empleat_1") // sucamps és un MutableSet
for (subcamp in 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 (MutableSet). 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 MutableSet de Tuples, objecte proporcionat per Jedis, que disposarà dels mètodes getElement() per al valor i getScore() per a la puntuació. Guardeu el següent codi en un fitxer kotlin anomenat Prova8.kt:
import redis.clients.jedis.Jedis
fun main() {
val con = Jedis("localhost")
con.connect()
val conjOrd = con.zrangeWithScores("puntuacions", 0, -1) // conjOrd és un MutableSet<Tuple>
for (t in conjOrd)
println(t.getElement() + " ---> " + t.getScore())
con.close()
}
Llicenciat sota la Llicència Creative Commons Reconeixement NoComercial SenseObraDerivada 4.0