Skip to content

Retrieving elements from ordered set that were updated in given time interval #154

@janko

Description

@janko

We use an ordered set for registering heartbeats of devices connected to our backend via websockets. Discovering that Kredis stores scores as float timestamps, I realized I could use ZRANGE to retrieve device IDs that have either recent or stale heartbeat:

heartbeats = Kredis.ordered_set("devices:heartbeats")
heartbeats.zrange("-inf", 1.minute.ago.to_f, byscore: true) # returns device IDs with stale heartbeat
heartbeats.zrange(1.minute.ago.to_f, "+inf", byscore: true) # returns device IDs with recent heartbeat

I recently created a helper method that accepts a time range to make this easier:

def heartbeat_ids(range)
  from = range.begin&.to_f || "-inf"
  to = range.end&.to_f || "+inf"

  heartbeats = Kredis.ordered_set("devices:heartbeats")
  heartbeats.zrange(from, to, byscore: true)
end
heartbeat_ids(...1.minute.ago) # stale heartbeats
heartbeat_ids(1.minute.ago..) # recent heartbeats

I was wondering whether there is interest in adding a similar method to Kredis::OrderedSet, or make #elements accept an optional time range.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions