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

Go para Web - Redis

Go para Web – Redis

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

 

About The Author
-

6 Comentários

  • JOSE CARLOS
    Reply

    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 ?

    • toticavalcanti
      Reply

      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/

  • Jose dos reis
    Reply

    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……

  • Guilherme
    Reply

    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 ?`,

    • toticavalcanti
      Reply

      Guilherme, acho que você colocou o comando iniciando com letra maiúscula:
      Ipush
      Na verdade o comando é:
      lpush
      \o/

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>