redis实现排行榜
redis排行榜
为什么使用Redis实现排行榜?
- Redis作为一款缓存数据库,性能优异,使用Redis可以提升服务存取数据的性能。
- Redis的zset(有序集合)数据结构,天然具备作为排行榜的优势。
怎么使用Redis实现排行榜?
- 使用Redis的zset数据结构,其中key为固定值,value为排行榜名称(唯一id),score为排行分数(排序点击数)。
- 我们记录点击数,每点击一次,点击次数越多在排行榜中所在的排名越高。
- Redis的zset数据结构,使用的是从大到小的排序方式,所以我们使用负数来作为排名分数,每点击一次,排行榜的分数+1。
r.zincrby('my_sortset',1, 3)
myset = r.zrevrange('my_sortset',0,-1,withscores=True)[:num]
course = Course.objects.in_bulk([int(item[0]) for item in myset])
demo
import redis
import json
from .models import Goods
from .ser import GoodsSer
from django.shortcuts import HttpResponse
r = redis.Redis(host='localhost', port=6379)
def click(request):
cid = request.GET.get('cid')
r.zincrby('goods_click', 1, int(cid))
res = {}
res['code'] = 200
res['message'] = '页面访问成功'
return HttpResponse(json.dumps(res, ensure_ascii=False), content_type='application/json')
def get_top_n_users(num):
goods_click = r.zrevrange('goods_click', 0, -1, withscores=True)[:num]
'''
print(goods_click)
》 [(b'3', 4.0), (b'1', 3.0), (b'2', 2.0)]
'''
goods = Goods.objects.in_bulk([int(item[0]) for item in goods_click])
'''
print([int(item[0]) for item in goods_click])
》 [3,1,2]
print(goods)
》 {1: <Goods: 辣条>, 2: <Goods: 酸奶>, 3: <Goods: 雪糕>}
'''
res = []
for item in goods_click:
try:
res.append({int(item[1]): goods[int(item[0])]})
except Exception as e:
print(str(e))
pass
'''
print(item)
》 (b'3', 4.0)
print(item[1])
》 4.0
print(item[0])
》 b'3'
'''
return res
def get_goods_list(request):
get_goods = get_top_n_users(3)
'''
print(get_goods)
》 [{4: <Goods: 雪糕>}, {3: <Goods: 辣条>}, {2: <Goods: 酸奶>}]
'''
res = []
for dic in get_goods:
for k, v in dic.items():
data = GoodsSer(v).data
data['click_number'] = k
res.append(data)
return HttpResponse(json.dumps(res, ensure_ascii=False), content_type="application/json")
效果
[
{"id": 3, "name": "雪糕", "price": 30, "click_number": 4},
{"id": 1, "name": "辣条", "price": 10, "click_number": 3},
{"id": 2, "name": "酸奶", "price": 20, "click_number": 2}
]