README.md 5.1 KB
Newer Older
G
github-actions[bot] 已提交
1 2 3
[//]: # (This file was autogenerated using `zio-sbt-website` plugin via `sbt generateReadme` command.)
[//]: # (So please do not edit it manually. Instead, change "docs/index.md" file or sbt setting keys)
[//]: # (e.g. "readmeDocumentation" and "readmeSupport".)
D
Dejan Mijić 已提交
4

G
github-actions[bot] 已提交
5
# ZIO Redis
D
Dejan Mijić 已提交
6

G
github-actions[bot] 已提交
7
[ZIO Redis](https://github.com/zio/zio-redis) is a ZIO native Redis client.
D
Dejan Mijić 已提交
8

G
github-actions[bot] 已提交
9
[![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)
G
github-actions[bot] 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

## Introduction

ZIO Redis is in the experimental phase of development, but its goals are:

- **Type Safety**
- **Performance**
- **Minimum Dependency**
- **ZIO Native**

## Installation

Since the ZIO Redis is in the experimental phase, it is not released yet, but we can use snapshots:

```scala
G
github-actions[bot] 已提交
25
libraryDependencies += "dev.zio" %% "zio-redis" % "<version>"
G
github-actions[bot] 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39
```

## Example

To execute our ZIO Redis effect, we should provide the `RedisExecutor` layer to that effect. To create this layer we
should also provide the following layers:

- **RedisConfig** — Using default one, will connect to the `localhost:6379` Redis instance.
- **BinaryCodec** — In this example, we are going to use the built-in `ProtobufCodec` codec from zio-schema project.

To run this example we should put following dependencies in our `build.sbt` file:

```scala
libraryDependencies ++= Seq(
G
github-actions[bot] 已提交
40
  "dev.zio" %% "zio-redis" % "<version>",
G
github-actions[bot] 已提交
41 42 43
  "dev.zio" %% "zio-schema-protobuf" % "0.3.0"
)
```
44

G
github-actions[bot] 已提交
45 46 47 48 49 50 51
```scala
import zio._
import zio.redis._
import zio.schema.codec._

object ZIORedisExample extends ZIOAppDefault {
  val myApp: ZIO[Redis, RedisError, Unit] = for {
52 53 54 55 56 57 58
    redis <- ZIO.service[Redis]
    _     <- redis.set("myKey", 8L, Some(1.minutes))
    v     <- redis.get("myKey").returning[Long]
    _     <- Console.printLine(s"Value of myKey: $v").orDie
    _     <- redis.hSet("myHash", ("k1", 6), ("k2", 2))
    _     <- redis.rPush("myList", 1, 2, 3, 4)
    _     <- redis.sAdd("mySet", "a", "b", "a", "c")
G
github-actions[bot] 已提交
59 60 61
  } yield ()

  override def run = myApp.provide(
62
    Redis.layer,
G
github-actions[bot] 已提交
63 64 65 66 67 68 69
    RedisExecutor.layer,
    ZLayer.succeed(RedisConfig.Default),
    ZLayer.succeed[BinaryCodec](ProtobufCodec)
  )
}
```

I
ioleo 已提交
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
## Testing

To test you can use the embedded redis instance by adding to your build:

```libraryDependencies := "dev.zio" %% "zio-redis-embedded" % <version>```

Then you can supply `EmbeddedRedis.layer.orDie` as your `RedisConfig` and you're good to go!

```scala
import zio._
import zio.redis._
import zio.schema.{DeriveSchema, Schema}
import zio.schema.codec.{BinaryCodec, ProtobufCodec}
import zio.test._
import zio.test.Assertion._
import java.util.UUID
object EmbeddedRedisSpec extends ZIOSpecDefault {
  final case class Item private (id: UUID, name: String, quantity: Int)
  object Item {
    implicit val itemSchema: Schema[Item] = DeriveSchema.gen[Item]
  }
  def spec = suite("EmbeddedRedis should")(
    test("set and get values") {
      for {
        redis <- ZIO.service[Redis]
        item   = Item(UUID.randomUUID, "foo", 2)
        _     <- redis.set(s"item.${item.id.toString}", item)
        found <- redis.get(s"item.${item.id.toString}").returning[Item]
      } yield assert(found)(isSome(equalTo(item)))
    }
  ).provideShared(
    EmbeddedRedis.layer.orDie,
    RedisExecutor.layer.orDie,
    ZLayer.succeed[BinaryCodec](ProtobufCodec),
    Redis.layer
  ) @@ TestAspect.silentLogging
}
```

G
github-actions[bot] 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
## Resources

- [ZIO Redis](https://www.youtube.com/watch?v=yqFt3b3RBkI) by Dejan Mijic — Redis is one of the most commonly used
  in-memory data structure stores. In this talk, Dejan will introduce ZIO Redis, a purely functional, strongly typed
  client library backed by ZIO, with excellent performance and extensive support for nearly all of Redis' features. He
  will explain the library design using the bottom-up approach - from communication protocol to public APIs. Finally, he
  will wrap the talk by demonstrating the client's usage and discussing its performance characteristics.

## Documentation

Learn more on the [ZIO Redis homepage](https://zio.dev/zio-redis/)!

## Contributing

For the general guidelines, see ZIO [contributor's guide](https://zio.dev/about/contributing).

## Code of Conduct

See the [Code of Conduct](https://zio.dev/about/code-of-conduct)
128 129 130 131 132

## Support

Come chat with us on [![Badge-Discord]][Link-Discord].

G
github-actions[bot] 已提交
133 134
[Badge-Discord]: https://img.shields.io/discord/629491597070827530?logo=discord "chat on discord"
[Link-Discord]: https://discord.gg/2ccFBr4 "Discord"
135

G
github-actions[bot] 已提交
136
## License
137

G
github-actions[bot] 已提交
138
[License](LICENSE)