代码实现 1.将excel中商品信息(id,描述,数量,品类)导入到mongodb中,并进行数据统计与分组统计(商品id不低于10个,商品品类不低于2个)。 2.通过python将商品信息导入到redis,并进行秒杀系统的模拟 3.使用python获得redis的数据连接neo4j中实现用户信息与商品信息的对应图谱。 4.在实现秒杀过程中,会出现库存不足的情况,需要补货(mongodb→redis)。
时间: 2024-03-11 13:50:02 浏览: 136
好的,下面是完整的代码实现,包括前面提到的所有问题:
1. 将excel中商品信息(id,描述,数量,品类)导入到mongodb中,并进行数据统计与分组统计(商品id不低于10个,商品品类不低于2个)。
```python
import pandas as pd
from pymongo import MongoClient
# 读取Excel文件
df = pd.read_excel('product_info.xlsx')
# 连接MongoDB
client = MongoClient('mongodb://localhost:27017')
db = client['product_db']
collection = db['product_collection']
# 将Excel数据插入MongoDB
data = df.to_dict(orient='records')
collection.insert_many(data)
# 商品数量统计
total_count = collection.count_documents({})
print(f'商品总数:{total_count}')
# 商品品类统计
categories = collection.distinct('category')
print(f'商品品类:{categories}')
```
2. 通过python将商品信息导入到redis,并进行秒杀系统的模拟。
```python
import json
import redis
import time
import threading
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 加载商品信息
products = {}
for item in collection.find():
products[str(item['id'])] = {
'name': item['name'],
'price': float(item['price']),
'stock': int(item['stock'])
}
json_products = json.dumps(products)
# 将商品信息写入Redis
r.set('products', json_products)
def buy_product(user_id, product_id):
# 获取商品信息
product_str = r.get('products').decode('utf-8')
products = json.loads(product_str)
product = products[str(product_id)]
# 判断库存是否足够
if product['stock'] > 0:
# 减少库存
product['stock'] -= 1
# 更新商品信息
products[str(product_id)] = product
r.set('products', json.dumps(products))
# 添加用户购买记录
r.sadd(f'user_purchase_history:{user_id}', f'{product["name"]}|{product["price"]}')
print(f'用户{user_id}购买了商品{product_id}')
else:
print(f'商品{product_id}已经售罄')
# 模拟100个用户同时购买商品
for i in range(100):
threading.Thread(target=buy_product, args=(i, 1)).start()
time.sleep(0.1)
```
上述代码首先连接Redis,并将商品信息从MongoDB中读取,并写入Redis中。接着,定义了一个buy_product函数,用于模拟用户购买商品的过程。在主函数中,模拟了100个用户同时购买商品的情况。
需要注意的是,在实际的秒杀系统中,需要设置一个并发量上限,防止超卖等问题。
3. 使用python获得redis的数据连接neo4j中实现用户信息与商品信息的对应图谱。
```python
import json
import redis
from neo4j import GraphDatabase, basic_auth
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 加载商品信息和用户购买记录
product_str = r.get('products').decode('utf-8')
products = json.loads(product_str)
user_purchase_history = {}
for user_id in range(100):
user_purchase_history[user_id] = r.smembers(f'user_purchase_history:{user_id}')
# 连接Neo4j
driver = GraphDatabase.driver('bolt://localhost:7687', auth=basic_auth('neo4j', 'password'))
session = driver.session()
# 创建用户和商品节点
for product_id in products.keys():
session.run(f"MERGE (p:Product {{id: '{product_id}', name: '{products[product_id]['name']}', price: {products[product_id]['price']}}})")
for user_id in range(100):
session.run(f"MERGE (u:User {{id: '{user_id}'}})")
# 创建用户和商品之间的关系
for user_id in range(100):
for item in user_purchase_history[user_id]:
item_arr = item.decode('utf-8').split('|')
product_id = None
for key, value in products.items():
if value['name'] == item_arr[0] and value['price'] == float(item_arr[1]):
product_id = key
break
if product_id:
session.run(f"MATCH (u:User {{id: '{user_id}'}}), (p:Product {{id: '{product_id}'}}) MERGE (u)-[:PURCHASED]->(p)")
```
上述代码首先从Redis中读取商品信息和用户购买记录,并连接Neo4j数据库。接着,创建商品和用户节点,并创建用户和商品之间的关系。
需要注意的是,在实际应用中,需要对数据进行清洗和预处理,例如去重、类型转换等。
4. 在实现秒杀过程中,会出现库存不足的情况,需要补货(mongodb→redis)。
```python
import json
# 连接MongoDB
client = MongoClient('mongodb://localhost:27017')
db = client['product_db']
collection = db['product_collection']
# 读取商品信息
products = {}
for item in collection.find():
products[str(item['id'])] = {
'name': item['name'],
'price': float(item['price']),
'stock': int(item['stock'])
}
json_products = json.dumps(products)
# 连接Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 将商品信息写入Redis
r.set('products', json_products)
# 定时检查库存,并进行补货
while True:
time.sleep(60)
for product_id in products.keys():
product = products[product_id]
if product['stock'] < 10:
# 从MongoDB中获取最新的商品信息
item = collection.find_one({'id': product_id})
# 更新商品信息
product['stock'] = int(item['stock'])
products[product_id] = product
# 将商品信息写入Redis
r.set('products', json.dumps(products))
print(f'商品{product_id}已经补货,库存为{product["stock"]}')
```
上述代码使用了一个while循环,每隔一分钟检查一次商品库存,如果库存低于10个,就从MongoDB中获取最新的商品信息,并更新Redis中的商品信息。这样,在实际应用中,就能够及时进行商品补货。需要注意的是,在实际应用中,需要设置一个合理的补货策略,例如根据历史销售数据预测销量等。
阅读全文