在线召回Redis Key清单.md
10.8 KB
在线召回Redis Key完整清单
📊 Redis数据统计
- 总Key数量: 211,232 个
- 数据库: Redis DB 3 (port: 6479)
🔑 一、商品相似度索引(I2I Recall)
用于"相似推荐"场景,根据用户点击的商品召回相似商品。
1. C++ Swing算法(高性能版本)
Key模式: item:similar:swing_cpp:{item_id}
数量: 15,310 个
示例:
Key: item:similar:swing_cpp:3562865
Value: "3605981:0.0209644,2526246:0.0209644,2348869:0.0209644"
格式: JSON字符串,similar_id:score 格式
用途:
- 详情页"相似推荐"
- 基于用户点击历史的个性化推荐
- 高性能生产环境推荐
2. Python Swing算法(标准版本)
Key模式: item:similar:swing:{item_id}
数量: 169,409 个
示例:
Key: item:similar:swing:3141390
Value: "3264320:1.2656,3264284:1.2656,3562128:0.4000,..."
格式: JSON字符串,similar_id:score 格式
用途:
- 详情页"看了又看"
- 购物车"相关推荐"
- 需要归一化分数的场景
3. Session W2V算法
Key模式: item:similar:session_w2v:{item_id}
数量: 26,503 个
示例:
Key: item:similar:session_w2v:3402580
Value: "商品序列相似度数据"
用途:
- 基于用户会话序列的推荐
- 捕捉用户的浏览路径
- 补充Swing算法的不足
🎯 二、兴趣聚合索引(Interest Recall)
用于"热门推荐"场景,根据用户兴趣维度召回相关商品。
当前存在的兴趣聚合Key:
1. 平台维度
Key: interest:hot:platform:essaone
Value: [3582462, 3582428, 3582384, ...] # 1000个商品
2. 客户端平台维度
Key: interest:hot:client_platform:pc
Value: [3582462, 3582428, 3582384, ...] # 1000个商品
3. 平台+客户端组合维度
Key: interest:hot:platform_client:essaone_pc
Value: [平台+客户端的组合热门商品]
4. 一级分类维度
Key: interest:hot:category_level1:1
Value: [一级分类的热门商品]
5. 二级分类维度
Key: interest:hot:category_level2:29
Value: [3482467, 2708138, 1008982, ...] # 1000个商品
6. 三级分类维度
Key: interest:hot:category_level3:2040
Value: [三级分类的热门商品]
7. 四级分类维度
Key: interest:hot:category_level4:2040
Value: [四级分类的热门商品]
8. 平台+二级分类组合维度
Key: interest:hot:platform_category2:essaone_29
Value: [260个商品]
9. 平台+三级分类组合维度
Key: interest:hot:platform_category3:essaone_2040
Value: [231个商品]
10. 供应商维度
Key: interest:hot:supplier:24947
Value: [1566197] # 1个商品
📋 在线召回使用策略
场景1: 详情页相似推荐
召回Key:
# 根据当前浏览的商品ID
item_id = request.sku_id
recall_keys = [
f"item:similar:swing_cpp:{item_id}", # 优先使用高性能版本
f"item:similar:swing:{item_id}", # 降级使用
f"item:similar:session_w2v:{item_id}", # 补充推荐
]
召回流程:
- 优先查询
swing_cpp(C++高性能版本) - 如果没有结果,查询
swing(Python标准版本) - 如果还没结果,查询
session_w2v(会话序列版本) - 最终结果融合多个算法的相似商品
场景2: 首页热门推荐
召回Key:
# 根据用户特征和上下文
user_profile = get_user_profile(user_id)
context = request.context # {platform, client, category, ...}
recall_keys = []
# 1. 组合维度推荐(最精准)
if context.get('platform') and context.get('category_level2'):
recall_keys.append(
f"interest:hot:platform_category2:{context['platform']}_{context['category_level2']}"
)
# 2. 单一分类维度
if context.get('category_level2'):
recall_keys.append(f"interest:hot:category_level2:{context['category_level2']}")
# 3. 平台维度
if context.get('platform'):
recall_keys.append(f"interest:hot:platform:{context['platform']}")
# 4. 客户端平台维度
if context.get('client'):
recall_keys.append(f"interest:hot:client_platform:{context['client']}")
# 5. 全局热门(兜底)
recall_keys.append("interest:hot:platform:essaone") # 全局热门
召回优先级:
- 组合维度(如 platform_category2) - 最精准
- 分类维度(category_level2/3/4)
- 平台维度(platform)
- 全局热门 - 兜底策略
场景3: 用户点击历史推荐
召回Key:
# 根据用户点击的商品列表
clicked_items = [3141390, 3141390, 3606104, 3606102, ...]
all_recalled_items = []
for item_id in clicked_items:
# 查询相似商品
similar_items = redis.get(f"item:similar:swing_cpp:{item_id}")
if not similar_items:
similar_items = redis.get(f"item:similar:swing:{item_id}")
all_recalled_items.extend(similar_items)
# 去重并排序
final_items = deduplicate_and_rank(all_recalled_items)
场景4: 类别偏好推荐
召回Key:
# 根据用户收藏的类别
collected_categories = [1541, 137, 153, 1561, 1689, 1691]
recall_keys = []
for cat_id in collected_categories:
# 查询该类别的热门商品
category_key = f"interest:hot:category_level2:{cat_id}"
recall_keys.append(category_key)
# 批量查询
hot_items = redis.mget(recall_keys)
⚠️ 注意事项
1. Key存在性检查
def safe_get_recall(key):
"""安全获取召回数据,带降级策略"""
result = redis.get(key)
if not result:
# 降级策略:使用更通用的key
if ":category_level2:" in key:
# 尝试用更高级别的分类
fallback_key = key.replace("category_level2", "category_level1")
result = redis.get(fallback_key)
elif "platform_category" in key:
# 尝试单独的平台或分类
result = redis.get(key.replace("platform_category2:", "category_level2:"))
return result or []
2. 数据格式
- I2I数据: JSON字符串,格式为
"item_id1:score1,item_id2:score2" - Interest数据: JSON数组,格式为
[item_id1, item_id2, ...]
3. 解析方法
import json
# I2I数据解析
def parse_i2i_data(value):
items = []
for pair in value.split(','):
if ':' in pair:
item_id, score = pair.split(':')
items.append([int(item_id), float(score)])
return items
# Interest数据解析
def parse_interest_data(value):
return json.loads(value)
4. 推荐数量
- 每个相似推荐key通常包含10-50个商品
- 每个兴趣聚合key通常包含100-1000个商品
- 最终推荐数量建议:取Top 20-50个商品
📊 Key覆盖率统计
| Key类型 | 数量 | 覆盖率 | 使用优先级 |
|---|---|---|---|
| item:similar:swing | 170,116 | ~80% | ⭐⭐⭐⭐⭐ |
| item:similar:content_name | 129,103 | ~70% | ⭐⭐⭐⭐ |
| item:similar:session_w2v | 52,339 | ~30% | ⭐⭐⭐ |
| item:similar:deepwalk | 49,052 | ~30% | ⭐⭐⭐ |
| item:similar:swing_cpp | 15,310 | ~10% | ⭐⭐⭐⭐⭐ |
| item:similar:content_pic | 12,118 | ~7% | ⭐⭐ |
| interest:hot:* | 10 | ~5% | ⭐⭐ |
说明:
- Swing覆盖商品约10万+,应优先使用
- 兴趣聚合数据较少,建议作为补充召回策略
🔧 修复建议
缺失的关键数据:
- DeepWalk索引:
item:similar:deepwalk:{item_id}- 缺失 - 内容相似度:
item:similar:content_name:{item_id}- 缺失 - 图片相似度:
item:similar:content_pic:{item_id}- 缺失 - 更多兴趣聚合维度:
interest:hot:category_level2:{id}- 缺失(1541, 137, 153等)interest:cart:*- 缺失interest:new:*- 缺失interest:global:*- 缺失
建议操作:
# 1. 运行兴趣聚合任务生成更多维度数据
cd /home/tw/recommendation/offline_tasks
python3 scripts/interest_aggregation.py
# 2. 加载更多兴趣聚合数据到Redis
python3 scripts/load_index_to_redis.py --load-interest
# 3. 定期更新数据(每天)
crontab -e
# 添加: 0 3 * * * /home/tw/recommendation/offline_tasks/update_indices.sh
📞 使用示例
Python召回示例
import redis
import json
redis_client = redis.Redis(
host='localhost',
port=6479,
db=3,
password='BMfv5aI31kgHWtlx',
decode_responses=True
)
def recall_similar_items(item_id):
"""召回相似商品"""
# 按优先级查询
keys = [
f"item:similar:swing_cpp:{item_id}",
f"item:similar:swing:{item_id}",
f"item:similar:session_w2v:{item_id}"
]
for key in keys:
value = redis_client.get(key)
if value:
# 解析数据
items = []
for pair in value.split(','):
if ':' in pair:
similar_id, score = pair.split(':')
items.append([int(similar_id), float(score)])
return items
return []
def recall_hot_items(platform, category_level2):
"""召回热门商品"""
key = f"interest:hot:platform_category2:{platform}_{category_level2}"
value = redis_client.get(key)
if value:
return json.loads(value)
# 降级策略
category_key = f"interest:hot:category_level2:{category_level2}"
value = redis_client.get(category_key)
if value:
return json.loads(value)
# 最终降级:全局热门
global_key = f"interest:hot:platform:{platform}"
value = redis_client.get(global_key)
if value:
return json.loads(value)
return []
🎯 总结
当前Redis中有数据的Key类型:
- ✅
item:similar:swing:{item_id}- 170,116个 - ✅
item:similar:content_name:{item_id}- 129,103个 - ✅
item:similar:session_w2v:{item_id}- 52,339个 - ✅
item:similar:deepwalk:{item_id}- 49,052个 - ✅
item:similar:swing_cpp:{item_id}- 15,310个 - ✅
item:similar:content_pic:{item_id}- 12,118个 - ✅
interest:hot:platform:{platform}- 1个 - ✅
interest:hot:client_platform:{client}- 1个 - ✅
interest:hot:platform_client:{platform}_{client}- 1个 - ✅
interest:hot:category_level1:{id}- 1个 - ✅
interest:hot:category_level2:{id}- 1个 - ✅
interest:hot:category_level3:{id}- 1个 - ✅
interest:hot:category_level4:{id}- 1个 - ✅
interest:hot:platform_category2:{platform}_{id}- 1个 - ✅
interest:hot:platform_category3:{platform}_{id}- 1个 - ✅
interest:hot:supplier:{id}- 1个
缺失但应该有的Key:
- ❌ 更多类别的
interest:hot:category_level2:{id} - ❌
interest:cart:*(加购热门) - ❌
interest:new:*(新品) - ❌
interest:global:*(全局热门)
建议: 优先使用现有的高质量数据,同时尽快补充缺失的兴趣聚合数据。