Aula 04 - Golang 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

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. ;)