与Redis和Rails一起玩
#ruby #redis #rails

计算机科学很难,但是让它变得更有趣。在本文中,我想探索技术并与它们一起玩,而不必总是具有结构。

本文就是其中之一。我将分享我的想法和想法,与Redis和Ruby一起玩,就像我说的结构较低,也许是评论或深入潜水一样,但是我写了很多有趣的写作和玩。

按模式redis删除密钥

最近,我遇到了用作缓存的redis实例中删除密钥的问题。目前,我尚未使用Ruby/Redis API。

不幸的是,我必须手动检索所有键并删除它们,因为Redis本身在删除上没有模式匹配。因此,您必须一个一个一个一个一个。

redis-cli 
127.0.0.1:6379> keys myk*
1) "myked"
2) "mykey"
127.0.0.1:6379> del myk* // not working
(integer) 0
127.0.0.1:6379> del mykey
(integer) 1

如果您使用Ruby,Ruby/redis API解决了此问题。您有几种方法:

  1. 使用redis.keys(pattern),由于性能差而灰心地灰心,然后对钥匙列表进行地图并删除它们。
  2. 使用Redis本身不存在的redis.scan_each(match: pattern)。作为我们的先例方法,您可以根据自己的列表进行映射并做任何您想做的事情。
require "redis"

redis = Redis.new(host: 'localhost')

## discouraged because of poor performance
redis.keys("myk*").map do |s|
  p redis.get(s)
end

## Use this instead
redis.scan_each(match: 'myk*') do |name| ## encourage
  p redis.get(name)
end

在Redis中使用交易

如果您使用了数据库,则可能会听说交易。这些用于确保酸原理。

交易确保您运行时,您确实发生了所有的变化或没有发生的所有变化。这样可以确保您在数据库中始终处于一致状态。

您也可以通过多种方式以Redis运行它们:
https://redis.io/docs/manual/transactions/

TOCHANGE
redis.multi do |multi|
  multi.set("key", "value")
  multi.incr("counter")
end # => ["OK", 6]

创建一个简单的排队作业

这对我来说是最有趣的部分。您可能知道Sidekiq是一个异步的工作排队系统。

要运行sidekiq,您需要重新排队才能排队所有工作,然后检索并运行它们。
这不使用Redis的酒吧/子机制。

因此,我用这种机制创建了一个排队系统和异步跑步者。

让我们做!

首先,我仅创建一个Rails应用程序;我将其称为frontkiq!

rails new frontkiq

完成后,我决定做一些简单的事情,创建一个模型。

rails g model User name:string

然后开始乐趣:

我去了lib目录并创建了两个文件。在第一个中,我们将其称为queue_subs.rb。我在两个不同的频道上将订阅者订阅了我的队列。

创建第一个,您创建用户的地方,另一个找到用户。

##lib/queue.rb
require "redis"

redis = Redis.new(host: 'localhost')

redis.subscribe(["create","find"]) do |on|
  on.message do |channel,message| 
    if channel == "create"
      User.create!(name: message)
    end
    if channel == "find"
      p User.find_by(name: message)
    end
     User.create!(name: message)
  end
end

然后您使用:
运行排队系统

rails runner ./queue.rb

现在,如果您弹出IRB控制台,例如,您可以与:
一起玩

rails c
Loading development environment (Rails 7.0.6)
irb(main):001:0> require 'redis'
=> false
irb(main):002:0> redis = Redis.new
=> #<Redis client v4.8.1 for redis://127.0.0.1:6379/0>
irb(main):004:0> redis.publish('create','lucas')
=> 1
irb(main):005:0> redis.publish('find','lucas')
=> 1
irb(main):006:0>

您在轨道跑者终端中有:

"hello word"
"hello word"
#<User id: 6, name: "lucas", created_at: "2023-07-06 16:23:08.066413000 +0000", updated_at: "2023-07-06 16:23:08.066413000 +0000">

当然,这不会替代Sidekiq或任何排队系统。没有重试机制,切勿确保您的工作跑了。但是发现技术和

很有趣

结论

我写这篇文章很有趣。希望您学到了一些东西。除了继续学习和享受编程外,没什么可说的。

请参阅下一篇文章! :D