黑马Redis6基础篇( 补充Redis7)

文章目录

1.概述

笔记小结:

  1. NoSQL:非关系型数据库,NoSQL数据库提供了一种不同的数据存储和查询模型。
  2. 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
  3. 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.

imagem-20230613195756384

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.

imagem-20230613200143048

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

imagem-20230613200308427

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.

imagem-20230613200445270

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:

imagem-20230613201047986

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

imagem-20230614144857010

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

imagem-20230614144547112

ilustrar:

​ O número de pessoas conectadas ao Redis e o desempenho tornam-se configuráveis

AOF multiparte

imagem-20230614145100809

ilustrar:

​ Leitura e escrita assíncronas não são mais um problema

ACL v2

imagem-20230614145248022

ilustrar:

​Gerenciamento de permissões refinado, você pode configurar senhas para o cluster, etc.

pacote de lista

imagem-20230614145351974

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:

  1. 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...

  2. 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

imagem-20230129233953821

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

imagem-20230129231725581

  • 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

imagem-20230129231946828

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
    
  • imagem-20230614092524120

  • Agora reinicie o servidor

2. Reinicie o servidor

redis-server.exe redis.windows.conf

imagem-20230129232232850

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.confcaminho do contêiner.
  • -v /home/redis/myredis/data:/data: monte o diretório de dados no host no /datacaminho 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

    imagem-20230614100008454

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

imagem-20230614100656361

Etapa 2: instalar

imagem-20230614101750314

ilustrar:

A instalação falhou, você precisa instalar a biblioteca de tempo de execução para executar o Visual C++

Etapa 3: executar

imagem-20230614101716225

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:

imagem-20230614102046529

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

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:

imagem-20230614104350652

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.

imagem-20230614105622039

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:

imagem-20230614110255240

  • 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:

imagem-20230614110142318

  • 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:

imagem-20230614110407699

  • 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:

imagem-20230614112528648

  • 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:

imagem-20230614113616359

A estrutura Hash pode armazenar cada campo do objeto de forma independente, e o CRUD pode ser executado em um único campo:

imagem-20230614113627488

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:

imagem-20230614114103605

  • 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:

imagem-20230614114545412

  • 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:

imagem-20230614114744698

  • A chave com o valor-chave aqui ljtxy:product"1já 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.

imagem-20230614141655219

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

imagem-20230614140916366

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:

imagem-20230614140955947

  • 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

imagem-20230614141129176

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:

imagem-20230614142107995

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:

imagem-20230620151511322

  • novo valor

2.Excluir

  • Membro chave ZREM: exclui um elemento especificado no conjunto classificado

ilustrar:

imagem-20230614150456735

  • 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:

imagem-20230614150601016

  • 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;

imagem-20230614150818837

  • 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:

imagem-20230620090025609

  • 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:

imagem-20230620090231242

  • 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:

imagem-20230620090417398

  • Consultar espaço ocupado
  • chave bitcount: obtém o número de 1 no elemento especificado

ilustrar:

imagem-20230620093424774

  • 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:

imagem-20230620093853725

imagem-20230620093904367

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:

imagem-20230620095344735

  • Adicionar novo elemento

2.Modificar

  • PFMERGE (Fusão Fixa Probabilística) destkey sourcekey [sourcekey...]: mescla vários HyperLogLogs em um HyperLogLog

ilustrar:

imagem-20230620100108902

  • mesclar base

3. Consulta

  • Chave PFCOUNT [chave…]: Retorna a estimativa de cardinalidade para o HyperLogLog fornecido

ilustrar:

imagem-20230620095541770

  • 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.

imagem-20230627165330014

ilustrar:

imagem-20230627165408092

  • Ver resultados

imagem-20230627165603791

  • XGROUP [CREATE key groupname id-or-$]: Criar grupo de consumidores

imagem-20230627185125034

ilustrar:

imagem-20230627190650580

  • 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:

imagem-20230627191606210

  • 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:

imagem-20230627193924082

  • Retornar todas as mensagens confirmadas

2.Excluir

  • XGROUP [DESTROY key groupname]: Use XGROUP DESTROY para excluir grupos de consumidores

ilustrar:

imagem-20230627192640457

  • Especifique o nome do grupo de consumidores e chave
  • XGROUP [DELCONSUMER key groupname consumername]: Exclua o consumidor especificado no grupo de consumidores

ilustrar:

imagem-20230627192006807

  • Para ser testado

3.Atualização

  • ID do grupo de chaves XACK [ID…]: Marcar mensagem como "processada"

ilustrar:

imagem-20230627193418877

  • 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

imagem-20230627165657706

ilustrar:

imagem-20230627165711192

  • elemento de consulta

imagem-20230627165943940

  • Bloqueando a leitura das últimas notícias

imagem-20230627170016887

  • Consumidor do grupo XREADGROUP GROUP [COUNT count] [BLOCK milissegundos] [NOACK] STREAMS key [key…] ID [ID…]: Ler mensagens no grupo de consumidores

imagem-20230627193002881

ilustrar:

imagem-20230627194109893

imagem-20230627194055941

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:

imagem-20230630170417913

  • Explicação dos parâmetros:GEOADD 键 精度 维度 值

imagem-20230630170525512

  • Chave GEOPOS [membro [membro…]]: Retorna as coordenadas do membro especificado

ilustrar:

imagem-20230630171355312

  • 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:

imagem-20230630170623078

  • 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:

imagem-20230630171040201

  • Explicação dos parâmetros:GEODIST 键 指定经纬度 画圆 举例 返回距离
  • Chave GEOHASH [membro [membro…]]: Converte as coordenadas do membro especificado em formato de string hash e retorna

ilustrar:

imagem-20230630171531192

  • Explicação dos parâmetros:GEOHASH 键 成员

3. Cliente Java Redis

Resumo das notas:

  1. Visão geral: o site oficial do Redis oferece clientes em vários idiomas, endereço: https://redis.io/clients
  2. 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.
  3. 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.
  4. Uso do SpringDataRedis: SpringData é um módulo para operações de dados no Spring, incluindo integração de vários bancos de dados
  5. Serialização RedisSerializr: o método de serialização personalizado torna os recursos de armazenamento Redis mais economizadores de memória
  6. 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

imagem-20230620100924688

ilustrar:

  • Existem muitos usos de cliente excelentes no cliente Java. Recomenda-se aprender Jedis e Lettcuce.

    imagem-20230620101013947

  • 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 @Autowiredanotaçõ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

    imagem-20230620124625595

  • 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

    imagem-20230620125025159

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.

imagem-20230620130143399

ilustrar:

Existem muitas maneiras de implementar a serialização personalizada. O método de serialização do SpringDataRedis usa JdkSerializationRedisSerializera 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 string StringRedisSerializere 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

imagem-20230620143616497

  • Os resultados do método testObject são os seguintes

imagem-20230620171002485

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 .

imagem-20230620144911783

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

    imagem-20230620145636869

  • Os resultados do método testObject são os seguintes

    imagem-20230620145810654

Acho que você gosta

Origin blog.csdn.net/D_boj/article/details/131713371
Recomendado
Clasificación