DEV Community

Cover image for Substituindo o Redis pelo Valkey em projetos PHP/Hyperf
jonas-elias
jonas-elias

Posted on

2

Substituindo o Redis pelo Valkey em projetos PHP/Hyperf

Licença Redis

Recentemente, o Redis estava disponível sob a Licença Pública Geral Affero (AGPL), uma licença de código aberto que exigia que qualquer software modificado usando o Redis também fosse distribuído sob os termos da AGPL. Isso significava que qualquer empresa que construísse um produto sobre o Redis e o modificasse de alguma forma tinha a obrigação de compartilhar essas modificações com a comunidade.

O novo modelo de licenciamento do Redis baseia-se em duas novas licenças: a Redis Source Available License (RSAL) e a Redis Commons Clause. A RSAL permite o acesso ao código-fonte do Redis, mas com restrições sobre sua utilização. Já a Redis Commons Clause, uma adição à RSAL, impõe restrições adicionais, proibindo o uso comercial do software em determinados contextos, a menos que uma licença comercial seja adquirida.

Alternativas

Existem alternativas como Memcached, DynamoDB, entre outros. Todos estes mencionados podem gerar reescrita de código, dependendo do formato no qual o projeto foi escrito. Para evitar os problemas mencionados anteriormente, apresento o Valkey.

O Valkey trata-se basicamente de um fork do Redis, logo, a lógica de implementação continua a mesma. O "pulo do gato" está em relação ao tipo de licença, que permite a comercialização por estar ligada a Copyright (c) 2024-present, Valkey contributors e Copyright (c) 2006-2020, Salvatore Sanfilippo.

Implementação

Mas e agora? Como proceder em meu projeto PHP?

Irei apresentar um exemplo utilizando o framework Hyperf, mas nada impede a implementação também no Laravel, Symfony, ou qualquer outro framework que utiliza conectores Redis.

O docker-compose.yml abaixo realiza o pull da imagem valkey/valkey, possibilitando o uso no container de uma aplicação Hyperf:

version: "3"

name: redis-to-valkey

services:
  hyperf-valkey:
    build: ./
    container_name: hyperf-valkey
    ports:
      - 9501:9501
    depends_on:
      - valkey
    restart: always

  valkey:
    container_name: valkey
    image: valkey/valkey
    ports:
      - 6379:6379
Enter fullscreen mode Exit fullscreen mode

O backend hyperf-valkey é construído com base no Dockerfile abaixo (instalando também a extensão interface redis-php:

FROM php:8.2

RUN apt-get update && apt-get install --no-install-recommends -y \
    wget \
    vim \
    git \
    unzip

RUN apt-get update \
    && apt-get install --no-install-recommends -y \
    libzip-dev \
    libcurl4-openssl-dev \
    libssl-dev \
    libpq-dev \
    libjpeg-dev \
    libpng-dev \
    libfreetype6-dev \
    g++ \
    libaio-dev \
    libicu-dev

RUN curl -sS https://getcomposer.org/installer | php -- \
    --install-dir=/usr/local/bin \
    --filename=composer

RUN docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
    && pecl install redis \
    && printf "no\nyes\nno\nyes\n" | pecl install swoole \
    && echo "swoole.use_shortname = Off" >> /usr/local/etc/php/conf.d/swoole.ini \
    && docker-php-ext-install \
    pcntl \
    gd \
    && docker-php-ext-enable \
    redis \
    swoole

EXPOSE 9501
Enter fullscreen mode Exit fullscreen mode

Após isso, acesse o container via bash ou remote containers e crie o projeto:

composer create-project hyperf/hyperf-skeleton
Enter fullscreen mode Exit fullscreen mode

No questionamento Do you want to use Redis Client?, selecione y

Do you want to use Redis Client?

No arquivo .env, altere as chaves REDIS para:

REDIS_HOST=valkey
REDIS_AUTH=(null)
REDIS_PORT=6379
REDIS_DB=0
Enter fullscreen mode Exit fullscreen mode

Com isso, a conexão Valkey com o projeto Hyperf já está concluída. Para utilizar a funcionalidade de cache com o Valkey, vamos acessar a IndexController.php e substituir o conteúdo existente pelo código abaixo:

<?php

declare(strict_types=1);

namespace App\Controller;

use Hyperf\Redis\Redis as Valkey;

class IndexController extends AbstractController
{
    public function __construct(protected Valkey $valkey)
    {
    }

    public function index()
    {
        $content = 'hello valkey!';
        $key = 'cache';
        $this->valkey->set($key, $content);

        return [$this->valkey->get($key)];
    }
}
Enter fullscreen mode Exit fullscreen mode

Inicie a aplicação com php bin/hyperf.php start, acessando posteriormente o endereço http://127.0.0.1:9501, tendo como retorno:

Hello Valkey

Considerações

Para projetos em andamento que já estão utilizando o Redis, basta substituir o host Redis pelo serviço Valkey (via container, como exemplificado). Além disso, projetos Laravel podem seguir a mesma lógica utilizando a biblioteca predis/predis.

O ideal pela questão de nomenclaturas e responsabilidades, seria utilizar/criar pacotes específicos para o Valkey, já que provavelmente receberá modificações específicas ao longo do tempo, distanciando um pouco a equivalência com o projeto Redis. Contudo, a solução apresentada neste artigo é viável.

Referências

Do your career a big favor. Join DEV. (The website you're on right now)

It takes one minute, it's free, and is worth it for your career.

Get started

Community matters

Top comments (2)

Collapse
 
bernert profile image
BernerT

Interessante abordagem! Uma pergunta: você planeja abordar a integração do Valkey em outros frameworks como o Laravel em posts futuros?

Collapse
 
jonas-elias profile image
jonas-elias • Edited

Bom ponto, irei abordar sim!

Cloudinary image

Video API: manage, encode, and optimize for any device, channel or network condition. Deliver branded video experiences in minutes and get deep engagement insights.

Learn more

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay