私はDjangoアプリケーションを持っています。 1つの要件は、アップロードされた写真が、ウェブサイトがすでに最近見たものであってはならないということです。これを達成するために、アップロード用に提示されたすべての画像のaverage (perceptual) hashを計算し、DBに保存します。後で、新しい画像が置かれているとき、その平均ハッシュは1000の最新の画像と同じものと比較されます。pythonでソートされた赤いセットに要素を追加する方法
ここでは、最新のavgハッシュを、私のPostgreSQL DBの代わりにのソートされた赤いセットに保存することで、この処理を高速化したいと考えています。
私はこれを行う方法を理解しようとしています。最初のステップは、比較するavgハッシュのセットを構築し、セットサイズが1000のままであることを保証し、最新の1000のkay-valueペアを含みます。
コードはどのように見えますか?
import redis
POOL = redis.ConnectionPool(host='127.0.0.1', port=6379, db=0)
def insertValue(photo_hash):
my_server = redis.Redis(connection_pool=POOL)
try:
size = my_server.zcard("my_set")
if size < 1001:
my_server.zadd("my_set", int(time.time() * 1000), photo_hash) #time.time() equals seconds since epoch
else:
#zrem the element with the lowest score, and then ...
my_server.zadd("my_set", int(time.time() * 1000), photo_hash)
except:
my_server.zadd("my_set", int(time.time() * 1000), photo_hash)
まず
は、第二、最低で1つのzrem
要素をどうするか正しいzadd
(私は私が何をしようとしている近似のオンラインPythonの例を見つけることができません)の構文で、ソートされたセットの得点ですか?
お知らせください。
もう一度!実際に私は*私は* redisの独自のドキュメントを見ながら* pythonの実装を推測しようとしていた - 私はredis-pyドキュメントを見ていたはずです。私は 'zrank'、' zscore'、 'zremrangebyrank'、' zremrangebyscore'について読んだことがあります。だから、セットが私のあらかじめ設定された1000のサイズをオーバーフローしている場合、余分なセットメンバを取り除くために、私はセットのカーディナリティ(サイズ)を取得し、 'zremrangebyrank(my_set、1000、size)'を使用しますか? –
はい、それはかなりです。しかし、赤いセットが急に燃えているので、あなたは削除についてあまり心配する必要はありませんが、あなたがコメントの中で言ったことはうまく動作します – e4c5
私はしばらくしてから削除したいと思っています。最近アップロードした写真をアップロードしても、1日か2日後にアップロードしても大丈夫です。リサイクルのコンテンツは、9gag(または私のような)のウェブサイト上での生活の事実です。ヒントをお寄せいただきありがとうございます。私は他のものを赤字に移行することを願っています。 FASTは良いですし、私のウェブサイトを見たことがありますが、それはユーザーのタイムラインです。私はredisがpostgresqlよりもバックエンドとして適していると感じています。しかしもちろん、はるかに深く掘る必要があります。 –