Created
May 21, 2025 08:41
-
-
Save otobrglez/7931c7fe360cbea86dcd2c8f7bc8936c to your computer and use it in GitHub Desktop.
Tiny Redis (Jedis) client wrapper for ZIO with Scala 3.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Tiny Redis (Jedis) client wrapper for ZIO with Scala 3. | |
// - Oto Brglez - <[email protected]> - May 2025 | |
import redis.clients.jedis.*, redis.clients.jedis.params.* | |
import zio.*, zio.ZIO.* | |
import java.util.List as JavaList | |
import scala.concurrent.duration.*, scala.jdk.CollectionConverters.* | |
final case class Redis private (private val pool: JedisPool): | |
private type Binary = Array[Byte] | |
private type TTL = FiniteDuration | |
private given Conversion[TTL, Long] = _.toSeconds.toInt | |
private given Conversion[JavaList[Binary], List[Binary]] = _.asScala.toList | |
private given Conversion[TTL, SetParams] = new SetParams().nx().ex(_) | |
private given Conversion[TTL, GetExParams] = new GetExParams().ex(_) | |
private def wPool[A](f: Jedis => Task[A]): Task[A] = | |
acquireReleaseWith(attempt(pool.getResource))(r => attempt(r.close()).orElse(unit))(f) | |
private def redis[A](r: => Jedis => A): Task[A] = wPool(redis => attempt(r(redis))) | |
def get(key: Binary): Task[Option[Binary]] = redis(r => Option(r.get(key))) | |
def get(key: String): Task[Option[String]] = redis(r => Option(r.get(key))) | |
def set(key: Binary, value: Binary, params: SetParams): Task[String] = redis(_.set(key, value, params)) | |
def set(key: Binary, value: Binary, ttl: TTL): Task[String] = redis(_.set(key, value, ttl)) | |
def set(key: Binary, value: Binary): Task[String] = redis(_.set(key, value)) | |
def getEx(key: Binary, ttl: TTL): Task[Option[Binary]] = redis(r => Option(r.getEx(key, ttl))) | |
def mGet(keys: Binary*): Task[List[Array[Byte]]] = redis(_.mget(keys*)) | |
def flushDb: Task[String] = redis(_.flushDB()) | |
def flushAll: Task[String] = redis(_.flushAll()) | |
object Redis: | |
def live: TaskLayer[Redis] = ZLayer.scoped: | |
for | |
redisUri <- AppConfig.redisUri | |
poolConfig <- | |
succeed: | |
val poolConfig = new JedisPoolConfig() | |
poolConfig.setMaxTotal(8) | |
poolConfig.setMaxIdle(8) | |
poolConfig | |
pool <- fromAutoCloseable(attemptBlocking(new JedisPool(poolConfig, redisUri))) | |
yield Redis(pool) | |
// Usage example,... | |
def usage = { | |
for | |
redis <- ZIO.service[Redis] | |
_ <- redis.flushAll | |
_ <- redis.set("name".getBytes, "Oto".getBytes) | |
_ <- redis.get("name") | |
yield () | |
}.provide(Redis.live) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment