如何停用Sidekiq Uniqueness

当设置Sidekiqjob的unique_for选项后,若系统崩溃导致锁未释放,可使用MyWorker.set(unique_for:false)来临时禁用唯一性检查,允许新job运行。正常情况下,unique_for限制同一job在设定时间内只能有一个实例运行,而手动停用后,则会为每次调用创建新job。

背景是这样的:

你有一些Sidekiq的job,并且设置了unique_for,然后系统崩溃了,在你的redis里仍然有这个唯一性的锁,但是job却不见了,导致后面的job也进不来,这个时候需要手动disable这个唯一锁。

官网传送:Ent Unique Jobs · mperham/sidekiq Wiki · GitHub

1.先看看unique_for是怎么设置的:

class MyJob
  include Sidekiq::Job
  sidekiq_options unique_for: 10.minutes

  def perform(...)
  end
end

官网解释:

This means that a second job can be pushed to Redis after 10 minutes or after the first job has successfully processed. If your job retries for a while, 10 minutes can pass, thus allowing another copy of the same job to be pushed to Redis. Design your jobs so that uniqueness is considered best effort, not a 100% guarantee A time limit is mandatory so that if a process crashes, any locks it is holding won't last forever.

简单理解就是你设置了10分钟,然后10分钟内只有一个这个job可以跑,不能同时跑两个。

2.关于如何绕过或者停用这个设置,官网是这样说的
If you declare unique_for in the Worker's class-level sidekiq_options but want to push a one-off job that bypasses the uniqueness check, use set to dynamically override the unique_for option:

# disable uniqueness
MyWorker.set(unique_for: false).perform_async(1,2,3)
# set a custom unique time
MyWorker.set(unique_for: 300).perform_async(1,2,3)

3.看看实际案例

正常运行的情况下,可以看到某一时间段内只有一个job

手动停用的情况下,可以看到每次都有一个新的job

 好啦,学会了。

### 确保数据项代码唯一性在数据库设计中的方法 在数据库设计中,确保数据项代码的唯一性是至关重要的。这可以通过多种方式实现,包括使用主键、唯一约束和特定的数据类型等。 #### 1. 使用主键(Primary Key) 主键是表中用于唯一标识每一行记录的一个或一组字段。定义主键后,数据库管理系统会自动确保该字段的值在整个表中是唯一的。如果尝试插入重复的主键值,数据库将抛出错误[^2]。 ```sql CREATE TABLE ExampleTable ( ItemCode VARCHAR(50) PRIMARY KEY, Description TEXT ); ``` #### 2. 使用唯一约束(Unique Constraint) 除了主键外,还可以通过添加唯一约束来确保某个字段或字段组合的值在表中是唯一的。这种方法允许字段不是主键但仍能保持其唯一性。 ```sql CREATE TABLE ExampleTable ( ItemCode VARCHAR(50), Description TEXT, CONSTRAINT UC_ItemCode UNIQUE (ItemCode) ); ``` #### 3. 自动生成唯一标识符 可以使用数据库提供的自动编号功能(如AUTO_INCREMENT或序列)来生成唯一的数据项代码。这种方法特别适用于需要系统自动生成唯一标识符的场景。 ```sql CREATE TABLE ExampleTable ( ItemCode INT AUTO_INCREMENT PRIMARY KEY, Description TEXT ); ``` #### 4. 数据验证与业务规则 在应用程序层面上,可以通过编程逻辑验证数据项代码的唯一性。例如,在插入新记录之前检查是否存在相同的代码。 ```python def check_unique_code(cursor, code): query = "SELECT COUNT(*) FROM ExampleTable WHERE ItemCode = %s" cursor.execute(query, (code,)) result = cursor.fetchone() return result[0] == 0 # Returns True if unique ``` #### 5. 避免索引扫描带来的性能问题 在设计数据库时,应避免对总是通过全表扫描访问的表创建索引,因为这可能会导致不必要的开销[^5]。然而,对于需要频繁查询唯一性的字段,创建索引可以显著提高性能。 ```sql CREATE UNIQUE INDEX idx_itemcode ON ExampleTable(ItemCode); ``` #### 6. 正确选择数据类型 在设计阶段,必须仔细审查建议的数据类型,因为一旦数据流创建完成,这些类型将无法更改[^2]。选择合适的数据类型有助于减少因数据格式不一致而导致的重复问题。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值