優化迴圈 Query DB,如何提前確保 generated token unique

建立一筆訂單時,我們會給予一串 serial number,作為訂單唯一識別。我們會寫出如下的代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# app/models/model_name.rb
class ModelName < ActiveRecord::Base
include Tokenable
end

# app/models/concerns/tokenable.rb
module Tokenable
extend ActiveSupport::Concern

included do
before_create :generate_token
end

protected

def generate_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64(nil, false)
break random_token unless self.class.exists?(token: random_token)
end
end
end

Query 是使用搜尋效益較高的 exists

從數十億垃圾郵件列表中,判斷某邮箱是否為垃圾邮箱

在很多場景上,常需要判斷 A 是否在此集合裡面。

「某 A 郵箱,判斷是否在數十億垃圾郵箱列表中,來達到防止垃圾郵箱的訪問、註冊等等。」

如果我們在查找數據庫之前有做數據緩存,像是 redis 緩存之類的,假設黑客惡意大量訪問、發起大量請求。

不僅會造成緩存掛掉,還有數據庫掛掉

那就是知名的穿庫、緩存穿透問題。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×