1

モバイルフロントエンドの API として Django を使用しています。JSONを送受信するだけです。ホーム フィードのエンドポイントを作成しました。各ユーザーは、フォローしているユーザーに応じて独自のホーム フィードを持っています。ユーザーが写真を投稿すると、その写真はすべてのフォロワーのホーム フィードにプッシュされます。これまでのところ、非常にシンプルで簡単です。

私の同僚の何人かは、ある種のキャッシュ レイヤーを実装する必要があると提案しましたが、問題は、これが静的な通常のサイトだけではないことです。各ビューは、アクセスするユーザーに基づいて動的です。

たとえば、ホーム フィードはプラットフォームに投稿された写真を DESC 時間順 (最近のものから古いものへ) に並べたリストです。

ホーム フィード ビューは非常に基本的なものです。各ユーザーは、写真オブジェクトの主キーを含む Redis の 'homefeed:user_id:%s' リストを持っています。Redis を介して呼び出しを行い、request.user のホームフィード リストを取得してから、そのリストを使用してデータベースにクエリを実行し、次のようにそれらのオブジェクトを探します。

homefeed_pk_list = redis_server.lrange('homefeed:user_id:%s' % request.user.pk, 0, 100)

# Home feed queryset
queryset = Photo.objects.filter(pk__in = homefeed_pk_list)
response_data= []
for photo in queryset:
       # Code to return back JSON data
return HttpResponse(json.dumps(response_data), content_type="application/json")    

ものすごく単純。今私の質問は、この場合のキャッシュのベストプラクティスは何ですか? シリアル化された各写真オブジェクトを個別にキャッシュし、24 時間の有効期限を設定できます。これは、一部の写真オブジェクトが複数のフィード (ユーザー) にあるためです。オブジェクトがキャッシュに存在しない場合は、DB にアクセスします。このアプローチについてどう思いますか? ?

4

1 に答える 1

1

最大のパフォーマンスを得るために、ロシアンドールのキャッシュに似たものを実装できます。その概要は次のようなものです: オブジェクトをキャッシュし、それらのオブジェクトのリストをキャッシュし、そのリストを含む生成されたページをキャッシュします (つまり、完成した結果をキャッシュするだけではなく、までキャッシュします)。

ただし、あなたの例を考えると、次から始めることができます。

import hashlib

from django.core.cache import cache
from django.http import HttpResponse

from whereever import redis_server


def feed(request):
    """
    Returns a JSON response containing Photo data.
    """
    # Get the list of PKs from Redis
    photo_pks = redis_server.lrange(
        'homefeed:user_id:%d' % request.user.pk,
        0,
        100
    )

    # Make a SHA1 hash of the PKs (cache key)
    cach_key = hashlib.sha1(unicode(photo_pks)).hexdigest()

    # Get the existing cache
    content = cache.get(cach_key)

    if content is None:
        # Make a queryset of Photos using the PK list
        queryset = Photo.objects.filter(pk__in=photo_pks)

        # Use .values() to get a list of dicts (the response data)
        content = json.dumps(
            queryset.values('pk', 'url', 'spam', 'eggs')
        )

        # Cache the response string for 24 hours
        cache.set(cach_key, content, 60 * 60 * 24)

    return HttpResponse(content, content_type='application/json')

その結果、応答コンテンツは 24 時間、または Redis の PK リスト (おそらく別の場所に設定され、新しい写真が追加されたときに更新されるなど) が変更されるまでキャッシュされます。これは、キャッシュ キーが のハッシュを使用して作成されるためです。 PK リスト。

于 2014-10-07T01:15:49.880 に答える