【python + Redis】hash值查增删

前置步骤

pip install redis
# -*- coding: utf-8 -*-
import redis
#这个redis不能用,请根据自己的需要修改
r =redis.Redis(host="127.0.0.1",port=6379,password="123456", db=0)

Redis库数据

keyvalue
1{“id”: 1, “name”: “xxx”, “age”: “18”, “sex”: “\u7537”}
2{“id”: 2, “name”: “xxx”, “age”: “15”, “sex”: “\u5973”}
3{“id”: 3, “name”: “xxx”, “age”: “18”, “sex”: “\u7537”}

一、查

1.定义列表list_r1,存储查询到的数据
2.定义data,用r.hgetall方法获取哈希表的所有字段和值,
3.循环遍历出行数据,转成字典类型
4.最后用if all方法将库中字段与之相匹配的数据查出,添入list_r1

# hash查
def get_hv(redis_name,params):
    list_r1 = []
    data=r.hgetall(redis_name)
    for k,v in data.items():
        row_data = json.loads(v.decode('utf-8'))
        if all(row_data.get(key,False)==val for key,val in params.items()):
            list_r1.append(row_data)
    print("list_r1:",list_r1)
    return list_r1

二、增

1.params[“id”]要与Mysql数据库中的自增id相同
2.这里用到了r.hset方法,格式为: r.hset(表名,key,value)
3.注意value不能使用字典类型,我们需要用json.dumps转字符串

# hash增
def set_hv(hash,params):
    if params.get("id",False):
        r.hset(hash,params["id"],json.dumps(params))
    return True

三、删

