2016-07-12 12 views
1

私は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の例を見つけることができません)の構文で、ソートされたセットの得点ですか?

お知らせください。

答えて

1

はい、zaddは少しトリッキーです。

注:引数の順序は、公式のZADD コマンドとは異なります。後方互換性のために、公式Redis 文書がscore1、name1、score2、name2を期待している間に、このメソッドは引数 にname1、score1、name2、score2の形式を受け入れます。

標準構文を使用する場合は、 StrictRedisクラスの使用を検討してください。 の詳細については、ドキュメントのAPIリファレンスセクションをご覧ください。

あなたはdoess上記のコードは大丈夫であるように思わphoto_hashの値でmy_set名前付きセットにtime,time()*1000という名前の要素を追加している何StrictRedisを使用していませんので。 zrankzscoreの両方の機能があり、名前または値のどちらかで存在を確認できます。これらの操作は非常に高速です。 memcachedを使用するよりもはるかに速く、手前でセット全体をフェッチする必要があります。

同様に要素を削除する場合は、zremrangebyrankまたはzremrangebyscoreのいずれかを使用することができます。つまり、値になるものと名前として選択するもの、そして値として選択するものは、両方ともユニークです。あなたのケースでは、どちらもユニークである可能性があります。

私が見ることができる唯一の改善は、時間の代わりにイメージの主キーを使用することです。 2人の人が同時に画像をアップロードする可能性があるためです。

+0

もう一度!実際に私は*私は* redisの独自のドキュメントを見ながら* pythonの実装を推測しようとしていた - 私はredis-pyドキュメントを見ていたはずです。私は 'zrank'、' zscore'、 'zremrangebyrank'、' zremrangebyscore'について読んだことがあります。だから、セットが私のあらかじめ設定された1000のサイズをオーバーフローしている場合、余分なセットメンバを取り除くために、私はセットのカーディナリティ(サイズ)を取得し、 'zremrangebyrank(my_set、1000、size)'を使用しますか? –

+0

はい、それはかなりです。しかし、赤いセットが急に燃えているので、あなたは削除についてあまり心配する必要はありませんが、あなたがコメントの中で言ったことはうまく動作します – e4c5

+0

私はしばらくしてから削除したいと思っています。最近アップロードした写真をアップロードしても、1日か2日後にアップロードしても大丈夫です。リサイクルのコンテンツは、9gag(または私のような)のウェブサイト上での生活の事実です。ヒントをお寄せいただきありがとうございます。私は他のものを赤字に移行することを願っています。 FASTは良いですし、私のウェブサイトを見たことがありますが、それはユーザーのタイムラインです。私はredisがpostgresqlよりもバックエンドとして適していると感じています。しかしもちろん、はるかに深く掘る必要があります。 –

関連する問題