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.