Move stats to sorted set, and return in decreasing order
authorJacob <jobs@jacobcasper.com>
Sun, 7 Sep 2025 18:34:29 +0000 (13:34 -0500)
committerJacob <jobs@jacobcasper.com>
Sun, 7 Sep 2025 18:34:29 +0000 (13:34 -0500)
main.py

diff --git a/main.py b/main.py
index f9cdaa056399b19c5668a05d3a0cbb393cd7bf5e..836ba1ee7da4278e44c8d5a04a94a76c5340c0b8 100644 (file)
--- a/main.py
+++ b/main.py
@@ -3,27 +3,28 @@ import json
 
 from typing import Optional
 
+import redis
 from flask import Flask, Response, request
-from redis import Redis
 
-redis_client = Redis(host="redis", port=6379, decode_responses=True)
+redis_client = redis.Redis(host="redis", port=6379, decode_responses=True)
 
 logging.basicConfig(level=logging.DEBUG)
 app = Flask(__name__)
 
+
 def increment_hits(url: str) -> int:
-    return redis_client.incr(f"hits:{url}")
+    return redis_client.zincrby(f"hits", 1, url)
 
 
 @app.route("/stats/", methods=["GET"])
 def stats():
     increment_hits("stats")
     try:
-        stats = redis_client.scan_iter(match="hits:*")
+        stats = redis_client.zscan_iter("hits")
         if stats is None:
             app.logger.debug("Uninitialized stats object")
             return {}
-        return {"stats": [{stat: redis_client.get(stat)} for stat in stats]}
+        return {"stats": [{stat[0]: stat[1]} for stat in stats][::-1]}
     except redis.exceptions.ConnectionError as e:
         app.logger.exception(e)
         return Response("Internal Server Error", 500)
@@ -59,6 +60,7 @@ def api(subpath: Optional[str] = None):
     hits = increment_hits(subpath)
     return {"hits": hits}
 
+
 @app.route("/test/<int:num_requests>/", methods=["POST"])
 def test(num_requests: int):
     increment_hits("test")