2016-10-24 22 views
1

Redisを私のアプリケーションのデータストア/キャッシュとして使用しています。私は文字列にそれを酸洗した後、データをRedisインスタンスにプッシュしています。私のデータはPython Classオブジェクトです(つまり、キーと値のペアですが、文字列にピクルされます)。私はPythonでRedis libを使用しています。パターンマッチに基づいて赤いオブジェクトを削除する

データが定期的にプッシュされ、特定のホストのデータがホストのダウンなどによりプッシュされなくなる可能性があります。ホストがダウンするとそのホストからデータを消去できるようにしたい。私は、ホストがダウンしているなど、私のアプリに通知するトリガーを持っています。

しかし、データを消去して特定のものをチェックすることで、Redisのデータを効率的にパージする方法がわかりませんデータ内のキーと値のペア。可能であれば、これを実行したいと思います。これに関する助けが本当にありがとう!

EDIT:

は、これは私がRedisのにデータをプッシュするために使用するものである:

self.redis.zadd("mymsgs", pickle.dumps(msg), int(time.time()+360)) 

メッセージ自体は形式オフです:

{'hostname': 'abc1', 'version': 'foo', 'uptime': 'bar'} 
+0

Redisキーに何らかの形でホスト名を追加できませんか?そうすれば 'hostname-foo *'のようなものを使うことができますか?または、時間をかけてキーを自動削除するタイマーがあれば、勉強することができますか? (私はhttp://redis.io/commands/expireを参照しています)? – BorrajaX

+0

@BorrajaXだからここに事がある。私がRedisに保存しているデータは、ホスト名とその値がkvpとして格納された辞書の節約版です。私はそのようなレディスにとって新しいです。データストアから他の方法で削除する方法はありますか? – pypep278

+0

あなたが 'kvp'と言うとき...それはレディスの鍵ですか? AFAIKでは、値ではなく、キーでのみワイルドカードを使用できます。あなたのキーはどのように見えますか?あなたは例を提供するために質問を編集できますか? – BorrajaX

答えて

1

私が正しく理解している場合、私がお勧めするもの(可能であれば)は、鍵のフォーマットを少し変更することです。一般的なmymsgsをキーとして使用する代わりに、キー自体にホスト名を何らかの形で追加することをお勧めします。たとえば、mysgs_from_HOSTNAMEとすることができます。あなたはすべてメッセージを取得したいときは、キーを取得するために、ワイルドカードを使用することができますので

、あなただけmysgs_from_*に一致するキーの一覧を表示し、それらのキーの値を得ることができます。あなたはHOSTNAMEと呼ばれるホスト名がダウンしていることを知ったときにそのように、あなたはすぐに行うことで、そのすべてのエントリを削除できdelete("mysgs_from_HOSTNAME") `

この例を参照してください:

import redis 
import time 
import pickle 

redis_connection = redis.Redis(host='localhost', port=6379, db=0) 

# This "for" loop is just a simple populator, to put a bunch of key/values in Redis 
for hostname in ['abc1', 'foo2', 'foo3']: 
    msg = {'hostname': hostname, 'version': 'foo', 'uptime': 'bar'} 

    # Step 1, store the data using a key that contains the hostname: 
    redis_key = "messages_from_host_%s" % hostname 
    redis_connection.zadd(redis_key, pickle.dumps(msg), int(time.time() + 360)) 

# Ok... I have some sample data in Redis now... 
# Shall we begin?... 

# Let's say I wanna get all the messages from all the hosts: 
# First, I find all the keys that can contain messages from hosts 
matching_keys = redis_connection.keys("messages_from_host_*") 
print "Got these keys that match what I wanna get: %s" % matching_keys 
# Then I iterate through the keys and get the actual zrange (~value) of each 
print "These are the messages from all those hosts:" 
for matching_key in matching_keys: 
    messages = [pickle.loads(s) for s in redis_connection.zrange(matching_key, 0, -1)] 
    print messages 

# Let's say that now, I discover that host called `foo2` is down, and I want 
# to remove all its information: 
redis_connection.delete("messages_from_host_foo2") 

# All the entries referred to the host `foo2` should be gone: 
print "Now, I shouldn't bee seing information from `foo2`" 
matching_keys = redis_connection.keys("messages_from_host_*") 
for matching_key in matching_keys: 
    messages = [pickle.loads(s) for s in redis_connection.zrange(matching_key, 0, -1)] 
    print messages 

出力:

Got these keys that match what I wanna get: ['messages_from_host_foo2', 'messages_from_host_foo3', 'messages_from_host_abc1'] 
These are the messages from all those hosts: 
[{'uptime': 'bar', 'hostname': 'foo2', 'version': 'foo'}] 
[{'uptime': 'bar', 'hostname': 'foo3', 'version': 'foo'}] 
[{'uptime': 'bar', 'hostname': 'abc1', 'version': 'foo'}] 
Now, I shouldn't bee seing information from `foo2` 
[{'uptime': 'bar', 'hostname': 'foo3', 'version': 'foo'}] 
[{'uptime': 'bar', 'hostname': 'abc1', 'version': 'foo'}] 
+0

ありがとう!これを試して、私がそれを働かせることができる場合、答えとして質問に印を付けるでしょう:) – pypep278

+0

私はそれが助けて欲しいと思っています:) – BorrajaX

+1

ありがとう!それは魅力のように働いた:) – pypep278

関連する問題