Demo-Redis
===
Redis é uma base NoSQL baseada em chave-valor de alta performance, vamos evoluir no conhecimento desta com o tutorial que segue

~~NoSQL = No Sql~~
NoSql = **N**ot **O**nly SQL
---
# Simulações com REDIS
## HANDS ON! => https://try.redis.io/
#### Documentação Oficial https://redis.io/commands
---
# Tipos de Dados
|Tipos|
|:-:|
|Keys/strings|
|Lists|
|Sorted sets|
|Hashes|
---
## manipulando strings básicas
```bash=
> SET server:name "fido"
OK
> GET server:name
"fido"
```
---
## manipulando valores numericos básicas
```bash=
> SET connections 10
OK
> INCR connections
(integer) 11
> INCR connections
(integer) 12
> DEL connections
(integer) 1
> INCR connections
(integer) 1
```
---
## trabalhando com expiração dos dados
```bash=
# setando chave valor...
> SET resource:batata "Redis Demo"
OK
# definindo expiração da info em 10seg
> EXPIRE resource:batata 10
(integer) 1
# consultando o TimeToLive de nosso dado
> TTL resource:batata
(integer) 7
# se deixarmos expirar e consultar ttl temos -2
> TTL resource:batata
(integer) -2
# se nao setarmos expire e consultar ttl temos como -1 por default
> TTL resource:batata
(integer) -1
# podemos antes de expirar podemos manipular o valor do expire
> EXPIRE resource:batata 10
# uma vez expirado nosso dado é excluído
> GET resource:batata
(nil)
```
---
## Manipulando Arrays
---
### inclusões
```bash=
# add valor no fim do array
> RPUSH devs "Alice"
(integer) 1
> RPUSH devs "Bob"
(integer) 2
# add valor no inicio do array
> LPUSH devs "Sam"
(integer) 3
```
---
### Consultas em arrays
```bash=
# retorna array do 0 ao fim
> LRANGE devs 0 -1
1) "Sam"
2) "Alice"
3) "Bob"
# retorna array do 0 ao fim
> LRANGE devs 0 0
1) "Sam"
# retorna do array id 0 ao 1
> LRANGE devs 0 1
1) "Sam"
2) "Alice"
# retorna do array id 1 ao 2
> LRANGE devs 1 2
1) "Alice"
2) "Bob"
# retorna do array id 1
> LRANGE devs 1 1
1) "Alice"
# retorna do array id 1 ao fim
> LRANGE devs 1 -1
1) "Alice"
2) "Bob"
```
---
# Tratando Filas...
```bash=
# conta elementos de nosso array
> LLEN devs
(integer) 3
# captura PRIMEIRO valor do array e remove da lista
> LPOP devs
"Sam"
# captura ÚLTIMO valor do array e remove da lista
> RPOP devs
"Bob"
# conta elementos de nosso array
> LLEN devs
(integer) 1
# retorna do array id 0 ao fim
> LRANGE devs 0 -1
1) "Alice"
```
---
## Similar a manipulação de lista, mas cada valor só pode aparece 1 vez
```bash=
# add valor da var
> SADD superpowers "flight"
(integer) 1
# add valor da var
> SADD superpowers "x-ray vision"
(integer) 1
# add valor da var
> SADD superpowers "reflexes"
(integer) 1
# remove valor da var
> SREM superpowers "reflexes"
1
# check if exists value on var
> SISMEMBER superpowers "flight"
(integer) 1
# check if exists value on var
> SISMEMBER superpowers "reflexes"
(integer) 0
# list var itens
> SMEMBERS superpowers
1) "x-ray vision"
2) "flight"
# add valor da var
> SADD birdpowers "pecking"
(integer) 1
# add valor da var
> SADD birdpowers "flight"
(integer) 1
# union 2 vars
> SUNION superpowers birdpowers
1) "pecking"
2) "flight"
3) "x-ray vision"
```
---
## trabalhando com listagems com Auto-Ordenação
```bash=
# Add values
> ZADD hackers 1940 "Alan Kay"
(integer) 1
> ZADD hackers 1906 "Grace Hopper"
(integer) 1
> ZADD hackers 1953 "Richard Stallman"
(integer) 1
> ZADD hackers 1965 "Yukihiro Matsumoto"
(integer) 1
> ZADD hackers 1916 "Claude Shannon"
(integer) 1
> ZADD hackers 1969 "Linus Torvalds"
(integer) 1
> ZADD hackers 1957 "Sophie Wilson"
(integer) 1
> ZADD hackers 1912 "Alan Turing"
(integer) 1
# redis classifica estes automaticamente
> ZRANGE hackers 0 -1
1) "Grace Hopper"
2) "Alan Turing"
3) "Claude Shannon"
4) "Alan Kay"
5) "Richard Stallman"
6) "Sophie Wilson"
7) "Yukihiro Matsumoto"
8) "Linus Torvalds"
# retorna intervalo de dados
> ZRANGE hackers 2 4
1) "Claude Shannon"
2) "Alan Kay"
3) "Richard Stallman"
```
---
# Dados tipo Hashes
```bash=
# populando hash
> HSET user:1000 name "John Smith"
(integer) 1
# populando hash
> HSET user:1000 email "john.smith@example.com"
(integer) 1
# populando hash
> HSET user:1000 password "s3cret"
(integer) 1
# retornando dados de uma hash
> HGETALL user:1000
1) "name"
2) "John Smith"
3) "email"
4) "john.smith@example.com"
5) "password"
6) "s3cret"
# populando multiplos valores para uma hash
> HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"
OK
# retornando dado específico de uma hash
> HGET user:1001 name
"Mary Jones"
```
---
## Trabalhando com Valor numerico em Hashes
```bash=
# set valor
> HSET user:1000 visits 10
(integer) 1
# incrementa em 1 valor
> HINCRBY user:1000 visits 1
(integer) 11
# incrementa em 10 valor
> HINCRBY user:1000 visits 10
(integer) 21
# Deleta visits do hash
> HDEL user:1000 visits
(integer) 1
# cria e incrementa visits no hash
> HINCRBY user:1000 visits 1
(integer) 1
```
---
## Comandos adicionais para manipulação de hash
```bash=
# Captura todos os parametros de um hash
> HGETALL user:1000
1) "name"
2) "John Smith"
3) "email"
4) "john.smith@example.com"
5) "password"
6) "s3cret"
7) "visits"
8) "3"
# retorna valores sem rotulo
> HVALS user:1000
1) "John Smith"
2) "john.smith@example.com"
3) "s3cret"
4) "3.2"
# captura o comprimento de um hash
> HLEN user:1000
4
# Valida se existe
> HEXISTS user:1000 visits
(integer) 1
# incrementa valor em float
> HINCRBYFLOAT user:1000 visits 0.1
3.1
> HINCRBYFLOAT user:1000 visits 0.1
3.2
# retorna muliplos itens de um hash
> HMGET user:1000 visits name
1) "3.2"
2) "John Smith"
# seta valor somente se não existir
> HSETNX myhash field "Hello"
(integer) 1
> HSETNX myhash field "World"
(integer) 0
> HGET myhash field
"Hello"
# multiple set
> HMSET myhash f1 HelloWorld f2 99 f3 -256
"OK"
# strlen
> HSTRLEN myhash f1
(integer) 10
# strlen
> HSTRLEN myhash f2
(integer) 2
# strlen
> HSTRLEN myhash f3
(integer) 4
```
HSCAN key cursor [MATCH pattern] [COUNT count]
Incrementally iterate hash fields and associated values
```bash=
> SADD hashkeys "myhash" "myhash1" "myhash2"
(integer) 3
> sscan hashkeys 0 match my*
1) "0"
2) 1) "myhash1"
2) "myhash2"
3) "myhash"
> sscan hashkeys 0 match my*2
1) "0"
2) 1) "myhash2"
> sscan hashkeys 0 match *1
1) "0"
2) 1) "myhash1"
> sscan hashkeys 0 match z
1) "0"
2) (empty list or set)
```
---
# Benchmark de servidores REDIS
```bash=
# Zera Redis
redis-cli flushall
redis-benchmark -t set -r 100000 -n 1000000
redis-benchmark -n 100000
# teste realizado em vm playWithDocker
root@7e43aace2baf:/data# redis-benchmark -t set,get,lpush -n 100000 -q
SET: 57240.98 requests per second
GET: 61957.87 requests per second
LPUSH: 61500.61 requests per second
```
---
# E no PHP? :sunglasses:
`apt install php5-redis`
https://github.com/phpredis/phpredis

---
# E no Docker?
```bash=
# Redis-Alpine -> 10 MB
$ docker run --name redis -p6379:6379 -d redis:5.0.5-alpine
```
```dockerfile=
redis:
image: 'redis:4-alpine'
command: redis-server --requirepass yourpassword
ports:
- '6379:6379'
```
---
### extras => https://redis.io/
# Tarefa de Casa > https://try.redis.io/
###### tags: `Estudos`
{"metaMigratedAt":"2023-06-14T23:20:10.171Z","metaMigratedFrom":"Content","title":"Demo-Redis","breaks":true,"contributors":"[{\"id\":\"6092e201-5e2d-4e7f-ade9-2e08afebdcc7\",\"add\":7219,\"del\":0}]"}