Redis é apenas um cache?


255

Eu tenho lido alguns documentos do Redis e testado o tutorial em http://try.redis-db.com/ . Até agora, não vejo diferença entre as tecnologias Redis e cache, como Velocity ou o Enterprise Library Caching Framework

Você está efetivamente adicionando objetos a um armazenamento de dados na memória usando uma chave exclusiva. Não parece haver nenhuma semântica relacional ...

o que estou perdendo?


3
Do redis.io : O Redis é um repositório de valores-chave avançado e de código aberto. É frequentemente chamado de servidor de estrutura de dados, pois as chaves podem conter cadeias, hashes, listas, conjuntos e conjuntos classificados. Dito isto, votei para encerrar sua pergunta, pois ela não se encaixa no formato do StackOverflow.
Linus Thiel

29
Eu concordo que não é tão formato. Onde você acha que seria mais apropriado?
Matt Evans

Respostas:


631

Não, o Redis é muito mais que um cache.

Como um cache, o Redis armazena pares chave = valor. Mas, diferentemente de um cache, o Redis permite operar com os valores. Existem 5 tipos de dados em Redis - seqüências de caracteres, conjuntos, hash, listas e conjuntos classificados. Cada tipo de dados expõe várias operações.

A melhor maneira de entender o Redis é modelar um aplicativo sem pensar em como você o armazenará em um banco de dados.

Digamos que queremos criar o StackOverflow.com. Para simplificar, precisamos de perguntas, respostas, tags e usuários.

Modelando perguntas, usuários e respostas

Cada objeto pode ser modelado como um mapa. Por exemplo, uma pergunta é um mapa com os campos {id, título, data_asquerida, votos, nome_dados, status}. Da mesma forma, uma resposta é um mapa com os campos {id, question_id, answer_text, answer_by, votes, status}. Da mesma forma, podemos modelar um objeto de usuário.

Cada um desses objetos pode ser armazenado diretamente no Redis como um Hash. Para gerar IDs exclusivos, você pode usar o comando de incremento atômico. Algo assim -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Tratamento de votos

Agora, sempre que alguém vota uma pergunta ou resposta, você só precisa fazer isso

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Lista de perguntas para a página inicial

Em seguida, queremos armazenar as perguntas mais recentes a serem exibidas na página inicial. Se você estivesse escrevendo um programa .NET ou Java, armazenaria as perguntas em uma Lista. Acontece que essa é a melhor maneira de armazenar isso também no Redis.

Sempre que alguém faz uma pergunta, adicionamos seu ID à lista.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Agora, quando você deseja renderizar sua página inicial, solicite ao Redis as 25 perguntas mais recentes.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Agora que você possui os IDs, recupere itens do Redis usando pipelining e mostre-os ao usuário.

Perguntas por Tags, Ordenadas por Votos

Em seguida, queremos recuperar as perguntas para cada tag. Mas o SO permite que você veja as perguntas mais votadas, novas ou sem resposta em cada tag.

Para modelar isso, usamos o recurso Conjunto classificado de Redis. Um conjunto classificado permite associar uma pontuação a cada elemento. Você pode recuperar elementos com base em suas pontuações.

Vamos em frente e faça isso pela tag Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

O que fizemos aqui? Adicionamos perguntas a um conjunto classificado e associamos uma pontuação (número de votos) a cada pergunta. Cada vez que uma pergunta é votada, aumentaremos sua pontuação. E quando um usuário clica em "Perguntas marcadas com Redis, classificadas por votos", fazemos apenas um zrevrangee voltamos às principais perguntas.

Perguntas em tempo real sem atualizar a página

E, finalmente, um recurso de bônus. Se você mantiver a página de perguntas aberta, o SO notificará você quando uma nova pergunta for adicionada. Como os Redis podem ajudar aqui?

Redis tem um modelo pub-sub. Você pode criar canais, por exemplo "channel_questions_tagged_redis". Você então subscribeutiliza usuários para um canal específico. Quando uma nova pergunta é adicionada, você envia publishuma mensagem para esse canal. Todos os usuários receberiam a mensagem. Você precisará usar uma tecnologia da Web como soquetes da Web ou cometa para realmente entregar a mensagem ao navegador, mas o Redis ajuda você com todo o encanamento do lado do servidor.

