Rumah  >  Artikel  >  pangkalan data  >  Kaedah pelaksanaan mekanisme pengehad arus teragih Redis

Kaedah pelaksanaan mekanisme pengehad arus teragih Redis

WBOY
WBOYasal
2023-05-11 08:49:351333semak imbas

Dengan pembangunan aplikasi Internet, akses serentak yang tinggi telah menjadi isu yang sangat penting bagi syarikat Internet. Untuk memastikan kestabilan sistem, kami perlu mengehadkan akses untuk mengelakkan serangan berniat jahat atau akses berlebihan daripada menyebabkan ranap sistem. Mekanisme pengehad semasa digunakan secara meluas dalam aplikasi Internet Redis, sebagai pangkalan data cache yang popular, juga menyediakan penyelesaian pengehadan semasa.

Mekanisme pengehad semasa Redis terutamanya mempunyai dua kaedah pelaksanaan berikut:

1 Pengehadan semasa berdasarkan algoritma baldi token

Algoritma baldi token adalah yang biasa digunakan. kaedah mengehadkan di Internet Salah satu algoritma penstriman, Redis menyediakan penyelesaian mengehadkan semasa berdasarkan algoritma baldi token. Pelaksanaan penyelesaian ini terutamanya berdasarkan set pesanan Redis (zset) dan skrip Lua.

Prinsip algoritma baldi token ialah baldi berkapasiti tetap, di mana token diletakkan pada kadar tertentu Setiap permintaan perlu mendapatkan token daripada baldi sebelum ia boleh diproses. Jika tiada token dalam baldi, permintaan ditolak.

Dalam Redis, kita boleh menggunakan set tertib (zset) untuk membina baldi token. Setiap elemen dalam set tersusun mewakili token, skornya mewakili masa ketibaan token dan nilainya boleh menjadi sebarang nilai. Skrip Lua digunakan untuk melaksanakan operasi mendapatkan token. Kod pelaksanaan khusus adalah seperti berikut:

-- 获取令牌
local function acquire_token(key, rate, capacity, now)
  local current_capacity = redis.call("zcount", key, "-inf", "+inf")
  local delta_time = 1000 / rate
  local expected_token = math.floor((now - delta_time * capacity) / delta_time)
  local available_token = math.min(expected_token - current_capacity, capacity)
  if available_token > 0 then
    local members = {}
    for i = 1, available_token do
      members[i] = now
    end
    redis.call("zadd", key, unpack(members))
  end

  local current_time = now
  local stop_time = current_time + 1000
  local expire_time = stop_time - delta_time * (available_token - 1)
  local result = redis.call("zrangebyscore", key, "-inf", expire_time)
  if #result > 0 then
    redis.call("zrem", key, unpack(result))
    return 1
  end

  return 0
end

-- 调用获取令牌操作
local result = acquire_token(KEYS[1], ARGV[1], ARGV[2], ARGV[3])
return result

Antaranya, KEYS[1] mewakili Kunci pengehad semasa, ARGV[1] mewakili kadar di mana token dimasukkan, ARGV[2] mewakili baldi kapasiti, dan ARGV[3] mewakili masa semasa.

2. Pengehadan semasa berdasarkan algoritma corong

Algoritma corong juga merupakan algoritma pengehad semasa yang biasa digunakan ialah Permintaan mengalir ke dalam corong penuh, ia akan melimpah. Dalam Redis, kita juga boleh menggunakan set tertib (zset) dan skrip Lua untuk melaksanakan algoritma corong.

Algoritma corong perlu mengekalkan objek corong, merekodkan masa permintaan terakhir dan kapasiti baldi semasa. Apabila permintaan baharu datang, algoritma akan mengira peningkatan kapasiti corong berdasarkan perbezaan antara masa semasa dan masa permintaan terakhir. Jika kapasiti kurang daripada kapasiti maksimum baldi, permintaan dibenarkan untuk lulus dan kapasiti dikurangkan jika tidak, permintaan ditolak.

Kod pelaksanaan khusus adalah seperti berikut:

-- 获取令牌
local function acquire_token(key, rate, capacity, now)
  local current_capacity = redis.call("hget", key, "capacity")
  local last_time = redis.call("hget", key, "last_time")

  if current_capacity == redis.error_reply or current_capacity == ngx.null then
    current_capacity = capacity
    redis.call("hset", key, "capacity", current_capacity)
  else
    current_capacity = tonumber(current_capacity)
  end

  if last_time == redis.error_reply or last_time == ngx.null then
    last_time = now
    redis.call("hset", key, "last_time", last_time)
  else
    last_time = tonumber(last_time)
  end

  local delta_time = now - last_time
  local expected_capacity = delta_time * rate / 1000 + current_capacity
  local actual_capacity = math.min(expected_capacity, capacity)

  if actual_capacity >= 1 then
    redis.call("hset", key, "capacity", actual_capacity - 1)
    redis.call("hset", key, "last_time", now)
    return 1
  end

  return 0
end

-- 调用获取令牌操作
local result = acquire_token(KEYS[1], ARGV[1], ARGV[2], ARGV[3])
return result

Antaranya, KEYS[1] mewakili Kunci pengehad semasa, ARGV[1] mewakili kadar penambahan air corong, ARGV[2 ] mewakili kapasiti corong, dan ARGV [3] mewakili masa semasa.

Ringkasan

Mekanisme pengehad arus teragih yang disediakan oleh Redis boleh mengawal akses serentak dengan berkesan dan memastikan kestabilan sistem. Kita boleh memilih algoritma baldi token atau algoritma corong sebagai algoritma pengehad semasa mengikut keperluan perniagaan, dan melaksanakannya melalui set pesanan Redis (zset) dan skrip Lua. Perlu diingat bahawa apabila menggunakan mekanisme pengehadan semasa, parameter algoritma harus dikonfigurasikan secara munasabah berdasarkan senario perniagaan tertentu dan ciri trafik untuk mengelakkan kesan negatif terhadap pengalaman pengguna.

Atas ialah kandungan terperinci Kaedah pelaksanaan mekanisme pengehad arus teragih Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn