文章目录
1.概述
笔记小结:
- NoSQL:非关系型数据库,NoSQL数据库提供了一种不同的数据存储和查询模型。
- Redis特征:
- Tipo de valor-chave, o valor suporta uma variedade de estruturas de dados diferentes e possui funções ricas
- Thread único , cada comando é atômico ( a parte da rede no Redis6.0 é multithread )
- Baixa latência, rápida ( baseada em memória , multiplexação IO, boa codificação).
- Suporta persistência de dados
- Suporta clusters mestre-escravo e clusters fragmentados
- Suporte a clientes multilíngues
- Novos recursos do Redis:
- Funções Redis
- Despejo de cliente
- ACL v2
- AOF multiparte
- ……
1.1NoSQL
NoSQL (Not Only SQL) é uma classificação ampla de banco de dados que representa um grupo de sistemas de gerenciamento de banco de dados não relacionais. Comparados aos bancos de dados relacionais tradicionais (como bancos de dados SQL), os bancos de dados NoSQL fornecem um modelo de consulta e armazenamento de dados diferente.
ilustrar:
- Os bancos de dados relacionais armazenam dados estruturados e podem adicionar restrições e outras condições a cada tupla ou campo.
- Os bancos de dados não relacionais armazenam dados não estruturados, geralmente na forma de pares chave-valor. Os dados armazenados são diversos e podem ser documentos ou imagens.
ilustrar:
- Os dados armazenados em um banco de dados relacional podem ser relacionados por meio de uma terceira tabela
- Os dados armazenados em bancos de dados não relacionais não estão relacionados entre si
ilustrar:
- Os dados armazenados no banco de dados relacional podem ser adicionados, excluídos, modificados e verificados através de instruções SQL.
- Cada um dos dados armazenados em bancos de dados não relacionais tem sua própria maneira de armazenar dados e as regras de armazenamento são diferentes.
ilustrar:
- Os bancos de dados relacionais suportam as características ACID das transações, incluindo Atomicidade, Consistência, Isolamento e Durabilidade.
- O armazenamento de banco de dados não relacional não possui transações
Em geral, a diferença entre SQL e NoSQL pode ser resumida em uma tabela:
1.2 Significado
Redis nasceu em 2009. Seu nome completo é RemoteDictionaryServer , um servidor de dicionário remoto, que é um dado NoSQL de valor-chave baseado em memória.
recurso:
- Tipo de valor-chave, o valor suporta uma variedade de estruturas de dados diferentes e possui funções ricas
- Thread único , cada comando é atômico (a parte da rede no Redis6.0 é multithread)
- Baixa latência, rápida (baseada em memória, multiplexação IO, boa codificação).
- Suporta persistência de dados
- Suporta clusters mestre-escravo e clusters fragmentados
- Suporte a clientes multilíngues
1.3Novos recursos do Redis
Funções Redis
ilustrar:
A função Redis, uma nova maneira de estender o Redis por meio de scripts do lado do servidor, é armazenada junto com os próprios dados. Resumindo, o próprio redis vai roubar os trabalhos dos scripts Lua
Despejo de cliente
ilustrar:
O número de pessoas conectadas ao Redis e o desempenho tornam-se configuráveis
AOF multiparte
ilustrar:
Leitura e escrita assíncronas não são mais um problema
ACL v2
ilustrar:
Gerenciamento de permissões refinado, você pode configurar senhas para o cluster, etc.
pacote de lista
ilustrar:
Listpack é uma nova estrutura de dados usada para substituir o ziplist. Não há configuração do ziplist na versão 7.0 (apenas alguns tipos de dados são usados como estágio de transição na versão 6.0)
2. Casos de uso básicos
Resumo das notas:
Instalar e executar
Nas janelas…
No contêiner Docker
sudo docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass qweasdzxc
Usando a interface gráfica...
Comandos comuns
- Tipo de string:
- 添加:SET、GET、MSET(conjunto múltiplo)、MGET
- 修改:INCR(aumentar)、INCRBY(aumentar em)、INCRBYFLOAT(aumentar em float)、SETNX(definir se não existir)、SETEX(definir se expirar)
- Tipo de hash:
- Adição: HSET, HGET, HMSET (conjunto múltiplo de hash)
- Exemplo: HINCRBY (aumento de hash), HSETNX (conjunto de hash se não existir)
- Consulta: HMGET (hash muitiple get), HGETALL, HKEYS, HVALS
- Tipo de lista:
- Adicionado: LPUSH, RPUSH
- Excluir: LPOP, RPOP, BLPOP e BRPOP: semelhante a LPOP e RPOP, exceto que espera o tempo especificado quando não há elementos, em vez de retornar nulo diretamente
- Consulta: LRANGE
- Tipo de conjunto:
- Adição: SADD (adição de conjunto)
- Excluir: SREM (definir remover membro)
- Exemplo: SINTER (definir interseção), SUNION (conjunto de união), 、SDIFF (definir diferente)
- 查询:SCARD (definir cardinalidade)、SISMEMBER(conjunto é membro)、SMEMBERS(conjunto de membros)
- Tipo SortedSet, tipo BitMap, tipo HyperLogLog, tipo Stream, tipo GEO: verifique para obter detalhes
2.1 Instalar e executar
2.1.1 No sistema Windows
Etapa 1: descompacte
ilustrar:
Após a instalação, os seguintes arquivos serão gerados
Exemplo de inicialização:
Etapa 2: iniciar o servidor
redis-server.exe redis.windows.conf
ilustrar:
- Ao iniciar o servidor, você precisa especificar o arquivo de configuração redis
- Se nenhum item de configuração for adicionado, um erro será relatado.
Perceber:
Precisa adicionar itens de configuração conf
Etapa 3: inicie o cliente
1. Inicie o cliente
ilustrar:
Se o servidor redis for iniciado, mas o prompt "Executando em modo autônomo" não aparecer, será necessário abrir o cliente e executar uma operação de desligamento.
# 通过cmd打开客户端 redis-cli.exe # 关闭客户端 shutdown
Agora reinicie o servidor
2. Reinicie o servidor
redis-server.exe redis.windows.conf
ilustrar:
- Sucesso após reiniciar
2.1.2 No contêiner Docker
Etapa 1: extrair a imagem do Docker
sudo docker pull redis
Etapa 2: iniciar o servidor
sudo docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /home/redis/myredis/redis.conf:/etc/redis/redis.conf -v /home/redis/myredis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass qweasdzxc
Descrição: Explicação dos parâmetros
sudo docker run
: Comando para executar o contêiner Docker.--restart=always
: configure o contêiner para reiniciar automaticamente ao sair.--log-opt max-size=100m
: defina o tamanho máximo dos arquivos de log do contêiner como 100 MB.--log-opt max-file=2
: defina o número máximo de arquivos de log retidos pelo contêiner como 2.-p 6379:6379
: mapeie a porta de serviço Redis do contêiner para a porta 6379 do host.--name myredis
: Especifique o nome do contêiner como "myredis".-v /home/redis/myredis/redis.conf:/etc/redis/redis.conf
: monte o arquivo de configuração do Redis no host no/etc/redis/redis.conf
caminho do contêiner.-v /home/redis/myredis/data:/data
: monte o diretório de dados no host no/data
caminho do contêiner para persistir dados do Redis.-d redis
: Especifique a imagem do contêiner a ser executada como "redis", que é a imagem fornecida oficialmente pelo Redis.redis-server /etc/redis/redis.conf
: especifique o serviço Redis a ser executado quando o contêiner for iniciado e passe o caminho do arquivo de configuração do Redis.--appendonly yes
: ative o modo de persistência AOF (Append Only File) do Redis e anexe a operação de gravação ao arquivo no disco.--requirepass qweasdzxc
: Defina a senha do servidor Redis como "qweasdzxc", ou seja, é necessária uma senha para acessar o serviço Redis.
Perceber:
Se você precisar habilitar o serviço de acesso remoto do Redis, será necessário definir uma senha para o Redis.
Etapa 3: inicie o cliente
redis-cli [options] [commonds]
redis-cli -h 127.0.0.1 -p 6739 -a qweasdzxc
Descrição: Explicação dos parâmetros
-h 127.0.0.1
: Especifique o endereço IP do nó redis ao qual se conectar, o padrão é 127.0.0.1-p 6379
: Especifique a porta do nó redis a ser conectado, o padrão é 6379-a 123321
: Especifique a senha de acesso para redis
Reabastecimento:
ping
: Faça um teste de pulsação com o servidor redis e o servidor retornará normalmentepong
2.1.3 Execute o cliente de interface gráfica
Passo 1: Baixe o cliente
URL; lework/RedisDesktopManager-Windows: versão do RedisDesktopManager para Windows (github.com)
Descrição: resultado
Etapa 2: instalar
ilustrar:
A instalação falhou, você precisa instalar a biblioteca de tempo de execução para executar o Visual C++
Etapa 3: executar
2.2 Comandos comuns
2.2.1 Visão geral
Redis é um banco de dados de valor-chave. A chave geralmente é do tipo String, mas o tipo de valor é variado:
ilustrar:
Existem muitos tipos de dados de redis, agora apresentaremos os comandos de cada tipo por vez
Para facilitar nosso aprendizado, o Redis também agrupa comandos para operar diferentes tipos de dados. Você pode visualizar diferentes comandos no site oficial ( https://redis.io/commands ):
![imagem-20230614102229254](https://gitee.com/lj-txy/blog-images/raw/master/image-20230614102229254-16872451637723.png)
2.2.2 Comandos comuns
Instruções gerais são instruções que podem ser usadas para alguns tipos de dados. As mais comuns incluem:
- CHAVES: Visualize todas as chaves que correspondem ao modelo. Não é recomendado o uso em equipamentos de ambiente de produção.
- DEL: exclui uma chave especificada
- EXISTS: Determine se a chave existe
- EXPIRE: Defina o período de validade de uma chave. A chave será excluída automaticamente quando o período de validade expirar.
- TTL: Verifique o período de validade restante de uma CHAVE
ilustrar:
Não é
keys
recomendado usá-lo em equipamentos de ambiente de produção porque o Redis é de thread único. Se houver muitos valores de chave a serem encontrados, isso causará bloqueio de thread.
Reabastecimento:
- Você pode verificar o uso específico de um comando através da ajuda [comando], por exemplo:
2.2.3Tipo de string
2.2.3.1 Visão geral
O tipo String, também conhecido como tipo string, é o tipo de armazenamento mais simples no Redis.
Seu valor é uma string, mas dependendo do formato da string, pode ser dividido em três categorias:
- string: string comum
- int: tipo inteiro, pode realizar operações de incremento e decremento automático
- float: tipo de ponto flutuante, pode realizar operações de incremento e decremento automático
Não importa o formato, a camada inferior é armazenada na forma de uma matriz de bytes, mas o método de codificação é diferente. O espaço máximo do tipo string não pode ultrapassar 512m.
ilustrar:
No tipo String, a camada inferior do Redis pode ser dividida em três tipos para armazenamento, ou seja, strings serão convertidas em bytes para armazenamento e números e números de ponto flutuante serão convertidos em binários para armazenamento.
2.2.3.2 Comandos comuns
1.Novo
- SET: Adicionar ou modificar um par de valores-chave do tipo String existente
- GET: Obtenha o valor do tipo String com base na chave
- MSET (conjunto múltiplo): adicione vários pares de valores-chave do tipo String em lotes
- MGET (obtenção múltipla): Obtenha vários valores do tipo String com base em várias chaves
ilustrar:
- O comando acima foi definido com sucesso
2. Autocrescimento
- INCR (aumento): Deixe uma chave inteira aumentar em 1
- INCRBY (aumentar em): Deixe uma chave inteira aumentar sozinha e especificar o tamanho do passo. Por exemplo: incrby num 2 faz com que o valor num aumente em 2.
- INCRBYFLOAT (aumentar por float): Deixe um número do tipo ponto flutuante aumentar sozinho e especifique o tamanho do passo
ilustrar:
- Ao usar o incremento automático, o número aumentará conforme necessário
3. Comandos combinados
- SETNX (definir se não existir): Adicione um par chave-valor do tipo String, desde que a chave não exista, caso contrário não será executada.
- SETEX (definir se expirar): Adicione um par chave-valor do tipo String e especifique o período de validade
ilustrar:
- Se a chave já existir no Redis, a configuração falhará.
2.2.3.3 Estrutura chave
A chave Redis permite que várias palavras formem uma estrutura hierárquica. Várias palavras são separadas por ':'. O formato é o seguinte:
项目名:业务名:类型:id
ilustrar:
Este formato não é fixo e as entradas podem ser excluídas ou adicionadas de acordo com suas necessidades.
Por exemplo, o nome do nosso projeto é heima, e existem dois tipos diferentes de dados: usuário e produto. Podemos definir a chave assim:
user相关的key:heima:user:1 product相关的key:heima:product:1
Se Value for um objeto Java, como um objeto User, o objeto poderá ser serializado em uma string JSON e armazenado:
CHAVE | VALOR |
---|---|
casa:usuário:1 | ' {“id”:1, “nome”: “Jack”, “idade”: 21} ' |
casa:produto:1 | ' {"id":1, "nome": "Xiaomi 11", "preço": 4999} ' |
ilustrar:
- Depois de usar o método de agrupamento Redis
:
, você pode ver as ferramentas de visualização e criar grupos para nós.
2.2.4 Tipo de hash
2.2.4.1 Visão geral
Tipo Hash, também chamado de hash, seu valor é um dicionário não ordenado, semelhante à estrutura HashMap em Java. A estrutura String serve para serializar o objeto em uma string JSON e armazená-lo. É muito inconveniente quando você precisa modificar um determinado campo do objeto:
A estrutura Hash pode armazenar cada campo do objeto de forma independente, e o CRUD pode ser executado em um único campo:
2.2.4.2 Comandos comuns
1.Novo
- Valor do campo chave HSET: adicione ou modifique o valor do campo da chave do tipo hash
- Campo-chave HGET: obtenha o valor do campo de uma chave do tipo hash
- HMSET (conjunto múltiplo de hash): adicione valores de campo de várias chaves do tipo hash em lotes
ilustrar:
HMSET
será excluído porque o efeito éHSET
semelhante a
2. Autocrescimento
- HINCRBY (aumento de hash): permite que o valor do campo de uma chave do tipo hash aumente automaticamente e especifique o tamanho do passo
ilustrar:
- Você pode ver o valor da idade e o crescimento aqui
3. Comandos combinados
- HSETNX (hash set se não existir): Adicione um valor de campo de uma chave do tipo hash, desde que o campo não exista, caso contrário não será executado.
ilustrar:
- A chave com o valor-chave aqui
ljtxy:product"1
já possui o campo idade, portanto a configuração falha.
4. Consulta
- HMGET (hash multiple get): obtém valores de campos de múltiplas chaves de tipo hash em lotes
- HGETALL: Obtenha todos os campos e valores em uma chave do tipo hash
- HKEYS: Obtenha todos os campos em uma chave do tipo hash
- HVALS: Obtenha todos os valores em uma chave do tipo hash
2.2.5 Tipo de lista
2.2.5.1 Visão geral
O tipo List no Redis é semelhante ao LinkedList em Java e pode ser considerado como uma estrutura de lista duplamente vinculada. Ele suporta pesquisa direta e pesquisa reversa .
As características também são semelhantes ao LinkedList:
- ordenadamente
- Os elementos podem ser repetidos
- Inserção e exclusão rápida
- A velocidade da consulta é média
Comumente usado para armazenar dados ordenados, como: círculo de amigos como lista, lista de comentários, etc.
2.2.5.2 Comandos comuns
1.Novo
- Elemento-chave LPUSH…: Insira um ou mais elementos à esquerda da lista
- Elemento-chave RPUSH…: Insira um ou mais elementos no lado direito da lista
Descrição: resultado
2.Excluir
-
Chave LPOP: remove e retorna o primeiro elemento do lado esquerdo da lista ou retorna nulo se não houver nenhum
-
Chave RPOP: Remove e retorna o primeiro elemento do lado direito da lista
-
BLPOP e BRPOP: Semelhante a LPOP e RPOP, mas aguarde o tempo especificado quando não há elementos, em vez de retornar nulo diretamente
ilustrar:
- Semelhante a esperar pelo tempo de atraso especificado, se o tempo limite retornar nulo
3. Consulta
- LRANGE key star end: retorna todos os elementos dentro do intervalo de uma marca de canto
Descrição: resultado
2.2.6 Tipo de conjunto
2.2.6.1 Visão geral
A estrutura Set do Redis é semelhante ao HashSet em Java e pode ser considerada um HashMap com valor nulo. Por também ser uma tabela hash , ela possui características semelhantes ao HashSet :
- transtorno
- Os elementos não podem ser repetidos
- Encontre rápido
- Suporta intersecção, união, diferença e outras funções
2.2.6.2 Comandos comuns
1.Novo
- Membro chave SADD (set addtion)...: Adicione um ou mais elementos ao conjunto
2.Excluir
- Membro chave SREM (set remove member)…: remove o elemento especificado no conjunto
3. Cruzamento e diferença
- SINTER (definir interseção) key1 key2 ...: Encontre a interseção de key1 e key2
- SUNION (definir união) key1 key2...: Encontre a união de key1 e key2
- SDIFF (definir diferente) key1 key2 ...: Encontre a diferença definida entre key1 e key2
ilustrar:
4. Consulta
- Chave SCARD (definir cardinalidade): Retorna o número de elementos do conjunto
- Membro chave SISMEMBER (conjunto é membro): Determine se um elemento existe no conjunto
- SMEMBERS (membros do conjunto): Obtenha todos os elementos do conjunto
2.2.7SortedSetType
2.2.7.1 Visão geral
O SortedSet do Redis é uma coleção de conjuntos classificáveis, um pouco semelhante ao TreeSet em Java, mas a estrutura de dados subjacente é muito diferente. Cada elemento em SortedSet possui um atributo de pontuação e os elementos podem ser classificados com base no atributo de pontuação.A implementação subjacente é uma lista de pulos (SkipList) mais uma tabela hash.
SortedSet possui as seguintes propriedades:
- Classificável
- Os elementos não são repetidos
- A velocidade da consulta é rápida
Devido à natureza classificável do SortedSet, ele é frequentemente usado para implementar funções como classificações.
2.2.7.2 Comandos comuns
1.Novo
- Membro de pontuação chave ZADD [membro de pontuação]: Adicione um ou mais elementos ao conjunto classificado e atualize seu valor de pontuação se ele já existir
ilustrar:
- novo valor
2.Excluir
- Membro chave ZREM: exclui um elemento especificado no conjunto classificado
ilustrar:
- Excluir valor
3. Cruzamento e diferença
- ZDIFF, ZINTER, ZUNION: encontrando diferenças, interseções e uniões
3. Consulta
- Membro chave ZSCORE: Obtenha o valor da pontuação do elemento especificado no conjunto classificado
- Membro chave ZRANK: Obtenha a classificação do elemento especificado no conjunto classificado
- Chave ZCARD: Obtenha o número de elementos no conjunto classificado
- Chave ZCOUNT min max: conte o número de todos os elementos cujo valor de pontuação está dentro de um determinado intervalo
- Membro de incremento da chave ZINCRBY: faz com que o elemento especificado no conjunto classificado seja incrementado automaticamente e o tamanho do passo seja o valor de incremento especificado
- Chave ZRANGE min max: Após classificar por pontuação, obtenha os elementos dentro da faixa de classificação especificada
ilustrar:
- range significa retornar os elementos correspondentes
- Chave ZRANGEBYSCORE min max: Após classificar por pontuação, obtenha os elementos dentro do intervalo de pontuação especificado
ilustrar;
- rangbyscore obtém os elementos classificados dentro do intervalo especificado
2.2.7.3 Cenários de aplicação
2.2.8Tipo BitMap
2.2.8.1 Visão geral
Um tipo de dados de estado binário estatístico implementado usando o tipo String como estrutura de dados subjacente. Bitmap é essencialmente um array, que é uma operação bit a bit baseada no tipo de dados String. A matriz consiste em vários bits binários, cada um dos quais corresponde a um deslocamento (chamamos isso de índice). O número máximo de bits suportado pelo Bitmap é 2 32 bits, o que pode economizar muito espaço de armazenamento. Ele pode armazenar até 4,29 bilhões de bytes de informações usando 512M de memória (2 32= 4294967296)
2.2.8.2 Comandos comuns
1.Novo
- valor de deslocamento da chave setbit: adiciona um elemento ao valor da posição especificada
ilustrar:
- novo valor
2. Consulta
Obtenha o valor do elemento especificado
- getbit key offset: obtém o valor da posição especificada do elemento especificado
ilustrar:
- Valor da consulta
Obtenha os bytes de armazenamento do elemento especificado
- chave strlen: obtém o número de bytes armazenados no elemento especificado
ilustrar:
- Consultar espaço ocupado
- chave bitcount: obtém o número de 1 no elemento especificado
ilustrar:
- Consultar o número de 1
Obtenha o armazenamento de bits de vários elementos especificados :
- Chave de destino da operação BITOP [chave…]: Obtenha elementos em vários bits
ilustrar:
Reabastecimento:
BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN
, execute uma união lógica em uma ou mais chaves e salve o resultado em destkey.BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN
, execute OR lógico em uma ou mais chaves e salve o resultado em destkey.BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN
, execute XOR lógico em uma ou mais chaves e salve o resultado em destkey.BITOP NOT destkey srckey
, execute a negação lógica na chave fornecida e salve o resultado em destinokey.
2.2.8.3 Cenários de aplicação
Conte o número de check-ins do usuário
2.2.9Tipo HyperLogLog
2.2.9.1 Visão geral
Redis HyperLogLog é um algoritmo usado para estatísticas de cardinalidade . A vantagem do HyperLogLog é que quando o número ou volume de elementos de entrada é muito grande, o espaço necessário para calcular a cardinalidade é sempre fixo e muito pequeno.
No Redis, cada chave HyperLogLog custa apenas 12 KB de memória para calcular a cardinalidade de quase 2 ^ 64 elementos diferentes. Isto contrasta fortemente com uma coleção que consome mais memória ao calcular a cardinalidade. Quanto mais elementos houver, mais memória será consumida.
2.2.9.2 Comandos comuns
1.Novo
- Elemento-chave PFADD (Adição Fixa Probabilística) [element...]: Adicione o elemento especificado ao HyperLogLog
ilustrar:
- Adicionar novo elemento
2.Modificar
- PFMERGE (Fusão Fixa Probabilística) destkey sourcekey [sourcekey...]: mescla vários HyperLogLogs em um HyperLogLog
ilustrar:
- mesclar base
3. Consulta
- Chave PFCOUNT [chave…]: Retorna a estimativa de cardinalidade para o HyperLogLog fornecido
ilustrar:
- Obtenha o número básico após a desduplicação
2.2.9.3 Cenários de aplicação
Contar o UA (número de visitas de usuários) de sites comerciais
2.2.10 Tipo de fluxo
2.2.10.1 Visão geral
Stream é um novo tipo de dados introduzido no Redis 5.0, que pode implementar uma fila de mensagens muito completa.
2.2.10.2 Comandos comuns
1.Novo
- Valor do campo de ID da chave XADD [valor do campo…]: Use XADD para adicionar mensagens à fila. Se a fila especificada não existir, crie a fila.
ilustrar:
- Ver resultados
- XGROUP [CREATE key groupname id-or-$]: Criar grupo de consumidores
ilustrar:
- Crie o grupo de consumidores g1 com a chave s1 e retenha os dados
- XGROUP [chave CREATECONSUMER nome do grupo nome do consumidor]: Adicione o consumidor especificado no grupo de consumidores
ilustrar:
- Especifique a chave e o grupo de consumidores e adicione consumidores a eles
- Grupo de chaves XPENDING [[IDLE min-idle-time] contagem inicial e final [consumidor]]: exibe informações sobre mensagens pendentes
ilustrar:
- Retornar todas as mensagens confirmadas
2.Excluir
- XGROUP [DESTROY key groupname]: Use XGROUP DESTROY para excluir grupos de consumidores
ilustrar:
- Especifique o nome do grupo de consumidores e chave
- XGROUP [DELCONSUMER key groupname consumername]: Exclua o consumidor especificado no grupo de consumidores
ilustrar:
- Para ser testado
3.Atualização
- ID do grupo de chaves XACK [ID…]: Marcar mensagem como "processada"
ilustrar:
- Especifique a chave e o nome do grupo e o ID da fila a ser processada
4. Consulta
- XREAD [COUNT count] [BLOCK milissegundos] STREAMS key [key…] id [id…]: Use XREAD para obter uma lista de mensagens de forma bloqueadora ou não bloqueadora
ilustrar:
- elemento de consulta
- Bloqueando a leitura das últimas notícias
- Consumidor do grupo XREADGROUP GROUP [COUNT count] [BLOCK milissegundos] [NOACK] STREAMS key [key…] ID [ID…]: Ler mensagens no grupo de consumidores
ilustrar:
2.2.11Tipo GEO
2.2.11.1 Visão geral
GEO é a abreviatura de Geolocalização, que representa coordenadas geográficas. O Redis adicionou suporte para GEO na versão 3.2, permitindo armazenar informações de coordenadas geográficas e nos ajudar a recuperar dados com base em longitude e latitude.
2.2.11.2 Comandos comuns
1.Novo
- Chave GEOADD [NX | XX] [CH] longitude latitude membro: Adicione uma informação geoespacial , incluindo: longitude (longitude), latitude (latitude), valor (membro)
ilustrar:
- Explicação dos parâmetros:
GEOADD 键 精度 维度 值
- Chave GEOPOS [membro [membro…]]: Retorna as coordenadas do membro especificado
ilustrar:
- Explicação dos parâmetros:
GEOPOS 键 成员
2.Modificar
- Chave GEODIST member1 member2 [M | KM | FT | MI]: Calcula a distância entre os dois pontos especificados e retorna
ilustrar:
- Explicação dos parâmetros:
GEODIST 键 值1 值2
- Chave GEOSEARCH <FROMMEMBER membro | FROMLONLAT longitude latitude> <BYRADIUS raio <M | KM | FT | MI> | BYBOX largura altura <M | KM | FT | MI>> [ASC | DESC] [contagem de CONTAGEM [ANY]] [WITHCOORD ] [WITHDIST] [WITHHASH]: Pesquise membros dentro do intervalo especificado, classifique-os pela distância do ponto especificado e retorne-os. O intervalo pode ser circular ou retangular. 6.2.Novos recursos
ilustrar:
- Explicação dos parâmetros:
GEODIST 键 指定经纬度 画圆 举例 返回距离
- Chave GEOHASH [membro [membro…]]: Converte as coordenadas do membro especificado em formato de string hash e retorna
ilustrar:
- Explicação dos parâmetros:
GEOHASH 键 成员
3. Cliente Java Redis
Resumo das notas:
- Visão geral: o site oficial do Redis oferece clientes em vários idiomas, endereço: https://redis.io/clients
- Uso básico de Jedis: O próprio Jedis não é seguro para threads e a criação e destruição frequente de conexões causará perdas de desempenho.
- Pool de conexões Jedi: Neste momento, o pool de conexões Jedi é usado em vez do método de conexão direta Jedi para reduzir a criação e destruição frequente de conexões.
- Uso do SpringDataRedis: SpringData é um módulo para operações de dados no Spring, incluindo integração de vários bancos de dados
- Serialização RedisSerializr: o método de serialização personalizado torna os recursos de armazenamento Redis mais economizadores de memória
- Uso de StringRedisTemplate: para economizar espaço de memória, não usaremos o serializador JSON para processar o valor. Em vez disso, usaremos o serializador String uniformemente, o que requer que apenas chaves e valores do tipo String possam ser armazenados. Quando objetos Java precisam ser armazenados, a serialização e desserialização dos objetos são feitas manualmente .
3.1 Visão geral
Clientes em vários idiomas são disponibilizados no site oficial do Redis, endereço: https://redis.io/clients
ilustrar:
Existem muitos usos de cliente excelentes no cliente Java. Recomenda-se aprender Jedis e Lettcuce.
Spring integra operações Jedis e Alphace no cliente Java, chamado Spring Data Redis. Aprenda Spring Data Redis neste momento
3.2 Casos de uso básicos - uso de Jedis
3.2.1 Visão geral
Endereço do site oficial dos Jedis: https://github.com/redis/jedis
3.2.2 Casos de uso básicos
Etapa 1: importar dependências
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.4.1</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
Etapa 2: demonstração
public class JedisTest {
public Jedis jedis;
@Before
public void setUp() {
// 1.建立连接
jedis = new Jedis("10.13.164.55", 6379);
// 2.设置密码
jedis.auth("qweasdzxc");
// 3.选择库
jedis.select(0);
}
@Test
public void testSet() {
String set = jedis.set("yueyue2", "玥玥");
System.out.println(set);
String s = jedis.get("yueyue2");
System.out.println(s);
}
@After
public void setDown() {
if (Objects.isNull(jedis)) {
jedis.close();
}
}
}
ilustrar:
Crie objetos Jedis, teste métodos e feche recursos
3.2.3 Conjunto de conexões Jedis
3.2.3.1 Visão geral
O próprio Jedis não é seguro para threads, e a criação e destruição freqüente de conexões causará perdas de desempenho.Portanto, recomendamos que você use o pool de conexões Jedis em vez da conexão direta Jedis.
3.2.3.2 Casos de uso básicos
Passo 1: Crie uma fábrica
/**
* 获取Jedis连接池工厂
*/
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
// 配置连接池
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接
jedisPoolConfig.setMaxTotal(8);
// 最大空闲连接,当有连接时,最多准备8个连接点
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接,当没有连接时,会释放所有连接点
jedisPoolConfig.setMinIdle(0);
// 设置最长等待时间,ms
jedisPoolConfig.setMaxWait(Duration.ofMillis(200));
// 创建连接此对象
jedisPool = new JedisPool(jedisPoolConfig, "10.13.164.55", 6379, 2000, "qweasdzxc");
}
// 获取Jedis对象
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
Etapa 2: demonstração
public class JedisTest {
public Jedis jedis;
@Before
public void setUp() {
// 1.建立连接
// jedis = new Jedis("10.13.164.55", 6379);
// 2.设置密码
// jedis.auth("qweasdzxc");
jedis = JedisConnectionFactory.getJedis();
// 3.选择库
jedis.select(0);
}
@Test
public void testSet() {
String set = jedis.set("yueyue2", "玥玥");
System.out.println(set);
String s = jedis.get("yueyue2");
System.out.println(s);
}
@After
public void setDown() {
if (Objects.isNull(jedis)) {
jedis.close();
}
}
}
3.3 Casos de uso básicos - uso do SpringDataRedis
3.3.1 Visão geral
SpringData é um módulo de operação de dados no Spring, incluindo a integração de vários bancos de dados. O módulo de integração para Redis é chamado SpringDataRedis. O endereço do site oficial: https://spring.io/projects/spring-data-redis
- Fornece integração de diferentes clientes Redis (Lettuce e Jedis)
- Fornece API unificada RedisTemplate para operar Redis
- Suporte ao modelo de publicação-assinatura do Redis
- Suporta Redis Sentinel e Redis Cluster
- Suporta programação reativa baseada em alface
- Suporta serialização e desserialização de dados com base em JDK, JSON, strings e objetos Spring
- Suporta implementação JDKCollection baseada em Redis
3.3.2 Casos de uso básicos
Descrição: Operações de comando comuns
API tipo de retorno ilustrar redisTemplate.opsForValue () Operações de Valor Manipular dados do tipo String redisTemplate.opsForHash () Operações Hash Manipular dados do tipo Hash redisTemplate.opsForList () ListarOperações Manipular dados do tipo Lista redisTemplate.opsForSet () Definir operações Manipular dados do tipo Set redisTemplate.opsForZSet () ZSetOperações Manipular dados do tipo SortedSet redisTemplate comandos comuns
Etapa 1: importar dependências
<dependencies>
<!--SpringDataRedis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
ilustrar:
Este experimento opera no SpringBoot, então importe as dependências do SpringBoot
Etapa 2: adicionar configuração
spring:
redis:
host: 10.13.164.55
port: 6379
password: qweasdzxc
lettuce: # redis默认使用lettuce客户端进行连接
pool:
max-active: 8 # 最大连接
min-idle: 0 # 最小空闲
max-idle: 8 # 最大空闲
max-wait: 200 # 连接等待时间
ilustrar:
Configure o arquivo de configuração do Redis para facilitar a montagem automática do SpringBoot
Etapa 3: demonstração
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
@Autowired
RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("yueyue", "玥玥大美女");
Object o = redisTemplate.opsForValue().get("yueyue");
System.out.println(o.toString());
}
}
ilustrar:
Necessidade de usar
@Autowired
anotações para implementar injeção de dependência
Perceber:
RedisTemplate pode receber qualquer objeto como valor e gravá-lo no Redis, mas serializará o objeto no formato de byte antes de gravar. O padrão é usar a serialização JDK. O resultado é o seguinte
Isso piorará a legibilidade e ocupará mais memória.
Verifique o código-fonte e descubra que a camada inferior usará o objeto ObjectOutputStream para converter objetos Java em bytes
3.3.3Serialização RedisSerializr
3.3.3.1 Visão geral
Como o método de serialização do SpringDataRedis usa a serialização JDK padrão, que não consegue alcançar a maneira como armazenamos dados e obtemos o que vemos e obtemos, usamos a serialização personalizada aqui.
ilustrar:
Existem muitas maneiras de implementar a serialização personalizada. O método de serialização do SpringDataRedis usa
JdkSerializationRedisSerializer
a serialização por padrão. Recomenda-se usar dois métodos de serialização aqui, um é o método de serialização que converte string em stringStringRedisSerializer
e o outro é o método que converte Json em string e vice-versa.GenericJackson2JsonRedisSerializer
3.3.3.2 Casos de uso básicos
Etapa 1: serialização personalizada
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
// 创建Template
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
// key和 hashKey采用 string序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// value和 hashValue采用 JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
ilustrar:
- Neste ponto, conclua a injeção de dependência do RedisTemplate e reescreva sua própria lógica.
- Connection factory, a estrutura SpringBoot concluirá automaticamente a injeção para nós, portanto, o connection factory é usado diretamente aqui.
Etapa 2: demonstração
@SpringBootTest
class SpringDataRedisDemoApplicationTests {
@Autowired
RedisTemplate<String, Object> redisTemplate;
@Test
void testString() {
redisTemplate.opsForValue().set("yueyue", "玥玥,大美女");
Object o = redisTemplate.opsForValue().get("yueyue");
System.out.println(o.toString());
}
@Test
void testObject() {
redisTemplate.opsForValue().set("yueyue", new User("玥玥", 17, "大美女"));
Object o = redisTemplate.opsForValue().get("yueyue");
System.out.println(o.toString());
}
}
ilustrar:
- Os resultados do método testString são os seguintes
- Os resultados do método testObject são os seguintes
Perceber:
Cada vez que um valor de objeto é armazenado, SpringDataRedis adicionará uma longa sequência de nomes de classes de caminho completos para obter serialização e desserialização automáticas, ocupando muito espaço de memória.
3.3.4StringRedisTemplate uso
3.3.4.1 Visão geral
Para economizar espaço de memória, não usaremos o serializador JSON para processar o valor, mas usaremos o serializador String uniformemente, o que requer que apenas chaves e valores do tipo String possam ser armazenados. Quando objetos Java precisam ser armazenados, a serialização e desserialização dos objetos são feitas manualmente .
ilustrar:
Concluir manualmente a serialização e desserialização de objetos é problemático, mas pode economizar espaço de memória
3.3.4.2 Casos de uso básicos
Etapa 1: importar dependências
<!--SpringDataRedis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.33</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Etapa 2: demonstração
@SpringBootTest
class SpringDataRedisDemoApplicationTests2 {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Test
void testString() {
stringRedisTemplate.opsForValue().set("yueyue", "玥玥,大美女");
Object o = stringRedisTemplate.opsForValue().get("yueyue");
System.out.println(o.toString());
}
@Test
void testObject() {
User user = new User("玥玥", 17, "大美女");
String jsonString = JSON.toJSONString(user); // 此处使用fastJson工具进行对象的序列化与反序列化
stringRedisTemplate.opsForValue().set("yueyue", jsonString);
String result = stringRedisTemplate.opsForValue().get("yueyue");
User resultUser = JSON.parseObject(result, User.class);
System.out.println(resultUser);
}
}
ilustrar:
Os resultados do método testString são os seguintes
Os resultados do método testObject são os seguintes