一、介绍
Redis 服务器是使用最广泛的开源数据库解决方案之一。Redis 将所有数据存储在内存中,以实现低延迟和高吞吐量。这些优势使 Redis 适用于存储繁忙网站的购物车数据,尤其是在旺季。
从电子商务网站下订单时,客户通常会从购物清单中选择商品,然后将商品添加到购物车。在后台,购物车驻留在数据库中。虽然使用关系数据库来处理购物车数据是可行的,但此类数据库可能无法在大量用户的情况下以最佳方式执行,并且它们的缓慢可能会对用户体验产生负面影响。
Redis 具有多种功能,您可以使用它们来加快在网站上添加、删除和显示购物车数据的过程。您可以将 Redis,,, 和命令与 Redis 哈希(字段值对的集合)结合使用,以实现所有购物车功能。hset
hincrby
hdel
hget
本指南向您展示如何在 Ubuntu 20.04 服务器上使用 Python 和托管 Redis 数据库实现购物车应用程序。
二、准备工作
要遵循本指南:
- 部署 Ubuntu 20.04 服务器。
- 创建一个非根
sudo
用户。 - 配置托管的 Vultr Redis 数据库。然后,导航到您的 Redis 数据库实例并单击概述选项卡以检索您的数据库连接详细信息。本指南使用以下示例连接详细信息:
- 用户名:
default
- 密码:
EXAMPLE_PASSWORD
- 主持人:
SAMPLE_DB_HOST_STRING.vultrdb.com
- 端口:
16752
- 用户名:
三、创建中央 Redis 类
在设计 Python 应用程序时,通常为基本函数设置单独的类,以促进代码重用并减少重复。本指南使用一个中央 Redis 类,该类处理从 Redis 服务器添加、删除、删除和列出购物车项目的不同功能。按照以下步骤创建类:
- 首先创建一个目录,将你的 Python 源代码与其他 Linux 文件分开。
project
$ mkdir project
- 切换到新目录。
project
$ cd project
- 在文本编辑器中打开一个新文件。
redis_gateway.py
$ nano redis_gateway.py
- 在文件中输入以下信息。将 、 和值替换为托管 Redis 数据库中的正确数据库信息。
redis_gateway.py
db_host
db_port
db_pass
import redis class RedisGateway: def __init__(self): db_host = 'SAMPLE_DB_HOST_STRING.vultrdb.com' db_port = 16752 db_pass = 'EXAMPLE_PASSWORD' self.redisClient = redis.Redis(host = db_host, port = db_port, password = db_pass, ssl = 'true') def add_to_cart(self, json_payload): cart_id = json_payload["cart_id"] product_name = json_payload["product_name"] quantity = json_payload["quantity"] if self.redisClient.hexists(cart_id , product_name): self.redisClient.hincrby(cart_id , product_name, quantity) else: self.redisClient.hset(cart_id, product_name, quantity) return "Item added to cart successfully." def remove_from_cart(self, json_payload): cart_id = json_payload["cart_id"] product_name = json_payload["product_name"] if self.redisClient.hexists(cart_id, product_name): self.redisClient.hdel(cart_id, product_name) return "Item removed from cart." else: return "Item not found from cart." def get_cart(self, cart_id): result = self.redisClient.hgetall(cart_id) return result
- 保存并关闭文件。
redis_gateway.py
3.1、redis_gateway.py文件解释
- 该文件有一个类。
redis_gateway.py
RedisGateway
- 该类有四种方法。
RedisGateway
- 该函数在首次导入和初始化类时触发。
__init__()
- 该函数包含您要添加到购物车的、该和该。在函数下,您首先通过运行函数来检查 Redis 服务器中是否存在购物车。如果购物车存在,则使用命令将新数量添加到购物车。否则,如果具有定义的购物车不存在,则从头开始创建它。然后,您将使用该命令添加新的产品名称和数量。
add_to_cart(..., json_payload)
json_payload
cart_id
product_name
quantity
add_to_cart()
self.redisClient.hexists
self.redisClient.hincrby...
cart_id
self.redisClient.hset(cart_id, product_name, quantity)
- 该函数接受具有要从购物车中删除的产品名称的 JSON 有效负载。在发出命令之前,您使用逻辑语句检查产品是否存在于 Redis 服务器中。
remove_from_cart(self, json_payload)
if self.redisClient.hexists(cart_id, product_name):
self.redisClient.hdel(cart_id, product_name)
- 该函数采用并查询 Redis 服务器以使用命令列出购物车中的所有项目。
get_cart(..., cart_id)
cart_id
self.redisClient.hgetall(cart_id)
- 该函数在首次导入和初始化类时触发。
- 现在准备好了。您可以在其他源代码文件中引用它,并使用以下语法使用其方法:
RedisGateway
import redis_gateway rg = redis_gateway.RedisGateway() resp = rg.add_to_cart(json_payload); resp = rg.remove_from_cart(json_payload); resp = rg.get_cart(cart_id);
准备好中央 Redis 网关后,按照下一步为您的应用程序创建主文件。
四、 创建主 Python 文件
每个 Python 应用程序都必须有一个在启动应用程序时触发的主文件。本指南使用文件作为起点。按照以下步骤创建文件:main.py
- 在文本编辑器中打开一个新文件。
main.py
$ nano main.py
- 在文件中输入以下信息。
main.py
import http.server from http import HTTPStatus from urllib.parse import urlparse, parse_qs import socketserver import json import redis_gateway class httpHandler(http.server.SimpleHTTPRequestHandler): def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) json_payload = json.loads(post_data) self.send_response(HTTPStatus.OK) self.end_headers() rg = redis_gateway.RedisGateway() resp = rg.add_to_cart(json_payload); self.wfile.write(bytes(resp + '\r\n', "utf8")) def do_DELETE(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length) json_payload = json.loads(post_data) self.send_response(HTTPStatus.OK) self.end_headers() rg = redis_gateway.RedisGateway() resp = rg.remove_from_cart(json_payload); self.wfile.write(bytes(resp + '\r\n', "utf8")) def do_GET(self): self.send_response(HTTPStatus.OK) self.end_headers() parsed_url = urlparse(self.path) params = parse_qs(parsed_url.query) cart_id = params['cart_id'][0] rg = redis_gateway.RedisGateway() cart = rg.get_cart(cart_id) data = { y.decode('ascii'): cart.get(y).decode('ascii') for y in cart.keys() } resp = json.dumps(data, indent = 4, separators = (',', ': ')) self.wfile.write(bytes(resp + "\r\n", "utf8")) httpServer = socketserver.TCPServer(('', 8080), httpHandler) print("HTTP server started at port 8080...") try: httpServer.serve_forever() except KeyboardInterrupt: httpServer.server_close() print("The server is stopped.")
- 保存并关闭文件。
main.py
4.1、main.py 文件解释
- 该部分允许您导入应用程序所需的所有必要的 Python 模块。,,,, 和模块为应用程序提供 HTTP 功能。该模块允许您在标准 JSON 响应中格式化响应。然后,要连接到 Redis 服务器,您需要导入自定义模块。
import ...
http.server
HTTPStatus
urlparse
parse_qs
socketserver
json
redis_gateway
- 该类处理所有 HTTP 方法。这些是,,,和。这些方法与以下购物车功能匹配。
httpHandler
POST
DELETE
GET
POST
:.将商品添加到购物车。rg.add_to_cart(...)
DELETE
:.从购物车中删除商品。rg.remove_from_cart(...)
GET
:.列出购物车中的所有商品。rg.get_cart(...)
- 该语句在端口上启动 HTTP 服务器并声明为处理程序类。
httpServer = socketserver.TCPServer(('', 8080), httpHandler)
8080
httpHandler
您的应用程序现已准备就绪。按照下一步测试应用程序。
五、 测试 Redis 购物车应用程序
最后一步是安装应用程序所需的第三方 Python 模块,并运行一些测试以确保一切正常。
- 安装 Python 包。这是一个用于下载和安装Python模块的工具。
pip
$ sudo apt update $ sudo apt install -y python3-pip
- 使用软件包来安装 Python 模块。
pip
redis
$ pip install redis
- 使用命令运行应用程序,然后使用启动文件。
python3
main.py
$ python3 main.py
输出。
HTTP server started at port 8080...
- 与服务器建立另一个 SSH 连接,并使用 Linux命令向应用程序发送以下请求。
curl
- 将三个项目添加到购物车使用。
abc
cart_id
$ curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"cart_id": "abc", "product_name": "SMART WATCH", "quantity": "4"}' $ curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"cart_id": "abc", "product_name": "4G WIRELESS ROUTER", "quantity": "7"}' $ curl -X POST http://localhost:8080/ -H 'Content-Type: application/json' -d '{"cart_id": "abc", "product_name": "500W JUICER", "quantity": "2"}'
输出。
... Item added to cart successfully.
- 从购物车中检索商品。
$ curl -X GET 'http://localhost:8080?cart_id=abc'
输出。
{ "SMART WATCH": "4", "4G WIRELESS ROUTER": "7", "500W JUICER": "2" }
- 从购物车中取出一件商品。
$ curl -X DELETE http://localhost:8080/ -H 'Content-Type: application/json' -d '{"cart_id": "abc", "product_name": "SMART WATCH"}'
输出。
Item removed from cart.
- 将三个项目添加到购物车使用。
六、结论
本指南在 Ubuntu 20.04 服务器上使用 Python 和来自 Vultr 的托管 Redis 数据库实现了购物车解决方案。在创建下一个购物车应用程序时,请使用本指南中的示例源代码。Redis 购物车实现允许您的应用程序在高峰期处理许多订单,从而增强用户体验。