当前位置:首页 > 问答 > 正文

用Ruby写客户端怎么连Redis缓存,redis的ruby那点事儿

主要基于redis-rb客户端的官方文档和使用经验)

要说起用Ruby来捣鼓Redis,这事儿其实挺简单的,没那么复杂,咱们就把它当成跟一个特别健谈的朋友聊天,只不过这个朋友只听得懂特定的几种指令,这个朋友就是Redis服务器,而我们用来跟它聊天的工具,就是一个叫redis-rb的Ruby库,这是最主流、最常用的Ruby Redis客户端,基本上大家说到用Ruby连Redis,指的就是它。

第一步,咱们得先把这个聊天工具请进门,在你的Gemfile里加上这么一句:

gem 'redis'

然后运行 bundle install,或者在命令行里直接 gem install redis,这就好比给你的Ruby装备上了专门和Redis对话的“翻译器”。

装好了之后,接下来就是建立连接了,想象一下,你要去朋友家串门,你得知道他住哪儿(主机地址),走哪个门(端口号),有时候可能还需要敲门暗号(密码),在Ruby里,连接Redis的代码通常是这样的:

require 'redis'
# 最简单的情况,Redis就在本机,用默认端口6379,而且没设密码
redis = Redis.new
# 如果朋友家比较远,或者规矩多,你就得说清楚
redis = Redis.new(host: "10.0.1.1", port: 6380, password: "your_secure_password", db: 15)

这里的 host 就是Redis服务器的IP地址或者域名,port 是端口(默认6379),password 是密码(如果Redis设置了requirepass的话),db 是选择哪个数据库,Redis默认有16个数据库(编号0-15),不指定的话默认用0号数据库,这一步执行成功,你就有了一个redis客户端对象,接下来所有对话都通过它来进行。

连接上了,就可以开始“聊天”了,Redis的命令在redis-rb里都变成了同名的方法,非常直观,咱们来看几个最常用的操作。

存东西和取东西,这是最基本的,Redis是键值对存储,就像一个大哈希表。

# 设置一个键值对,key是"mykey",value是"hello redis"
redis.set("mykey", "hello redis")
# 根据key把value取出来
value = redis.get("mykey")
puts value # 会输出 "hello redis"
# 如果key不存在,get会返回nil
nothing = redis.get("nonexistent_key")
puts nothing.inspect # 输出 nil

处理数字,有时候我们想存个数字,并且能对它进行增减操作。

# 设置一个计数器
redis.set("counter", 0)
# 给计数器加1
redis.incr("counter")
# 给计数器加5
redis.incrby("counter", 5)
# 减1
redis.decr("counter")
current_count = redis.get("counter").to_i # 注意:get返回的是字符串,需要转换成整数

设置过期时间,很多时候我们缓存的数据不是永久有效的,比如验证码5分钟后就该失效,Redis可以很方便地给key设置一个存活时间。

# 设置键值对,同时指定10秒后过期
redis.setex("short_lived_data", 10, "这份数据10秒后就会消失")
# 或者给一个已经存在的key设置过期时间(单位是秒)
redis.expire("mykey", 3600) # 一小时后过期
# 查看一个key还剩多少秒过期
ttl = redis.ttl("mykey")

处理列表(List),Redis的列表就像是一个双向链表,我们可以从左边或者右边塞东西进去,也能从两边取东西。

# 从左边插入一个元素到列表 "mylist"
redis.lpush("mylist", "world")
redis.lpush("mylist", "hello")
# 从右边插入
redis.rpush("mylist", "!")
# 获取列表的一段内容,0到-1表示获取全部元素
list_contents = redis.lrange("mylist", 0, -1)
puts list_contents.inspect # 输出 ["hello", "world", "!"]
# 从左边弹出一个元素
first_element = redis.lpop("mylist")

处理集合(Set),集合的特点是里面的元素不能重复,无序。

# 往集合 "tags" 里添加元素
redis.sadd("tags", "ruby")
redis.sadd("tags", "redis")
redis.sadd("tags", "programming")
redis.sadd("tags", "ruby") # 这个操作是无效的,因为"ruby"已经存在了
# 获取集合的所有成员
all_tags = redis.smembers("tags") # 返回一个数组,内容可能是 ["programming", "redis", "ruby"],顺序不确定
# 判断某个元素是否在集合中
is_member = redis.sismember("tags", "java") # 返回 false

处理哈希(Hash),哈希适合存储对象,比如一个用户的多个字段。

# 设置哈希表 "user:1000" 的多个字段
redis.hset("user:1000", "name", "Alice")
redis.hset("user:1000", "age", 30)
redis.hset("user:1000", "email", "alice@example.com")
# 也可以一次设置多个字段
redis.hmset("user:1001", "name", "Bob", "age", 25)
# 获取哈希表的所有字段和值
user_data = redis.hgetall("user:1000") # 返回一个哈希,如 {"name"=>"Alice", "age"=>"30", "email"=>"alice@example.com"}
# 只获取特定的字段
name_and_age = redis.hmget("user:1000", "name", "age")

管道(Pipeline),这是个很有用的功能,想象一下,如果你要问朋友一连串问题,你是问一个等一个答案快,还是一股脑把问题全问完,然后他再一口气回答你快?肯定是后者,网络通信有延迟,管道就是把多个命令打包一次性发送给Redis服务器,服务器处理完后再一次性返回所有结果,能显著提升性能。

# 开启一个管道
results = redis.pipelined do
  redis.set "foo", "bar"
  redis.incr "counter"
  redis.get "foo"
end
puts results.inspect # 结果是一个数组,按顺序包含了每个命令的返回值。

发布订阅(Pub/Sub),这是一种消息模式,好比一群人在一个房间里,一个人发布(publish)一条消息,所有订阅(subscribe)了这个房间的人都能听到。

# 在一个终端或线程里,创建一个订阅者,监听 "news" 频道
Thread.new do
  redis = Redis.new
  redis.subscribe("news") do |on|
    on.message do |channel, message|
      puts "在频道 #{channel} 收到消息: #{message}"
    end
  end
end
# 在另一个地方,发布一条消息到 "news" 频道
redis.publish("news", "大家好,这是第一条新闻!")

用完别忘了关闭连接,虽然Ruby的垃圾回收最终会帮你做这件事,但显式地关闭是个好习惯。

redis.quit

就是用Ruby的redis-rb客户端连接和操作Redis最基本也是最重要的那些事儿,基本上,Redis原生命令叫什么,在ruby里就用什么方法,参数也基本一致,学起来非常顺滑,剩下的就是多练习,根据你的具体业务场景,把这些基础的积木组合起来用了。

用Ruby写客户端怎么连Redis缓存,redis的ruby那点事儿