設計瀏覽記錄存儲方案


當登錄用戶在瀏覽商品的詳情頁時,我們就可以把這件商品信息存儲起來,作為登錄用戶的瀏覽記錄。
用戶未登錄,我們不記錄其商品瀏覽記錄。

1. 存儲數據說明

雖然瀏覽記錄界面上要展示商品的一些SKU信息,但是我們在存儲時沒有必要存很多SKU信息。
我們選擇存儲SKU信息的唯一編號(sku_id)來表示該件商品的瀏覽記錄。
存儲數據:sku_id

2. 存儲位置說明

  • 用戶瀏覽記錄是臨時數據,且經常變化,數據量不大,所以我們選擇內存型數據庫進行存儲。
  • 存儲位置:Redis數據庫 3號庫
CACHES = {
    "history": { # 用戶瀏覽記錄
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/3",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
}

3. 存儲類型說明

由於用戶瀏覽記錄跟用戶瀏覽商品詳情的順序有關,所以我們選擇使用Redis中的list類型存儲 sku_id
每個用戶維護一條瀏覽記錄,且瀏覽記錄都是獨立存儲的,不能共用。所以我們需要對用戶的瀏覽記錄進行唯一標識。
我們可以使用登錄用戶的ID來唯一標識該用戶的瀏覽記錄。
存儲類型:'history_user_id' : [sku_id_1, sku_id_2, ...]

4. 存儲邏輯說明

SKU信息不能重復。
最近一次瀏覽的商品SKU信息排在最前面,以此類推。
每個用戶的瀏覽記錄最多存儲五個商品SKU信息。
存儲邏輯:先去重,再存儲,最后截取。

保存用戶瀏覽記錄

class UserBrowseHistory(View):
    """用戶瀏覽記錄"""

    def post(self, request):
        """保存用戶瀏覽記錄"""
        # 接收參數
        json_dict = json.loads(request.body.decode())
        sku_id = json_dict.get('sku_id')

        # 校驗參數:
        try:
            SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            return http.HttpResponseForbidden('sku不存在')

        # 保存用戶瀏覽數據
        redis_conn = get_redis_connection('history')
        pl = redis_conn.pipeline()
        user_id = request.user.id

        # 先去重: 這里給 0 代表去除所有的 sku_id
        pl.lrem('history_%s' % user_id, 0, sku_id)
        # 再存儲
        pl.lpush('history_%s' % user_id, sku_id)
        # 最后截取: 界面有限, 只保留 5 個
        pl.ltrim('history_%s' % user_id, 0, 4)
        # 執行管道
        pl.execute()

        # 響應結果
        return http.JsonResponse({'code': 0, 
                                  'errmsg': 'OK'})

查詢用戶瀏覽記錄

class UserBrowseHistory(View):
    """用戶瀏覽記錄"""

    def get(self, request):
        """獲取用戶瀏覽記錄"""
        # 獲取Redis存儲的sku_id列表信息
        redis_conn = get_redis_connection('history')
        sku_ids = redis_conn.lrange('history_%s' % request.user.id, 0, -1)

        # 根據sku_ids列表數據,查詢出商品sku信息
        skus = []
        for sku_id in sku_ids:
            sku = SKU.objects.get(id=sku_id)
            skus.append({
                'id': sku.id,
                'name': sku.name,
                'default_image_url': sku.default_image_url,
                'price': sku.price
            })

        return http.JsonResponse({'code': 0, 
                                  'errmsg': 'OK', 
                                  'skus': skus})

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM