用Ruby写客户端怎么连Redis缓存,redis的ruby那点事儿
- 问答
- 2026-01-02 05:19:31
- 3
主要基于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里就用什么方法,参数也基本一致,学起来非常顺滑,剩下的就是多练习,根据你的具体业务场景,把这些基础的积木组合起来用了。

本文由盈壮于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/72888.html
