Aula 04 – Golang para Web – Redis
Aula 04 – Golang para Web – Redis
Voltar para página principal do blog
Todas as aulas desse curso
Aula 03 Aula 05
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Código da aula: Github
Melhore seu NETWORKING
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no GITHUB.
Ah, se puder, clica na estrela nos meus repositórios pra dá uma força ao meu perfil no GITHUB
Redis
O Redis é um armazenamento de estrutura de dados em memória, de código-fonte aberto (licenciado pela BSD) e usado como banco de dados em cache e intermediário de mensagens.
Ele suporta várias estruturas de dados, como Strings, Hashes, Lists, Sets, etc.
O Redis foi feito usando a linguagem de programação ANSI C e usa a estrutura NoSQL para armazenar dados, o que atualmente o torna bem popular.
Gigantes da tecnologia como GitHub, Weibo, Pinterest, Snapchat, Craigslist, Digg, StackOverflow, Flickr, etc. Usam Redis.
Para prosseguir é necessário ter o Redis instalado na sua máquina.
Nesse meu post eu explico como instalar:
https://medium.com/@toticavalcanti/redis-no-windows-10
Uma vez o Redis instalado, inicie o serviço Redis digitando em outro terminal:
redis-server
Agora o serviço do Redis deve tá rodando!
Com o Redis instalado e o seu serviço rodando, podemos agora instalar o pacote que golang usa para se comunicar com o Redis.
No terminal, digite o comando abaixo e tecle enter:
go get github.com/go-redis/redis
Pronto, o pacote deve ter sido instalado!
Lembrando que se você tiver optado por clonar o código a partir da branch dessa aula, a branch add_redis, para instalar as dependências do projeto, que até agora são:
- gorilla mux
- redis
Você tem que rodar os seguintes comandos:
Como eu chamei o app de web_app, então eu executo o comando go mod init seguido do nome do app.
Fica assim:
go mod init web_app
Esse comando vai criar o arquivo go.mod que vai inicializar o diretório atual como a raiz do módulo e nos permitirá gerenciar dependências.
Agora você pode rodar o comando abaixo go mod tidy.
go mod tidy
O comando go mod tidy, fará o download das dependências necessárias em seus arquivos de origem e atualizará o arquivo go.mod com essas dependência.
Voltando ao código.
OBS. MODIFICAÇÃO PÓS-POSTAGEM
A linha que tava assim:
comments, err := client.LRange("comments", 0, 10).Result()
Foi inserido o client.Context()
comments, err := client.LRange(client.Context(), "comments", 0, 10).Result()
Isso evita o seguinte erro:
not enough arguments in call to client.cmdable.LRange
have (string, number, number)
want (context.Context, string, int64, int64)
Seguindo
O que tá em laranja é o que tá sendo modificado:
my_projects/web_app/main.go
package main
import(
"log"
"net/http"
"github.com/gorilla/mux"
"github.com/go-redis/redis"
"html/template"
)
//globals variables
var client *redis.Client
var templates *template.Template
func main(){
client = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
templates = template.Must(template.ParseGlob("templates/*.html"))
r := mux.NewRouter()
r.HandleFunc("/contact", contactHandler).Methods("GET")
r.HandleFunc("/about", aboutHandler).Methods("GET")
r.HandleFunc("/", indexHandler).Methods("GET")
http.Handle("/", r)
log.Fatal(http.ListenAndServe(":8000", nil))
}
//request index page handle
func indexHandler(w http.ResponseWriter, r *http.Request){
comments, err := client.LRange(client.Context(), "comments", 0, 10).Result()
if err != nil{
return
}
templates.ExecuteTemplate(w, "index.html", comments)
}}
//request contact page handle
func contactHandler(w http.ResponseWriter, r *http.Request){
templates.ExecuteTemplate(w, "contact.html", "This is the contact page!")
}
//request about page handle
func aboutHandler(w http.ResponseWriter, r *http.Request){
templates.ExecuteTemplate(w, "about.html", "This is the about page!")
}
Fizemos o importe do pacote de comunicação com o Redis, criamos outra variável global chamada client, que vai receber a instância do cliente Redis, onde nas options tá sendo passado o endereço onde o serviço Redis está sendo servido.
No nosso caso, tá rodando na nossa máquina local, na porta 6379, que é a porta padrão do Redis.
Na linha:
comments, err := client.LRange(client.Context(), “comments”, 0, 10).Result() estamos pegando os 11 últimos comentários.
Veja que esse método retorna dois valores, um contém um array de strings com os comentários, o outro é um objeto de erro ou não, dependendo se a nossa solicitação falhou ou não.
O client.Context() define o tipo de contexto, ele tem informações de expirações de prazos, sinais de cancelamento e outros valores no escopo das requests através dos limites da API e entre processos.
Aqui não estamos tratando o erro ainda, se ocorrer algum erro, simplesmente redirecionaremos para o indexHandler.
Modifique o my_projects/web_app/templates/index.html para adicionar o bind no html.
my_projects/web_app/templates/index.html
<html>
<head>
<title>Comments</title>
</head>
<body>
<h1>Comentários</h1>
{{ range . }}
<div>{{ . }}</div>
{{ end }}
</body>
</html>
Agora vamos rodar nossa aplicação:
go run main.go
Acesse:
localhost:8000/
Veja que não temos nenhum comentário, claro, não criamos nenhum.
Dê um ctrl + c para derrubar o servidor.
Vamos entrar no prompt do Redis, digite no terminal:
redis-cli
O promp vai mudar para:
127.0.0.1:6379>
Crie alguns comentários:
127.0.0.1:6379>lpush comments "oi, tudo bem?"
127.0.0.1:6379>lpush comments "testando 123"
127.0.0.1:6379>lpush comments "testando 456"
127.0.0.1:6379>lpush comments "outro teste"
Agora vamos rodar nossa aplicação:
go run main.go
Acesse:
localhost:8000/
Se tudo correu bem, os comentários criados devem aparecer na index.html!
Por agora é só, nos vemos próxima. 😉
Código da aula: Github
Voltar para página principal do blog
Todas as aulas desse curso
Aula 03 Aula 05
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Link do código fluente no Pinterest
Novamente deixo meus link de afiliados:
Hostinger
Digital Ocean
One.com
Obrigado, até a próxima e bons estudos. 😉
GoWeb – aula 04: Erro: (eu copiei e colei o codigo o main.go)
C:\cursos\go\src\codigofluente\goweb\04>go run main.go
# command-line-arguments
.\main.go:29:35: not enough arguments in call to client.cmdable.LRange
have (string, number, number)
want (context.Context, string, int64, int64)
Tem alguma coisa a ver com versao do Banco de dados REDIS ou do pacote github go-redis ?
Fala José Carlos, o erro tá dizendo que falta um argumento o context.
Realmente não sei o porque disso, dei uma pesquisada, mas não cheguei a nenhuma conclusão do que pode tá ocorrendo, não tem muita coisa relacionada no stackoverflow por exemplo, que possa dá alguma pista.
Tenta copiar o código do meu github, direto na branch dessa aula 04:
https://github.com/toticavalcanti/tutorial_go_para_web/tree/initial_branch/web_app
Realmente não sei o que tá provocando isso, porque aqui não deu nenhum problema.
O que você pode tentar também é pegar o código de uma branch na frente, da aula 05 por exemplo, e vê se muda aluma coisa.
No mais, bons estudos. \o/
Boa tarde!!! td bem??? to fazendo seu curso estava tudo bem até acontecer o mesmo erro citado pelo José Carlos……tentei de tudo e nao consegui achar o erro……
Opa Jose, tudo bem e você?
Tenta baixar meu código do github e rodar:
https://github.com/toticavalcanti/tutorial_go_para_web/tree/add_redis
\o/ 😉
boa tarde professor, eu sigo o passo a passo mas da esse erro
(error) ERR unknown command `Ipush`, with args beginning with: `comments`, `oi tudo bem ?`,
Guilherme, acho que você colocou o comando iniciando com letra maiúscula:
Ipush
Na verdade o comando é:
lpush
\o/