Skip to content

Commit 631a42a

Browse files
authored
Reorganize internals and layers usage (zio#788)
1 parent a4d455c commit 631a42a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+491
-519
lines changed

README.md

+7-8
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
# ZIO Redis
66

7-
[![Development](https://img.shields.io/badge/Project%20Stage-Development-green.svg)](https://github.com/zio/zio/wiki/Project-Stages) ![CI Badge](https://github.com/zio/zio-redis/workflows/CI/badge.svg) [![Sonatype Releases](https://img.shields.io/nexus/r/https/oss.sonatype.org/dev.zio/zio-redis_2.13.svg?label=Sonatype%20Release)](https://oss.sonatype.org/content/repositories/releases/dev/zio/zio-redis_2.13/) [![Sonatype Snapshots](https://img.shields.io/nexus/s/https/oss.sonatype.org/dev.zio/zio-redis_2.13.svg?label=Sonatype%20Snapshot)](https://oss.sonatype.org/content/repositories/snapshots/dev/zio/zio-redis_2.13/) [![javadoc](https://javadoc.io/badge2/dev.zio/zio-redis-docs_2.13/javadoc.svg)](https://javadoc.io/doc/dev.zio/zio-redis-docs_2.13) [![ZIO Redis](https://img.shields.io/github/stars/zio/zio-redis?style=social)](https://github.com/zio/zio-redis)
7+
[![Development](https://img.shields.io/badge/Project%20Stage-Development-green.svg)](https://github.com/zio/zio/wiki/Project-Stages) ![CI Badge](https://github.com/zio/zio-redis/workflows/CI/badge.svg) [![Sonatype Snapshots](https://img.shields.io/nexus/s/https/oss.sonatype.org/dev.zio/zio-redis_2.13.svg?label=Sonatype%20Snapshot)](https://oss.sonatype.org/content/repositories/snapshots/dev/zio/zio-redis_2.13/) [![ZIO Redis](https://img.shields.io/github/stars/zio/zio-redis?style=social)](https://github.com/zio/zio-redis)
88

99
## Introduction
1010

@@ -17,7 +17,7 @@ instances.
1717
To use ZIO Redis, add the following line to your `build.sbt`:
1818

1919
```scala
20-
libraryDependencies += "dev.zio" %% "zio-redis" % "0.1.0"
20+
libraryDependencies += "dev.zio" %% "zio-redis" % "<version>"
2121
```
2222

2323
## Example
@@ -32,7 +32,7 @@ To run this example we should put following dependencies in our `build.sbt` file
3232

3333
```scala
3434
libraryDependencies ++= Seq(
35-
"dev.zio" %% "zio-redis" % "0.1.0",
35+
"dev.zio" %% "zio-redis" % "<version>",
3636
"dev.zio" %% "zio-schema-protobuf" % "0.4.9"
3737
)
3838
```
@@ -61,8 +61,7 @@ object ZIORedisExample extends ZIOAppDefault {
6161

6262
override def run = myApp.provide(
6363
Redis.layer,
64-
RedisExecutor.layer,
65-
ZLayer.succeed(RedisConfig.Default),
64+
SingleNodeExecutor.local,
6665
ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier)
6766
)
6867
}
@@ -73,7 +72,7 @@ object ZIORedisExample extends ZIOAppDefault {
7372
To test you can use the embedded redis instance by adding to your build:
7473

7574
```scala
76-
libraryDependencies := "dev.zio" %% "zio-redis-embedded" % "0.1.0"
75+
libraryDependencies := "dev.zio" %% "zio-redis-embedded" % "<version>"
7776
```
7877

7978
Then you can supply `EmbeddedRedis.layer.orDie` as your `RedisConfig` and you're good to go!
@@ -108,8 +107,8 @@ object EmbeddedRedisSpec extends ZIOSpecDefault {
108107
} yield assert(found)(isSome(equalTo(item)))
109108
}
110109
).provideShared(
111-
EmbeddedRedis.layer.orDie,
112-
RedisExecutor.layer.orDie,
110+
EmbeddedRedis.layer,
111+
SingleNodeExecutor.layer,
113112
ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier),
114113
Redis.layer
115114
) @@ TestAspect.silentLogging

benchmarks/src/main/scala/zio/redis/benchmarks/BenchmarkRuntime.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import zio.schema.codec.{BinaryCodec, ProtobufCodec}
2525
trait BenchmarkRuntime {
2626
final def execute(query: ZIO[Redis, RedisError, Unit]): Unit =
2727
Unsafe.unsafe { implicit unsafe =>
28-
zio.Runtime.default.unsafe.run(query.provideLayer(BenchmarkRuntime.Layer)).getOrThrowFiberFailure()
28+
Runtime.default.unsafe.run(query.provideLayer(BenchmarkRuntime.Layer)).getOrThrowFiberFailure()
2929
}
3030

3131
final def execute[Client: QueryRunner](query: Client => CIO[Unit]): Unit =
@@ -35,7 +35,7 @@ trait BenchmarkRuntime {
3535
object BenchmarkRuntime {
3636
private final val Layer =
3737
ZLayer.make[Redis](
38-
RedisExecutor.local,
38+
SingleNodeExecutor.local,
3939
ZLayer.succeed[CodecSupplier](new CodecSupplier {
4040
def get[A: Schema]: BinaryCodec[A] = ProtobufCodec.protobufCodec
4141
}),

docs/index.md

+3-4
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,7 @@ object ZIORedisExample extends ZIOAppDefault {
6161

6262
override def run = myApp.provide(
6363
Redis.layer,
64-
RedisExecutor.layer,
65-
ZLayer.succeed(RedisConfig.Default),
64+
SingleNodeExecutor.local,
6665
ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier)
6766
)
6867
}
@@ -108,8 +107,8 @@ object EmbeddedRedisSpec extends ZIOSpecDefault {
108107
} yield assert(found)(isSome(equalTo(item)))
109108
}
110109
).provideShared(
111-
EmbeddedRedis.layer.orDie,
112-
RedisExecutor.layer.orDie,
110+
EmbeddedRedis.layer,
111+
SingleNodeExecutor.layer,
113112
ZLayer.succeed[CodecSupplier](ProtobufCodecSupplier),
114113
Redis.layer
115114
) @@ TestAspect.silentLogging

embedded/src/main/scala/zio/redis/embedded/EmbeddedRedis.scala

+10-9
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,15 @@ object EmbeddedRedis {
3434
findFreePort
3535
}
3636

37-
val layer: ZLayer[Any, Throwable, RedisConfig] = ZLayer.scoped(
38-
for {
39-
port <- findFreePort
40-
redisServer <- ZIO.acquireRelease(ZIO.attemptBlockingIO(new RedisServer(port)))(redisServer =>
41-
ZIO.attemptBlockingIO(redisServer.stop).ignoreLogged
42-
)
43-
_ <- ZIO.attemptBlockingIO(redisServer.start)
44-
} yield RedisConfig("localhost", port)
45-
)
37+
lazy val layer: ZLayer[Any, Throwable, RedisConfig] =
38+
ZLayer.scoped {
39+
for {
40+
port <- findFreePort
41+
redisServer <- ZIO.acquireRelease(ZIO.attemptBlockingIO(new RedisServer(port)))(redisServer =>
42+
ZIO.attemptBlockingIO(redisServer.stop).ignoreLogged
43+
)
44+
_ <- ZIO.attemptBlockingIO(redisServer.start)
45+
} yield RedisConfig("localhost", port)
46+
}
4647

4748
}

embedded/src/test/scala/zio/redis/embedded/EmbeddedRedisSpec.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ object EmbeddedRedisSpec extends ZIOSpecDefault {
4242
} yield assert(found)(isSome(equalTo(item)))
4343
}
4444
).provideShared(
45-
EmbeddedRedis.layer.orDie,
46-
RedisExecutor.layer.orDie,
45+
EmbeddedRedis.layer,
46+
SingleNodeExecutor.layer,
4747
ZLayer.succeed[CodecSupplier](new CodecSupplier {
4848
def get[A: Schema]: BinaryCodec[A] = ProtobufCodec.protobufCodec
4949
}),

example/src/main/scala/example/Main.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import example.config.AppConfig
2121
import sttp.client3.httpclient.zio.HttpClientZioBackend
2222
import zhttp.service.Server
2323
import zio._
24-
import zio.redis.{CodecSupplier, Redis, RedisExecutor}
24+
import zio.redis._
2525
import zio.schema.Schema
2626
import zio.schema.codec.{BinaryCodec, ProtobufCodec}
2727

@@ -33,8 +33,8 @@ object Main extends ZIOAppDefault {
3333
AppConfig.layer,
3434
ContributorsCache.layer,
3535
HttpClientZioBackend.layer(),
36-
RedisExecutor.layer,
3736
Redis.layer,
37+
SingleNodeExecutor.layer,
3838
ZLayer.succeed[CodecSupplier](new CodecSupplier {
3939
def get[A: Schema]: BinaryCodec[A] = ProtobufCodec.protobufCodec
4040
})

redis/src/main/scala/zio/redis/ClusterExecutor.scala

+15-14
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ package zio.redis
1919
import zio._
2020
import zio.redis.ClusterExecutor._
2121
import zio.redis.api.Cluster.AskingCommand
22+
import zio.redis.internal.{RedisConnection, RespCommand, RespCommandArgument, RespValue}
2223
import zio.redis.options.Cluster._
2324

2425
import java.io.IOException
2526

26-
final case class ClusterExecutor(
27-
clusterConnectionRef: Ref.Synchronized[ClusterConnection],
27+
final class ClusterExecutor private (
28+
clusterConnection: Ref.Synchronized[ClusterConnection],
2829
config: RedisClusterConfig,
2930
scope: Scope.Closeable
3031
) extends RedisExecutor {
@@ -56,26 +57,26 @@ final case class ClusterExecutor(
5657
}
5758

5859
for {
59-
keyOpt <- ZIO.succeed(command.args.collectFirst { case key: RespArgument.Key => key })
60+
keyOpt <- ZIO.succeed(command.args.collectFirst { case key: RespCommandArgument.Key => key })
6061
keySlot = keyOpt.fold(Slot.Default)(key => Slot((key.asCRC16 & (SlotsAmount - 1)).toLong))
6162
result <- executeSafe(keySlot)
6263
} yield result
6364
}
6465

6566
private def executor(slot: Slot): IO[RedisError.IOError, RedisExecutor] =
66-
clusterConnectionRef.get.map(_.executor(slot)).flatMap(ZIO.fromOption(_).orElseFail(CusterKeyExecutorError))
67+
clusterConnection.get.map(_.executor(slot)).flatMap(ZIO.fromOption(_).orElseFail(CusterKeyExecutorError))
6768

6869
// TODO introduce max connection amount
6970
private def executor(address: RedisUri): IO[RedisError.IOError, RedisExecutor] =
70-
clusterConnectionRef.modifyZIO { cc =>
71+
clusterConnection.modifyZIO { cc =>
7172
val executorOpt = cc.executors.get(address).map(es => (es.executor, cc))
7273
val enrichedClusterIO =
7374
scope.extend[Any](connectToNode(address)).map(es => (es.executor, cc.addExecutor(address, es)))
7475
ZIO.fromOption(executorOpt).catchAll(_ => enrichedClusterIO)
7576
}
7677

7778
private def refreshConnect: IO[RedisError, Unit] =
78-
clusterConnectionRef.updateZIO { connection =>
79+
clusterConnection.updateZIO { connection =>
7980
val addresses = connection.partitions.flatMap(_.addresses)
8081
for {
8182
cluster <- scope.extend[Any](initConnectToCluster(addresses))
@@ -110,11 +111,11 @@ object ClusterExecutor {
110111
scope: Scope.Closeable
111112
): ZIO[Scope, RedisError, ClusterExecutor] =
112113
for {
113-
clusterConnection <- initConnectToCluster(config.addresses)
114-
clusterConnectionRef <- Ref.Synchronized.make(clusterConnection)
115-
clusterExec = ClusterExecutor(clusterConnectionRef, config, scope)
116-
_ <- logScopeFinalizer("Cluster executor is closed")
117-
} yield clusterExec
114+
connection <- initConnectToCluster(config.addresses)
115+
ref <- Ref.Synchronized.make(connection)
116+
executor = new ClusterExecutor(ref, config, scope)
117+
_ <- logScopeFinalizer("Cluster executor is closed")
118+
} yield executor
118119

119120
private def initConnectToCluster(addresses: Chunk[RedisUri]): ZIO[Scope, RedisError, ClusterConnection] =
120121
ZIO
@@ -141,15 +142,15 @@ object ClusterExecutor {
141142
private def connectToNode(address: RedisUri) =
142143
for {
143144
closableScope <- Scope.make
144-
connection <- closableScope.extend[Any](RedisConnectionLive.create(RedisConfig(address.host, address.port)))
145+
connection <- closableScope.extend[Any](RedisConnection.create(RedisConfig(address.host, address.port)))
145146
executor <- closableScope.extend[Any](SingleNodeExecutor.create(connection))
146147
layerScope <- ZIO.scope
147148
_ <- layerScope.addFinalizerExit(closableScope.close(_))
148149
} yield ExecutorScope(executor, closableScope)
149150

150151
private def redis(address: RedisUri) = {
151-
val executorLayer = ZLayer.succeed(RedisConfig(address.host, address.port)) >>> RedisExecutor.layer
152-
val codecLayer = ZLayer.succeed[CodecSupplier](CodecSupplier.utf8string)
152+
val executorLayer = ZLayer.succeed(RedisConfig(address.host, address.port)) >>> SingleNodeExecutor.layer
153+
val codecLayer = ZLayer.succeed[CodecSupplier](CodecSupplier.utf8)
153154
val redisLayer = executorLayer ++ codecLayer >>> Redis.layer
154155
for {
155156
closableScope <- Scope.make

redis/src/main/scala/zio/redis/CodecSupplier.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package zio.redis
1818

19-
import zio.redis.codecs.StringUtf8Codec
19+
import zio.redis.internal.Utf8Codec
2020
import zio.schema.Schema
2121
import zio.schema.codec.BinaryCodec
2222

@@ -25,7 +25,7 @@ trait CodecSupplier {
2525
}
2626

2727
object CodecSupplier {
28-
def utf8string: CodecSupplier = new CodecSupplier {
29-
def get[A: Schema]: BinaryCodec[A] = StringUtf8Codec.codec
28+
def utf8: CodecSupplier = new CodecSupplier {
29+
def get[A: Schema]: BinaryCodec[A] = Utf8Codec.codec
3030
}
3131
}

0 commit comments

Comments
 (0)