如何在Redis中设置布尔值?

3
当我在Redis的键中设置布尔值(true)时,该值会被强制转换为字符串("true")。而对于memcached,我得到的是我放入的值。但是在Redis中,似乎所有的值都被字符串化了。我找不到任何关于如何解决这个布尔问题的文档。没有特殊的boolean_set方法或boolean选项。
我正在使用Ruby。
以下是示例设置:
require 'redis'
@redis = Redis.new

在IRB中运行:

irb(main):034:0> bool = true
=> true
irb(main):035:0> bool
=> true
irb(main):036:0> @redis.set("example", bool)
=> "OK"
irb(main):037:0> @redis.get("example")
=> "true"
irb(main):038:0> @redis.get("example") == bool
=> false


1
我不知道 Redis 中是否有布尔类型;你不能直接进行转换吗?https://redis.io/topics/data-types-intro - Dave Newton
是的,但如果有不需要键入转换的方法,那将非常有帮助。我查看了您分享的文档@DaveNewton,它引用了布尔值的位图。 - 208_man
那么使用位图并转换整数?但如果您不优化空间,似乎字符串更合理。 - Dave Newton
@DaveNewton。我猜。在发布之前,我并没有详尽地搜索网络,但我确实花了一段时间四处寻找。如果其他人发现这篇帖子是他们问题的答案,我不会感到惊讶,因为这个问题在30分钟的谷歌搜索中并不容易解释清楚。 - 208_man
Re-shrug。据说,我搜索了“redis数据类型”,在前几个结果中(如果不是第一个的话;我不记得了)就找到了Redis文档。我没有搜索“ruby将字符串转换为布尔值”,因为我已经知道如何做了,但这也可以。 - Dave Newton
是的。我也看了那些文档。它们没有提供解决方案。但下面的Alex G提供了一个解决方案。 - 208_man
1个回答

5
"The Redis String类型是您可以与Redis键相关联的最简单的值类型。 它是Memcached中唯一的数据类型,因此对于新手来说在Redis中使用它也非常自然。" - 不可能以“简单”的方式完成。
但是关于您需要它的原因,您可以创建一些类来编写/读取任何类型的数据。
例如,如何在Rails ActiveRecord Cache中实现
使用下一个Marshal方法的一些简单解释:dumpload
class RedisAnyTypesHandler
  def initialize(redis)
    @redis = redis
  end

  def write(key, value)
    @redis.set(key, serialize(value))
  end

  def read(key)
    deserialize(@redis.get(key))
  end

  private

  def serialize(value)
    Marshal.dump(value)
  end

  def deserialize(value)
    Marshal.load(value)
  end
end

现在您可以使用任何类型的数据进行游戏:
> redis_handler = RedisAnyTypesHandler.new(@redis)
> bool = true
=> true
> redis_handler.write('example', bool)
=> "OK"
> redis_handler.read('example') == bool
=> true

> class Foo
>   attr_accessor :foo
> end
=> nil
> foo = Foo.new
=> #<Foo:0x0000556dc19097f8>
> foo.foo = 2
=> 2
> redis_handler.write('example_2', foo)
=> "OK"
> redis_handler.read('example_2').foo
=> 2

谢谢Alex。多么简单的解决方案啊。为什么不使用.to_json和JSON.parse而是使用marshall dump和load呢?我刚试了一下,它可以工作。 - 208_man
@mike_butak Ruby中最好的一点是能够选择不同的解决问题的方式 :) 正如我在描述中提到的->这只是一个例子(解决此问题的许多不同方法之一) :) - Oleksandr Holubenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接