新聞中心
紅色魔法:Redis豆瓣推薦系統(tǒng)

10年的寶山網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整寶山建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“寶山網(wǎng)站設(shè)計(jì)”,“寶山網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
Redis是一個(gè)開(kāi)源的高性能key-value數(shù)據(jù)庫(kù),它支持完全的關(guān)鍵字交換協(xié)議,提供數(shù)據(jù)持久化、高可用性、集群化等優(yōu)秀特性。在本文中,我們將介紹如何使用Redis搭建一個(gè)豆瓣推薦系統(tǒng)。
1. 數(shù)據(jù)庫(kù)設(shè)計(jì)
豆瓣推薦系統(tǒng)需要存儲(chǔ)用戶和用戶行為數(shù)據(jù),以及物品和物品特征數(shù)據(jù)。我們可以使用Redis的HASH數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)這些信息,其中鍵是用戶id或物品ID,值是一個(gè)HashMap。
創(chuàng)建用戶行為數(shù)據(jù):
HSET user:1 activity:book 1
HSET user:1 activity:movie 3
HSET user:1 activity:music 5
HSET user:2 activity:book 4
HSET user:2 activity:movie 2
HSET user:2 activity:music 2
...
創(chuàng)建物品特征數(shù)據(jù):
HSET item:1 Tag:action 1
HSET item:1 tag:adventure 1
HSET item:1 tag:sci-fi 1
HSET item:2 tag:drama 1
HSET item:2 tag:romance 1
HSET item:2 tag:classic 1
...
2. 構(gòu)建推薦列表
基于用戶歷史查詢行為和物品特征,我們可以使用Redis的ZSET結(jié)構(gòu)構(gòu)建推薦列表。我們首先需要計(jì)算一個(gè)物品與用戶查詢行為之間的相似度分值,這可以使用協(xié)同過(guò)濾技術(shù)來(lái)完成。在本文中,我們將使用余弦相似度算法。
計(jì)算用戶和物品的相似度:
def cosine_similarity(user, item):
user_tags = [tag for tag, count in redis.hgetall('user:%s' % user).items()]
item_tags = [tag for tag, count in redis.hgetall('item:%s' % item).items()]
common_tags = set(user_tags) & set(item_tags)
numerator = sum([redis.hget('user:%s' % user, tag) * redis.hget('item:%s' % item, tag) for tag in common_tags])
denominator = math.sqrt(sum([pow(redis.hget('user:%s' % user, tag), 2) for tag in user_tags])) * math.sqrt(sum([pow(redis.hget('item:%s' % item, tag), 2) for tag in item_tags]))
if not denominator:
return 0.0
else:
return float(numerator) / denominator
使用相似度分值來(lái)構(gòu)建推薦列表:
def get_recommendations(user_id, num_items = 10):
ZKEY = 'user:%s:recs' % user_id
user_items = redis.hkeys('user:%s' % user_id)
for item_id in redis.keys('item:*'):
if item_id not in user_items:
score = cosine_similarity(user_id, item_id)
if score > 0.0:
redis.zadd(ZKEY, score, item_id)
return redis.zrevrange(ZKEY, 0, num_items-1, withscores=True)
3. 緩存推薦列表
由于計(jì)算相似度分值需要耗費(fèi)時(shí)間,我們可以對(duì)用戶的推薦列表進(jìn)行緩存,以提升性能。我們可以使用Redis的LIST結(jié)構(gòu)緩存推薦列表,當(dāng)用戶的查詢行為發(fā)生變化時(shí),我們可以輕松地更新這個(gè)列表。
def cache_recommendations(user_id, num_items = 10):
LKEY = 'user:%s:recs' % user_id
recommendations = get_recommendations(user_id, num_items)
redis.delete(LKEY)
for item_id, score in recommendations:
redis.lpush(LKEY, item_id)
redis.expire(LKEY, 60*60*24)
4. 基于實(shí)時(shí)查詢更新推薦列表
為了讓用戶獲得最新的推薦,我們可以隨時(shí)檢測(cè)用戶的行為,當(dāng)用戶查詢一個(gè)物品時(shí),我們可以基于用戶的實(shí)時(shí)行為更新推薦列表。
def query_item(user_id, item_id, num_items = 10):
redis.hincrby('user:%s' % user_id, 'activity:%s' % item_id, 1)
cache_recommendations(user_id, num_items)
完整代碼請(qǐng)參見(jiàn)以下鏈接:
https://github.com/linanqiu/redis-recommendations
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開(kāi)通再付費(fèi)。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開(kāi)發(fā)老牌服務(wù)商!微信小程序開(kāi)發(fā),APP開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站營(yíng)銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
網(wǎng)站題目:紅色魔法Redis豆瓣推薦系統(tǒng)(redis豆瓣推薦)
URL網(wǎng)址:http://www.dlmjj.cn/article/djpssih.html


咨詢
建站咨詢
