系统设计-商品实时数据分页去重问题

在电商中商品的数据展示排序会动态变化,尤其是做瀑布流展示的时候,可能会导致同一件商品出现在某页的尾部,以及下一页的头部。这样导致用户体验很差。

这类问题的解决方案:

1)服务端解决方案:缓存某一个时间点的数据,定时更新缓存。

这样能够解决分页去重问题,但是难以实现千人千面,缓存失效回源处理仍然会遇到这个问题。

如果数据有限的话,可以客户端一次请求整个id列表,客户端再通过id分页去拿数据。

 

2)客户端解决方案:让客户端做去重工作。

即使服务端返回重复的商品,客户端可以控制重复的不展示。这个方案的缺点在于,分页数越大,性能越差。但是实际浏览中,很少人会翻到10页之后。因此,这个方案也是可以使用的。

比如唯品会。

 

3)服务端实现方案:记录每个用户访问过的商品列表,服务接口去重

其实这个方案跟2一样,只是把客户端存的数据放到服务端。这样对服务端的压力比较高

 

补充,针对新闻,资讯之类的feed流,我们可以采用化动为静的策略。首次请求是产生一个标识,比如时间点,之后的分页,均获取这个时间点之前的内容(这个内容的范围是固定的,不会再新增内容了)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了设计一个检索系统,我们需要先确定一些基本的需求,例如搜索的内容、数据源、检索条件、排序方式等。假设我们需要设计一个电影检索系统,该系统可以根据电影的名称、导演、演员、类型等信息进行检索,同时可以根据评分、上映时间等条件进行排序。我们可以按照以下步骤设计和实现这个系统: 1. 数据采集:从电影网站上爬取电影信息,例如电影名称、导演、演员、类型、评分、上映时间等,并将信息存储到数据库中。 2. 数据预处理:对采集到的电影信息进行预处理,例如分词、去重、停用词过滤等,以便后续的检索操作。 3. 建立索引:使用第三方库,例如Whoosh,建立电影信息的索引,以便后续的检索操作。 4. 设计用户界面:使用Python的Web框架,例如Flask,设计用户界面,包括检索框、检索结果展示、分页等。 5. 实现检索算法:根据用户的检索条件,使用第三方库,例如Whoosh,实现电影信息的检索算法,例如全文检索、分词检索、模糊检索等。 6. 实现排序算法:根据用户的排序条件,使用Python的排序函数,例如sorted,对检索结果进行排序。 7. 整合系统功能:将数据预处理、建立索引、检索算法、排序算法等功能整合,实现一个完整的电影检索系统。 下面是一个简单的实现示例: ```python from flask import Flask, request, render_template from whoosh.index import create_in, open_dir from whoosh.fields import * from whoosh.qparser import QueryParser import os app = Flask(__name__) # 数据库配置 DATABASE_URI = 'sqlite:///movies.db' # Whoosh索引配置 INDEX_DIR = 'indexdir' if not os.path.exists(INDEX_DIR): os.mkdir(INDEX_DIR) # 数据模型 class Movie(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(120), unique=True, nullable=False) director = db.Column(db.String(120), nullable=False) actors = db.Column(db.String(120), nullable=False) genre = db.Column(db.String(120), nullable=False) rating = db.Column(db.Float, nullable=False) release_date = db.Column(db.Date, nullable=False) def __repr__(self): return '<Movie %r>' % self.title # Whoosh索引模型 schema = Schema(title=TEXT(stored=True), director=TEXT(stored=True), actors=TEXT(stored=True), genre=TEXT(stored=True), rating=NUMERIC(stored=True), release_date=DATETIME(stored=True)) index = create_in(INDEX_DIR, schema) # 索引写入函数 def write_index(): with index.writer() as writer: movies = Movie.query.all() for movie in movies: writer.add_document(title=movie.title, director=movie.director, actors=movie.actors, genre=movie.genre, rating=movie.rating, release_date=movie.release_date) # 索引查询函数 def search_index(query_str, sort_by='rating'): with index.searcher() as searcher: query = QueryParser("title", schema).parse(query_str) results = searcher.search(query, sortedby=sort_by) return [dict(result.items()) for result in results] # 主页 @app.route('/', methods=['GET']) def index(): return render_template('index.html') # 检索结果页 @app.route('/search', methods=['GET', 'POST']) def search(): query_str = request.args.get('q', '') sort_by = request.args.get('sort_by', 'rating') results = search_index(query_str, sort_by) return render_template('search.html', query_str=query_str, sort_by=sort_by, results=results) if __name__ == '__main__': # 数据库初始化 db.init_app(app) with app.app_context(): db.create_all() write_index() # 启动Web服务器 app.run() ``` 以上代码使用了Flask作为Web框架,使用了SQLAlchemy作为ORM库,使用了Whoosh作为全文检索库。在实现时,需要先定义一个Movie数据模型,然后使用SQLAlchemy将其映射到数据库中。然后使用Whoosh建立电影信息的索引,并使用QueryParser实现电影信息的检索算法。最后使用Flask实现用户界面,并将检索结果展示给用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值