本文目录导读:

我来给你介绍 Python 操作 Redis 哈希数据的完整案例。
基础操作案例
安装依赖
pip install redis
基本读写示例
import redis
# 连接 Redis
r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True)
# 1. 设置哈希数据
# 方法1:单个设置
r.hset("user:1001", "name", "张三")
r.hset("user:1001", "age", 25)
r.hset("user:1001", "email", "zhangsan@example.com")
# 方法2:批量设置
r.hset("user:1002", mapping={
"name": "李四",
"age": 30,
"email": "lisi@example.com",
"city": "北京"
})
# 2. 读取哈希数据
# 获取单个字段
name = r.hget("user:1001", "name")
print(f"姓名: {name}") # 张三
# 获取多个字段
fields = r.hmget("user:1001", ["name", "age", "email"])
print(f"多个字段: {fields}") # ['张三', '25', 'zhangsan@example.com']
# 获取所有字段和值
all_data = r.hgetall("user:1001")
print(f"所有数据: {all_data}") # {'name': '张三', 'age': '25', 'email': 'zhangsan@example.com'}
# 获取所有字段名
keys = r.hkeys("user:1001")
print(f"所有字段: {keys}") # ['name', 'age', 'email']
# 获取所有值
values = r.hvals("user:1001")
print(f"所有值: {values}") # ['张三', '25', 'zhangsan@example.com']
完整业务案例:用户管理系统
import redis
import json
from datetime import datetime
import time
class UserManager:
def __init__(self):
self.r = redis.Redis(
host='localhost',
port=6379,
db=0,
decode_responses=True
)
self.user_prefix = "user:"
def create_user(self, user_id, user_info):
"""创建用户"""
key = f"{self.user_prefix}{user_id}"
# 检查用户是否已存在
if self.r.exists(key):
print(f"用户 {user_id} 已存在")
return False
# 添加创建时间
user_info['created_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
user_info['updated_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 批量设置哈希字段
self.r.hset(key, mapping=user_info)
print(f"用户 {user_id} 创建成功")
return True
def get_user(self, user_id, fields=None):
"""获取用户信息"""
key = f"{self.user_prefix}{user_id}"
if fields:
# 获取指定字段
return self.r.hmget(key, fields)
else:
# 获取所有信息
return self.r.hgetall(key)
def update_user(self, user_id, update_info):
"""更新用户信息"""
key = f"{self.user_prefix}{user_id}"
# 检查用户是否存在
if not self.r.exists(key):
print(f"用户 {user_id} 不存在")
return False
# 添加更新时间
update_info['updated_at'] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 更新字段
self.r.hset(key, mapping=update_info)
print(f"用户 {user_id} 更新成功")
return True
def delete_user(self, user_id):
"""删除用户"""
key = f"{self.user_prefix}{user_id}"
if self.r.delete(key):
print(f"用户 {user_id} 删除成功")
return True
print(f"用户 {user_id} 不存在")
return False
def get_user_count(self):
"""获取用户总数"""
pattern = f"{self.user_prefix}*"
keys = self.r.keys(pattern)
data_info = self.r.info()
return len(keys)
def list_all_users(self):
"""列出所有用户"""
pattern = f"{self.user_prefix}*"
keys = self.r.keys(pattern)
users = []
for key in keys:
user_data = self.r.hgetall(key)
user_data['user_id'] = key.replace(self.user_prefix, '')
users.append(user_data)
return users
# 使用示例
def user_management_demo():
um = UserManager()
# 1. 创建用户
user1 = {
'name': '张三',
'age': 28,
'email': 'zhangsan@example.com',
'phone': '13800138001',
'address': '北京市海淀区',
'role': 'admin'
}
user2 = {
'name': '李四',
'age': 25,
'email': 'lisi@example.com',
'phone': '13800138002',
'address': '上海市浦东新区',
'role': 'user'
}
um.create_user(1001, user1)
um.create_user(1002, user2)
# 2. 读取用户信息
print("\n=== 读取用户信息 ===")
# 获取所有信息
user_info = um.get_user(1001)
print(f"用户1001完整信息: {user_info}")
# 获取指定字段
specific_fields = um.get_user(1001, ['name', 'email', 'phone'])
print(f"指定字段: {specific_fields}")
# 3. 更新用户信息
print("\n=== 更新用户信息 ===")
update_info = {
'age': 29,
'phone': '13900139001',
'hobby': '编程'
}
um.update_user(1001, update_info)
updated_info = um.get_user(1001)
print(f"更新后的信息: {updated_info}")
# 4. 用户计数
print(f"\n用户总数: {um.get_user_count()}")
# 5. 列出所有用户
print("\n=== 所有用户列表 ===")
all_users = um.list_all_users()
for user in all_users:
print(f"用户{user['user_id']}: {user}")
# 运行示例
user_management_demo()
高级操作案例
import redis
import time
import random
class HashOperations:
def __init__(self):
self.r = redis.Redis(
host='localhost',
port=6379,
db=0,
decode_responses=True
)
def counter_example(self):
"""计数器示例 - 使用哈希存储多个计数器"""
key = "page:views"
# 初始化计数器
self.r.hset(key, "homepage", 0)
self.r.hset(key, "about", 0)
self.r.hset(key, "contact", 0)
# 模拟页面访问
for _ in range(10):
page = random.choice(["homepage", "about", "contact"])
self.r.hincrby(key, page, 1)
# 获取所有页面访问量
views = self.r.hgetall(key)
print(f"页面访问统计: {views}")
# 获取单个页面访问量
home_views = self.r.hget(key, "homepage")
print(f"首页访问量: {home_views}")
def self_definiendo_fields(self):
"""动态字段操作"""
key = "game:player:1001"
# 动态添加字段
stats = {
'level': 10,
'exp': 5000,
'health': 100,
'mana': 50,
'weapon': '剑',
'armor': '盾牌'
}
self.r.hset(key, mapping=stats)
# 检查字段是否存在
if self.r.hexists(key, 'weapon'):
print(f"玩家拥有武器: {self.r.hget(key, 'weapon')}")
# 获取字段数量
fields_count = self.r.hlen(key)
print(f"玩家属性数量: {fields_count}")
# 删除字段
self.r.hdel(key, 'armor')
print(f"删除后属性: {self.r.hgetall(key)}")
def batch_operations(self):
"""批量操作示例"""
pipeline = self.r.pipeline()
# 批量设置多个哈希
for i in range(5):
user_key = f"student:{i}"
pipeline.hset(user_key, mapping={
'name': f'学生{i}',
'score': random.randint(60, 100),
'class': f'班级{i%3+1}'
})
pipeline.execute()
# 批量获取
keys = [f"student:{i}" for i in range(5)]
pipeline = self.r.pipeline()
for key in keys:
pipeline.hgetall(key)
results = pipeline.execute()
for i, result in enumerate(results):
print(f"学生{i}: {result}")
# 运行高级操作示例
def advanced_demo():
ho = HashOperations()
print("=== 计数器示例 ===")
ho.counter_example()
print("\n=== 动态字段操作 ===")
ho.self_definiendo_fields()
print("\n=== 批量操作 ===")
ho.batch_operations()
advanced_demo()
实际应用场景:购物车实现
import redis
import json
class ShoppingCart:
def __init__(self):
self.r = redis.Redis(
host='localhost',
port=6379,
db=1, # 使用不同的数据库
decode_responses=True
)
self.cart_prefix = "cart:"
def add_item(self, user_id, product_id, quantity=1, product_info=None):
"""添加商品到购物车"""
key = f"{self.cart_prefix}{user_id}"
# 检查商品是否已在购物车
if self.r.hexists(key, product_id):
# 增加数量
current_qty = int(self.r.hget(key, product_id))
new_qty = current_qty + quantity
self.r.hset(key, product_id, new_qty)
else:
# 新商品,设置数量
self.r.hset(key, product_id, quantity)
print(f"已添加 {product_id} 到购物车,数量: {quantity}")
def remove_item(self, user_id, product_id):
"""从购物车移除商品"""
key = f"{self.cart_prefix}{user_id}"
if self.r.hexists(key, product_id):
self.r.hdel(key, product_id)
print(f"已移除 {product_id} 从购物车")
else:
print(f"购物车中没有 {product_id}")
def update_quantity(self, user_id, product_id, quantity):
"""更新商品数量"""
key = f"{self.cart_prefix}{user_id}"
if quantity <= 0:
self.remove_item(user_id, product_id)
else:
self.r.hset(key, product_id, quantity)
print(f"已更新 {product_id} 数量为 {quantity}")
def get_cart(self, user_id):
"""获取购物车内容"""
key = f"{self.cart_prefix}{user_id}"
cart_items = self.r.hgetall(key)
if cart_items:
print(f"\n用户 {user_id} 的购物车:")
for product_id, quantity in cart_items.items():
print(f" 商品: {product_id}, 数量: {quantity}")
else:
print(f"购物车为空")
return cart_items
def clear_cart(self, user_id):
"""清空购物车"""
key = f"{self.cart_prefix}{user_id}"
self.r.delete(key)
print(f"已清空用户 {user_id} 的购物车")
def get_cart_count(self, user_id):
"""获取购物车商品种类数"""
key = f"{self.cart_prefix}{user_id}"
return self.r.hlen(key)
def get_total_items(self, user_id):
"""获取购物车商品总数"""
key = f"{self.cart_prefix}{user_id}"
cart_items = self.r.hvals(key)
return sum(int(qty) for qty in cart_items)
# 使用购物车
def shopping_cart_demo():
cart = ShoppingCart()
# 添加商品
cart.add_item("user001", "product_001", 2)
cart.add_item("user001", "product_002", 1)
cart.add_item("user001", "product_003", 3)
# 查看购物车
cart.get_cart("user001")
# 更新数量
cart.update_quantity("user001", "product_001", 5)
# 移除商品
cart.remove_item("user001", "product_002")
# 查看统计
print(f"\n商品种类: {cart.get_cart_count('user001')}")
print(f"商品总数: {cart.get_total_items('user001')}")
# 清空购物车
cart.clear_cart("user001")
shopping_cart_demo()
性能优化和注意事项
class RedisHashOptimizer:
def __init__(self):
self.r = redis.Redis(
host='localhost',
port=6379,
db=0,
decode_responses=True,
socket_connect_timeout=5,
socket_timeout=5,
retry_on_timeout=True
)
def bulk_insert(self, data_dict, batch_size=100):
"""批量插入优化"""
pipeline = self.r.pipeline()
for i, (key, value) in enumerate(data_dict.items(), 1):
pipeline.hset("bulk:data", key, value)
# 每 batch_size 条执行一次
if i % batch_size == 0:
pipeline.execute()
pipeline = self.r.pipeline()
# 执行剩余的
pipeline.execute()
def memory_optimization(self):
"""内存优化建议"""
# 使用较短的字段名
# 而不是 'user_name',使用 'name'
# 而不是 'user_email',使用 'email'
# 使用哈希而不是字符串存储多个字段
# 坏做法
self.r.set("user:1:name", "张三")
self.r.set("user:1:email", "zhang@example.com")
# 好做法
self.r.hset("user:1", mapping={
"name": "张三",
"email": "zhang@example.com"
})
def expiration_management(self):
"""设置过期时间"""
# 为整个哈希设置过期
self.r.hset("session:token123", "user_id", "1001")
self.r.expire("session:token123", 3600) # 1小时后过期
# 或者在设置时直接指定
self.r.hset("temp:data", "value", "something")
self.r.expire("temp:data", 300) # 5分钟后过期
# 运行优化示例
optimizer = RedisHashOptimizer()
optimizer.memory_optimization()
optimizer.expiration_management()
这个案例涵盖了 Python 操作 Redis 哈希的常见场景,包括基本的 CRUD 操作、业务应用(用户管理、购物车)、以及性能优化技巧,实际使用时可以根据具体需求调整。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播