redis4cats Scala redis.set 不设置任何记录

问题描述 投票:0回答:1

Scala redis4cats 库

redis: RedisCommands[IO, String, String]
  • scala 中的以下代码行不会在 redis 中设置任何记录。

redis.set("a", "x")

  • 虽然通过终端设置时有效

127.0.0.1:6379[2]> set a b  OK

  • 并且从 Scala 检索从终端设置的记录也可以验证 Scala 的 redis 连接设置是否正确。
scala redis scala-cats
1个回答
1
投票

我认为这是由于对

IO

的api的混淆造成的

您的代码,

redis.set("a", "x")
返回类型为
IO[Unit]

的值

IO
类型的值是稍后将执行的计算的plan。它是“引用透明”的,这意味着它与像
1 + 1

这样的值相同

这意味着,例如,这两个程序在语义上是等价的

IO.println("hi") >> IO.println("hi")

val hi = IO.println("hi")
hi >> hi

与使用非IO对比:

println("hi"); println("hi")

val hi = println("hi")
hi; hi

这两个程序等价- println 不是引用透明的。

这就意味着如果不使用

IO
值,就相当于永远不会构造它

也就是说,方法

foo
bar
是等价的

def foo = {
  redis.set("a", "x")
  123
}
def bar = {
  123
}

处理您的案例的最佳方法是确保您构建的

redis.set
程序已合并到来自更高层代码部分的
flatMap
中,例如,

def setA: IO[Unit] = redis.set("a", "x") >> IO.println("'a' has been set")

如果您的代码库的其余部分未使用

IO
,您可以改为使用“
unsafe
”方法之一来立即执行您的
IO
值描述的程序。在这种情况下,名称“不安全”指的是不再保留参照完整性的事实,这意味着您不能将等式推理应用于代码。

// Import the default IORuntime to execute your `IO` program
import cats.effect.unsafe.implicits._
def doStuff: Unit = {
  redis.set("a", "x").unsafeRunSync()
  println("done"
}

def doStuffAsync: Future[Unit] =
  redis.set("a", "x").unsafeToFuture()

我推荐阅读 cats-effect 和 fs2 的一位作者的 “程序作为价值” 系列文章,它更详细地介绍了为什么库以这种方式构建以及使用它可以启用哪些功能。

© www.soinside.com 2019 - 2024. All rights reserved.