Skip to content

Instantly share code, notes, and snippets.

@otobrglez
Created May 21, 2025 08:41
Show Gist options
  • Save otobrglez/7931c7fe360cbea86dcd2c8f7bc8936c to your computer and use it in GitHub Desktop.
Save otobrglez/7931c7fe360cbea86dcd2c8f7bc8936c to your computer and use it in GitHub Desktop.
Tiny Redis (Jedis) client wrapper for ZIO with Scala 3.
// 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