知识点:Django框架、redis数据库

1、业务需求分析

当登录用户在浏览商品的详情页时,我们可以把详情页这件商品信息存储起来,作为该登录用户的浏览记录;用户未登录,我们不记录其商品的浏览记录。

2、浏览记录数据存储

存储内容:
虽然浏览记录界面山要展示商品的一些SKU信息,但是我们在存储的时候没有必要存很多的SKU的信息,我们选择存储SKU信息的唯一编号(sku_id)来表示该件商品的浏览记录。

存储位置:
用户浏览记录是临时的数据,且经常变化,数据量不大,所以我们选择内存型数据库redis进行存储。

# settings.py

# cache
CACHES = {
	"history": {  # history
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/4",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    },
}

3、存储类型说明

用户的浏览记录和用户的浏览商品详情的顺序相关,所以我们选择使用Redis中的 list 类型存储 sku_id ;
每个用户只需维护一条浏览记录,浏览记录都是相互独立存储的,不能共用,所以我们需要对用户的浏览记录进行唯一的标识,我们可以使用登录用户的id来唯一标识该用户的浏览记录。

存储类型:
‘history_user_id’ : [sku_id_1, sku_id_2, …]

4、存储逻辑说明

  1. sku信息不能重复;
  2. 最近一次浏览的商品SKU信息排在最前面,以此类推;
  3. 每个用户的浏览记录最多存储五个商品SKU信息;
  4. 存储逻辑:去重,存储,截取

5、存储逻辑中涉及到的redis知识点

LPUSH key value1 [value2]
将一个或多个值插入到列表头部,如果key不存在,一个空列表会被创建并执行LPUSH操作。

LRANGE key start stop
返回列表中指定区间内的元素,区间以偏移量start和stop指定,包含start和stop。其中0表示列表的第一个元素,1表示列表的第二个元素,以此类推。

LREM key count value
根据参数count的值,移除列表中与参数value相等的元素,返回被移除元素的数量,列表不存在时,返回0。
count=0,移除列表中所有和value相等的值
count>0,从表头开始向表尾搜索,移除与value相等的元素,数量为count
count<0,从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值

LTRIM key start stop
对一个列表进行修剪, 让列表只保留指定区间内的元素,不在指定区间内的元素都将被删除。其中0表示列表的第一个元素,1表示列表的第二个元素,以此类推。

6、后端业务逻辑实现

在前端,登录用户点击一个商品的时候会向我们的后端发起一个携带sku_id的ajax请求给我们的后端服务器,所以我们后端服务器收到后可以这么去实现逻辑

# 1.提取参数
data_json = request.body.decode()
data_dict: dict = json.loads(data_json)
sku_id = data_dict.get("sku_id")
# 2.校验参数
try:
	SKU.objects.get(id=sku_id)
except SKU.DoesNotExist:
	return JsonResponse({"code": RETCODE.PARAMERR, "errmsg": "商品不存在"})
# 3.处理逻辑
# 把 sku_id 保存在 redis 中, 先去重, 再存储, 再裁减
conn: Redis = get_redis_connection("history")
user_id = request.user.id
# 去重
conn.lrem("history_%s" % user_id, 0, sku_id)
# 存储
conn.lpush("history_%s" % user_id, sku_id)
# 裁减
conn.ltrim("history_%s" % user_id, 0, 5)

# 4.返回响应
return JsonResponse({"code": RETCODE.OK, "errmsg": "OK"})

这样我们就在我们的redis数据库中保存了一个用户的浏览记录了。

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