---
title: DAM-M06, DAW-M07 Redis com a base de dades clau valor.
tags: DAM, M6, DAW M7
---
[Link en MarkDown](https://hackmd.io/@JdaXaviQ/H1u2oHddo)
# DAM-M06, DAW-M07 Redis com a base de dades clau valor.

__Redis__ és coneguda com una base de dades del tipus clau-valor, però en realitat és molt més, perque els valors que accepta poden tenir diferents estructures suportades de forma nativa, com per exemple: conjunts, llistes, taules indexades (hash tables) i fins i tot un tipus de dades __stream__.
Té la particularitat de que emmagatzema totes les dades en memòria per a obtenir una baixa latència d'accés a les dades, tot i que també implementa mecanismes de persistència a disk per evitar pèrdues si s'apaga el sistema, ja sigui de forma controlada o per qualsevol incident.
També permet distribuir les dades en _clusters_ de servidors i que es distribueixin de forma automàtica si el cluster creix.
Altra característica destacada és que dona eines per alta disponibilitat, com pot ser, per exemple, la posibilitat de realitzar rèpliques amb recuperació automàtica d'errors tant en sistemes '_stand alone_' com en _clusters_.
## Cassos d'ús.
* Base de dades cau: L'ús més popular de Redis, segurament és el de base de dades _'caché'_.
* Base de dades de sessió.
* Base de dades en temps real. La seva condició de base de dades en memòria la fan particularment atractiva per aquelles aplicacions que requereixin una baixa latència i un alta amplada de banda de dades subministrades.
* Base de dades generalista. Aquest, segurament, no és el seu fort.
## Instal·lació i primeres passes.
A Ubuntu podem instal·lar redis directament dels repositoris oficials:
```bash=
sudo apt update; sudo apt install -y redis
```
Un cop instal·lat podem verificar que el servidor està corrent al nostre sistema.
```bash=
systemctl status redis
● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; preset:>
Active: active (running) since Thu 2022-12-15 08:55:01 CET; 1min 55s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 7037 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 18910)
Memory: 3.3M
CPU: 297ms
CGroup: /system.slice/redis-server.service
└─7037 "/usr/bin/redis-server 127.0.0.1:6379"
dic 15 08:55:01 xavi-portatil systemd[1]: Starting Advanced key-value store...
dic 15 08:55:01 xavi-portatil systemd[1]: Started Advanced key-value store.
```
Ara ja podem obrir el client redis per a línia de comandes i començar a practicar.
```bash=
redis-cli
127.0.0.1:6379>
```
## Tipus de dades natius.
* :heavy_check_mark: __String__: És el tipus de dades bàsic que representa un array de bytes. :warning: Els strings de Redis no són els strings que coneixem als llenguatges de programació, són array de bytes i també podem desar nombres i operar amb ells.
* :heavy_check_mark: __List__: Array d'strings ordenat per ordre d'inserssió.
* :heavy_check_mark: __Hash__: Col·lecció no ordenada de parelles clau-valor. És l'equivalent dels diccionaris de Python o dels HashMaps de Java.
* :heavy_check_mark: __Set__: Conjunt no ordenat d'strings no repetits. Té la particularitat de que podem afegir, treure o saber si conté un determinat string en temps __O(1)__, es a dir, aquesta operació sempre triga el mateix temps independenment del nombre d'elements que contingui el Set.
* __Sorted Set__: Set ordenat d'strings.
* __Stream__: Els Streams funcionen com un log seqüencial, on només podem escriure afegint dades al final. Els streams proporcionen diferents estratègies per a evitar que creixin de forma descontrolada i diferents formes de llegir les entrades. Cada entrada al stream s'associa amb una id automàtica.
* __Geospatial indexes__: Està pensat per a desar coordinades geogràfiques, proporciona eines de cerca per proximitat o contingudes dins d'una caixa.
```bash=
> GEOSEARCH locations:ca FROMLONLAT -122.2612767 37.7936847 BYRADIUS 5 km WITHDIST
1) 1) "station:1"
2) "1.8523"
2) 1) "station:2"
2) "1.4979"
3) 1) "station:3"
2) "2.2441"
```
* __Bitmap__: __NO__ representa una imatge, representa un vector de bits sobre els que podem operar de forma individual.
* __Bitfield__: Codifica de forma binària nombres enters de longitud arbitrària en Strings. Proporciona operacions per obtenir, modificar e incrementar enters de manera atòmica i per a determinar el nombre de bits que ocuparà aquest nombre.
* __HyperLogLog__: És una estructura de dades que estima de forma estadística la cardinalitat (nombre d'el·lements) d'un conjunt. Per a més informació visiteu la [documentació oficial](https://redis.io/docs/data-types/hyperloglogs/).
## Recursos:
* A [Try Redis](https://try.redis.io/), podem executar un tutorial molt interessant d'aquesta base de dades.
* I sempre és útil anar directament a la font i consultar la __[documentació oficial](https://redis.io/docs/)__.
* [Client Redis per a PHP](https://developer.redis.com/develop/php/).
* [Client Redis per a Python](https://developer.redis.com/develop/python/).
*