# hash删
def del_hv(hash,params):
    if params.get("id",False):
        r.hdel(hash,params["id"],json.dumps(params))
        return True
    else:
        return False
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 JSON 对象。通常用于身份认证和信息交换。结合 Redis 和 MySQL 使用,可以实现高性能、可扩展的用户认证系统。 下面是一个完整的使用 **Python + Flask + JWT + Redis + MySQL** 实现用户登录认证的示例,包含: - 用户注册与登录 - JWT 签发 Token - 使用 Redis 存储 Token 黑名单(实现登出功能) - 使用 MySQL 存储用户数据 --- ### ✅ 技术栈说明 - **Flask**: 轻量级 Web 框架 - **PyJWT**: 生成和验证 JWT - **Redis**: 缓存 Token 黑名单(如登出后的 token 失效) - **MySQL**: 存储用户信息(用户名、密码哈希等) - **Flask-MySQLdb 或 PyMySQL**: 连接 MySQL 数据库 --- ### 🛠️ 安装依赖 ```bash pip install flask pyjwt redis pymysql ``` --- ### 🔐 完整代码实现 ```python from flask import Flask, request, jsonify import jwt import datetime import hashlib import redis import pymysql app = Flask(__name__) # 配置 app.config['SECRET_KEY'] = 'your-secret-key' # 用于签名JWT JWT_EXPIRATION_SECONDS = 1800 # 30分钟过期 # Redis连接(用于存储黑名单) r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True) # MySQL数据库连接配置 def get_db_connection(): return pymysql.connect( host='localhost', user='root', password='your_password', database='user_db', charset='utf8mb4' ) # 创建用户表(首次运行时执行) def init_db(): conn = get_db_connection() cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL ) ''') conn.commit() conn.close() # 密码哈希(简单SHA256,生产环境建议用bcrypt/pbkdf2) def hash_password(password): return hashlib.sha256(password.encode()).hexdigest() # 检token是否在Redis黑名单中 def is_token_blacklisted(token): return r.get(f"blacklist:{token}") is not None # 登录装饰器:验证JWT def token_required(f): def decorator(*args, **kwargs): token = request.headers.get('Authorization') if not token: return jsonify({'message': 'Token is missing!'}), 401 if token.startswith('Bearer '): token = token[7:] # 去掉"Bearer " if is_token_blacklisted(token): return jsonify({'message': 'Token has been revoked (logged out)!'}), 401 try: payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256']) current_user = payload['username'] except jwt.ExpiredSignatureError: return jsonify({'message': 'Token has expired!'}), 401 except jwt.InvalidTokenError: return jsonify({'message': 'Invalid token!'}), 401 return f(current_user, *args, **kwargs) return decorator # 注册接口 @app.route('/register', methods=['POST']) def register(): data = request.get_json() username = data.get('username') password = data.get('password') if not username or not password: return jsonify({'message': 'Username and password required!'}), 400 conn = get_db_connection() cursor = conn.cursor() try: cursor.execute("SELECT * FROM users WHERE username = %s", (username,)) if cursor.fetchone(): return jsonify({'message': 'User already exists!'}), 400 hashed_pw = hash_password(password) cursor.execute("INSERT INTO users (username, password) VALUES (%s, %s)", (username, hashed_pw)) conn.commit() return jsonify({'message': 'User registered successfully!'}), 201 finally: conn.close() # 登录接口 @app.route('/login', methods=['POST']) def login(): data = request.get_json() username = data.get('username') password = data.get('password') if not username or not password: return jsonify({'message': 'Username and password required!'}), 400 conn = get_db_connection() cursor = conn.cursor() hashed_pw = hash_password(password) cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, hashed_pw)) user = cursor.fetchone() conn.close() if not user: return jsonify({'message': 'Invalid credentials!'}), 401 # 生成JWT expiration = datetime.datetime.utcnow() + datetime.timedelta(seconds=JWT_EXPIRATION_SECONDS) token = jwt.encode({ 'username': username, 'exp': expiration }, app.config['SECRET_KEY'], algorithm='HS256') return jsonify({'token': token}), 200 # 受保护的接口示例 @app.route('/protected', methods=['GET']) @token_required def protected(current_user): return jsonify({'message': f'Hello {current_user}, you have access!'}) # 登出接口(将token加入黑名单) @app.route('/logout', methods=['POST']) @token_required def logout(current_user): token = request.headers.get('Authorization')[7:] # 提取token # 将token加入黑名单,设置过期时间为JWT剩余时间 # 这里简化处理,直接设为JWT过期时间长度 r.setex(f"blacklist:{token}", JWT_EXPIRATION_SECONDS, "true") return jsonify({'message': 'Logged out successfully!'}) if __name__ == '__main__': init_db() app.run(debug=True) ``` --- ### 📝 代码解释 | 部分 | 说明 | |------|------| | `hash_password` | 使用 SHA256 哈希密码,生产环境推荐使用 `bcrypt` | | `token_required` 装饰器 | 拦截请求,检是否有有效 JWT,并验证是否在黑名单中 | | `is_token_blacklisted` | Redis 是否存在该 token 的黑名单记录 | | `/login` | 验证用户后签发 JWT | | `/logout` | 将当前 token 加入 Redis 黑名单,使其失效 | | Redis `setex` | 设置带过期时间的键,确保黑名单不会永久占用内存 | --- ### 💡 优势与设计思路 - **JWT 自包含**:减少数据库询 - **Redis 黑名单**:解决 JWT 无法主动失效的问题(如登出) - **MySQL 持久化**:安全存储用户凭证 - **无状态服务**:适合分布式部署 --- ### ⚠️ 生产环境优化建议 1. 使用 `bcrypt` 替代 `SHA256` 哈希密码 2. 使用 `python-decouple` 或 `os.getenv` 管理密钥 3. 添加 HTTPS 4. 使用连接池管理数据库连接 5. 使用更完善的错误处理和日志系统 6. JWT 刷新机制(refresh token) --- ### ✅ 示例请求(使用 curl) ```bash # 注册 curl -X POST http://127.0.0.1:5000/register \ -H "Content-Type: application/json" \ -d '{"username":"alice","password":"secret"}' # 登录 curl -X POST http://127.0.0.1:5000/login \ -H "Content-Type: application/json" \ -d '{"username":"alice","password":"secret"}' # 访问受保护路由 curl -X GET http://127.0.0.1:5000/protected \ -H "Authorization: Bearer <your-jwt-token>" # 登出 curl -X POST http://127.0.0.1:5000/logout \ -H "Authorization: Bearer <your-jwt-token>" ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值