Docker/Sanal Makine ile Redis kurulumu ve Java ile Kullanımı Giriş


Docker üzerinden Redis kurulumu

Container'ımızı yaratmak için aşağıdaki komutu çalıştırıyoruz.

docker run -d -p 6379:6379 --name redis-tut redis redis-server --protected-mode no

redis-server --protected-mode no komutu farklı ip'den erişimde izin verilebilmesi için eklendi. protected mode'u kapatmaya alternatif redis.conf dosyasından bağlanacak ip ve portları bind ve port komutlarıyla ekleyebiliriz, gerçek kullanım senaryosunda.

İnternet sağlayıcılarının CGN havuzuna almaları durumu olmasa dış ip'miz ile WAN'dan herkesin erişebilmesi mümkün olurdu, router'dan 6379 portumuzu açtıktan ve güvenlik duvarından izin verdikten sonra. Fakat bunu uzun vadede mümkün kılabilmenin yolu statik ip almaktan geçiyor. Aylık 30₺ gibi bir fiyatı var yazının yazıldığı tarih itibariyle.

Yukarıdaki kullanımda --network'ümüzü host olarakta kullanabilirdik.

Redisin çalıştığını teyit için:

docker exec -it redis-tut sh
redis-cli
ping

çalıştırdığımızda karşılığında "pong" almalıyız. "info" ile de sistemi inceleyebiliriz.

Port bilgimizi ise docker inspect ile görüntüleyebiliriz:

Hyper-V CentOS üzerinden Redis kurulumu

Hyper-V ortamının nasıl kurulacağı ya da CentOS'un kurulumu kısımlarını konunun dışında olduğu için atlıyorum zaten herhangi bir virtualization ya da linux distrosuyla aynı sonuç alınabilir, bazı temel detayları image olarak ekliyorum.

Gelelim Redis kurulumuna:

sudo yum install epel-release
sudo yum update
sudo yum install redis
sudo systemctl start redis
sudo systemctl enable redis

ve Demo amaçlı güvenlik duvarını kapatıyoruz:

sudo systemctl stop firewalld
sudo systemctl disable firewalld
reboot

Manuel başlatılan server:

Çalıştığını teyit için:

redis-cli
ping

Java Lettuce Kütüphanesi üzerinden demo

Bunun için Maven projesi yaratıyoruz. Kendi sürümlerimize göre aşağıdaki koda değişiklikler yapabilirsiniz.

pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>

    <groupId>redis.tutor</groupId>
    <artifactId>tutor</artifactId>
    <version>1</version>

    <dependencies>
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
            <version>6.1.5.RELEASE</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>14</maven.compiler.source>
        <maven.compiler.target>14</maven.compiler.target>
    </properties>


</project>

Main.java

import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.async.RedisStringAsyncCommands;
import io.lettuce.core.api.sync.RedisStringCommands;
import io.lettuce.core.pubsub.RedisPubSubListener;
import io.lettuce.core.pubsub.api.sync.RedisPubSubCommands;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;

public class Main {
    final static CountDownLatch latch = new CountDownLatch(2);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        RedisClient client = RedisClient.create("redis://localhost");

        // sync connection
        StatefulRedisConnection<String, String> connection = client.connect();
        RedisStringCommands<String, String> sync = connection.sync();
        // may be null, if no records exist
        System.out.println(sync.get("a"));

        // async connection
        RedisStringAsyncCommands<String, String> async = connection.async();
        System.out.println(async.get("a").get());

        // pubsub
        RedisPubSubCommands<String, String> pubSubCommands = client.connectPubSub().sync();
        pubSubCommands.getStatefulConnection().addListener(new RedisPubSubListener<String, String>() {
            @Override
            public void message(String s, String s2) {
                System.out.println("message1");
                System.out.println(s + "-" + s2);
                latch.countDown();
            }

            @Override
            public void message(String s, String k1, String s2) {
                System.out.println("message2");
            }

            @Override
            public void subscribed(String s, long l) {
                System.out.println("subscribed");
            }

            @Override
            public void psubscribed(String s, long l) {
                System.out.println("psubscribed");
            }

            @Override
            public void unsubscribed(String s, long l) {
                System.out.println("unsubscribed");
            }

            @Override
            public void punsubscribed(String s, long l) {
                System.out.println("punsubscribed");
            }});

        pubSubCommands.subscribe("channel");


        StatefulRedisConnection<String, String> sender = client.connect();
        sender.sync().publish("channel", "message");

        latch.await();
        pubSubCommands.unsubscribe();
    }
}

Yukaridaki demo proje bizden channel'a mesaj göndermemizi bekliyor. Bunu da Another Redis Desktop Manager üzerinden görelim, cli ile de yapabilirdik ama db'lerin takibi için gerçek kullanımda böyle bir managerin varlığı avantajdır.