Persistência, confiabilidade etc.

Ao contrário de um cache, o Redis persiste os dados no disco rígido. Você pode ter uma configuração mestre-escravo para fornecer melhor confiabilidade. Para saber mais, consulte os tópicos de persistência e replicação aqui - http://redis.io/documentation


15
Também é um barramento de serviço extremamente simples, usando os comandos relacionados ao PUB / SUB.
Jim Dennis

3
Como posso recuperar a pergunta pelo usuário? Devo criar uma lista para cada usuário com suas perguntas, como perguntas: user: 1 ou devo usar tags?
Diogo Alves

2
muito útil e detalhes explicação que eu cada visto no SO
Trong Vu

5

Não é apenas um cache.

  • No armazenamento de valores-chave de memória
  • Suporte a vários tipos de dados (cadeias, hashes, listas, conjuntos, conjuntos classificados, bitmaps e hiperloglogs)
  • Ele fornece a capacidade de armazenar dados em cache no armazenamento físico (se necessário).
  • Modelo pub-sub de suporte
  • O cache Redis fornece replicação para alta disponibilidade (mestre / escravo)

4

Redis possui habilidades únicas, como scripts lua ultrarrápidos. Seu tempo de execução é igual a C comandos de execução. Isso também traz atomicidade para a manipulação sofisticada de dados Redis, necessária para o trabalho de muitos objetos avançados, como bloqueios e semáforos.

Há um Redis baseado na grade de dados de memória chamado Redisson, que permite criar facilmente aplicativos distribuídos em Java . Graças à distribuídos Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapobjetos e muitos outros.

Perfeitamente trabalha em nuvem e suporta AWS ElastiCache , AWS ElastiCache Cluster e Azure Redis Cache apoio


1

Na verdade, não há dependência entre a representação de dados relativa (ou qualquer tipo de representação de dados) e a função do banco de dados (cache, persistência permanente, etc.).

Redis é bom para cache, é verdade, mas é muito mais do que apenas um cache. É um banco de dados de alta velocidade e totalmente na memória. Ele persiste os dados no disco. Não é relacional, é armazenamento de valor-chave.

Nós o usamos na produção. A Redis nos ajuda a criar software que lida com milhares de solicitações por segundo e mantém os dados comerciais dos clientes durante todo o ciclo de vida natural.


0

Redis é um cache que melhor se adequa à arquitetura de ambiente distribuído / microsserviço.

É rápido, confiável, fornece atomicidade e consistência e possui diversos tipos de dados, como conjuntos, hashes, lista etc.

Estou usando-o desde o ano passado e ele realmente é um salvador quando você precisa fornecer uma solução pronta para produção muito rapidamente e para quaisquer problemas relacionados ao desempenho, pois você sempre pode usá-lo para armazenar dados em cache.


0

Além de ser um servidor de cache, o Redis é especificamente um servidor de estrutura de dados. Ser um cache na forma de um servidor de estrutura de dados significa muito, porque as estruturas de dados são fundamentos de programas ou aplicativos . Considere que você está usando bancos de dados SQL como tecnologia de armazenamento e precisa construir uma lista, um mapa de hash, um conjunto de classificações ou coisas assim, é uma dor no pescoço. O Redis pode fornecer essas funcionalidades diretamente de uma maneira muito simples, simplificando muito o desenvolvimento.

Por outro lado, um servidor de estrutura de dados não precisa estar na forma de um cache. Existem projetos compatíveis com o Redis, mas possuem mecanismos de armazenamento persistente.


0

O Redis suporta estruturas de dados como strings, hashes, listas, conjuntos, conjuntos classificados com consultas de intervalo, bitmaps, hiperloglogs, índices geoespaciais com consultas e fluxos de raio. O Redis possui replicação integrada, scripts Lua, despejo de LRU, transações e diferentes níveis de persistência em disco e fornece alta disponibilidade via Redis Sentinel e particionamento automático com Redis Cluster.

implementação com python

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.