Skip to content

Commit cb733fa

Browse files
authored
Merge pull request #384 from neslinesli93/feature/remove_keys_from_realtime_stats
Replace KEYS with a cursored call to SCAN for realtime stats
2 parents ff63710 + c1dd6ef commit cb733fa

File tree

1 file changed

+22
-5
lines changed

1 file changed

+22
-5
lines changed

lib/exq/redis/job_stat.ex

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,10 @@ defmodule Exq.Redis.JobStat do
118118
end
119119

120120
def realtime_stats(redis, namespace) do
121-
{:ok, [failure_keys, success_keys]} =
122-
Connection.qp(redis, [
123-
["KEYS", JobQueue.full_key(namespace, "stat:failed_rt:*")],
124-
["KEYS", JobQueue.full_key(namespace, "stat:processed_rt:*")]
125-
])
121+
failure_keys = realtime_stats_scanner(redis, JobQueue.full_key(namespace, "stat:failed_rt:*"))
122+
123+
success_keys =
124+
realtime_stats_scanner(redis, JobQueue.full_key(namespace, "stat:processed_rt:*"))
126125

127126
formatter = realtime_stats_formatter(redis, namespace)
128127
failures = formatter.(failure_keys, "stat:failed_rt:")
@@ -131,6 +130,24 @@ defmodule Exq.Redis.JobStat do
131130
{:ok, failures, successes}
132131
end
133132

133+
defp realtime_stats_scanner(redis, namespace) do
134+
{:ok, [[cursor, result]]} =
135+
Connection.qp(redis, [["SCAN", 0, "MATCH", namespace, "COUNT", 1_000]])
136+
137+
realtime_stats_scan_keys(redis, namespace, cursor, result)
138+
end
139+
140+
defp realtime_stats_scan_keys(_redis, _namespace, "0", accumulator) do
141+
accumulator
142+
end
143+
144+
defp realtime_stats_scan_keys(redis, namespace, cursor, accumulator) do
145+
{:ok, [[new_cursor, result]]} =
146+
Connection.qp(redis, [["SCAN", cursor, "MATCH", namespace, "COUNT", 1_000]])
147+
148+
realtime_stats_scan_keys(redis, namespace, new_cursor, accumulator ++ result)
149+
end
150+
134151
defp realtime_stats_formatter(redis, namespace) do
135152
fn keys, ns ->
136153
if Enum.empty?(keys) do

0 commit comments

Comments
 (0)