如何在Python中使用Vultr托管数据库进行缓存

介绍

Redis® 是一种内存数据存储,提供灵活的数据结构、高性能和按需可扩展性。Vultr Managed Database for Caching 为任务关键型应用程序提供高可用性、高吞吐量和低延迟。本指南介绍如何在 Python 中使用 Vultr Managed Database for Caching 创建高可用性应用程序。

先决条件

准备工作:

  • 购买用于缓存的 Vultr 托管数据库
  • 购买Vultr Linux 服务器以用作开发计算机
  • 使用 SSH 以非 root 用户身份访问服务器

设置 Python 开发环境

要将 Vultr Managed Database for Caching 集成到 Python 应用程序,请安装 Python 模块并设置示例项目目录来存储应用程序文件。redis

  1. 升级 Python 包管理器。pip
     $ pip install --upgrade pip
  2. 安装 Python 驱动程序以连接到 Redis® 数据库。redis
     $ pip install redis
  3. 创建一个新目录。project
     $ mkdir project
  4. 导航到新目录。project
     $ cd project

创建 Redis® 网关类

要在 Python 应用程序文件中使用 Vultr Managed Database for Caching 连接,请创建一个连接到数据库的中央 Python 模块。然后,可以通过在应用程序中使用子句声明数据库模块来重用该模块。按照以下步骤创建 Redis® 连接模块import

  1. 使用 Vim 等文本编辑器创建一个新文件redis_gateway.py
     $ nano redis_gateway.py
  2. 将以下代码添加到文件中。将 、 和 值替换为正确的 Vultr Managed Database for Caching 详细信息vultr-prod-abcd.vultrdb.com16752example-password
     import redis
    
     class RedisGateway:
    
         def __init__(self):
    
             r_host = 'vultr-prod-abcd.vultrdb.com'
             r_port = 16752
             r_pass = 'example-password'
    
             self.r_client = redis.Redis(
                 host     = r_host, 
                 port     = r_port, 
                 password = r_pass, 
                 ssl      = 'true'
             )

    保存并关闭文件

    上面的 Python 应用程序代码使用方法声明一个类。每次创建类的实例时,都会执行此方法。然后,它使用该函数连接到 Redis® 数据库。RedisGateway__init__(self)RedisGatewayself.r_client = redis.Redis(...)

    要将 Redis® 数据库模块导入到其他 Python 源代码文件,请使用以下声明:

     import redis_gateway 
    
     r_gateway = redis_gateway.RedisGateway() 
     r_client  = r_gateway.r_client

实现 Redis® 字符串

在 Redis® 中,字符串是字节序列,是最常用的数据类型。您可以使用字符串数据类型来存储会话 ID、用户密码、产品信息和静态 HTML 内容。要在 Redis® 服务器中创建密钥,请使用关键字。若要检索键值,请使用关键字。在本节中,创建一个 Python 应用程序来实现 Redis® 字符串,如下所述。setget

  1. 创建新文件redis_strings.py
     $ nano redis_strings.py
  2. 将以下内容添加到文件中
     import redis_gateway 
    
     r_gateway = redis_gateway.RedisGateway() 
     r_client  = r_gateway.r_client
    
     r_key   = "john_doe"
     r_value = "example-password"
    
     r_client.set(r_key, r_value)   
    
     print("...\r\n You've successfully set the Redis key.\r\n")
    
     if r_client.exists(r_key): 
    
         r_value = r_client.get(r_key).decode("utf-8")
    
         print("The value for the " + r_key + " key is " + r_value + "\r\n ...")

    保存并关闭文件。

    上面的应用程序文件导入您之前创建的模块,然后:redis_gateway

    • r_key:定义您在 Redis® 数据库中设置的字符串键的名称
    • r_value:定义 Redis® 键值
    • r_client.set(r_key, r_value):在 Redis® 数据库中设置密钥
    • if r_client.exists(r_key):在检索密钥之前,先验证密钥是否存在于 Redis® 数据库服务器中,以避免运行时错误
    • r_client.get(r_key).decode("utf-8"):从 Redis® 数据库中检索密钥
  3. 运行 Redis® 字符串应用程序文件
     $ python3 redis_strings.py

    输出:

     ...
      You've successfully set the Redis key.
    
     The value for the john_doe key is example-password
      ...

    如上面的输出所示,Python 正确连接到 Redis® 数据库并设置字符串键的值。example-passwordjohn_doe

实现 Redis® 列表

Redis® 列表是用于实现排队机制的字符串的有序集合。Redis® 允许您使用 和 命令将元素添加到列表的头部或尾部。创建新的 Python 应用程序来测试 Redis® 列表功能,如下所述。lpushrpush

  1. 创建新文件redis_lists.py
     $ nano redis_lists.py
  2. 将以下内容添加到文件中
     import redis_gateway
     import json
    
     r_gateway = redis_gateway.RedisGateway() 
     r_client  = r_gateway.r_client
    
     r_list   = "sample_customer_job_list"
    
     sample_job_1 = {
         "firstName": "JOHN",
         "lastName": "DOE",
         "email": "john_doe@example.com"
     }
    
     sample_job_2 = {
         "firstName": "MARY",
         "lastName": "SMITH",
         "email": "mary_smith@example.com"
     }
    
     r_list_value_1  = json.dumps(sample_job_1)
     r_list_value_2  = json.dumps(sample_job_2)
    
     r_client.lpush(r_list, r_list_value_1, r_list_value_2) 
    
     print("...\r\n You've successfully added a customer registration jobs to the Redis list.\r\n...")
    
     while(r_client.llen(r_list) != 0):
    
         print("The values for the " + r_list + "\r\n...")
    
         print(r_client.lpop(r_list).decode("utf-8") + "\r\n...") 

    保存并关闭文件。

    下面是上面的应用程序代码的作用:

    • 该变量表示示例 Redis® 列表的键。r_list
    • sample_job_1 = {...}和 是示例列表值。sample_job_1 = {...}
    • 该函数将两个示例作业插入到 Redis® 列表中r_client.lpush(r_list, r_list_value_1, r_list_value_2)
    • 循环查询 Redis® 服务器并循环访问变量以打印列表值while(r_client.llen(r_list) != 0):r_list
  3. 运行应用程序文件redis_lists.py
     $ python3 redis_lists.py

    输出:

     ...
      You've successfully added a customer registration jobs to the Redis list.
     ...
     The values for the sample_customer_job_list
     ...
     {"firstName": "MARY", "lastName": "SMITH", "email": "mary_smith@example.com"}
     ...
     The values for the sample_customer_job_list
     ...
     {"firstName": "JOHN", "lastName": "DOE", "email": "john_doe@example.com"}
     ...

实现 Redis® 哈希

Redis® 哈希是将键映射到值对的记录类型。在 Python 应用程序中以公司数据的形式实现 Redis® 哈希,如下所述。

  1. 创建新文件redis_hash.py
     $ nano redis_hash.py
  2. 将以下内容添加到文件中
     import redis_gateway
     import json
    
     r_gateway = redis_gateway.RedisGateway() 
     r_client  = r_gateway.r_client
    
     r_hash = "company_profile"
    
     r_client.hset(r_hash, "company_name", "XYZ COMPANY")
     r_client.hset(r_hash, "add_line_1", "123 SAMPLE STREET")
     r_client.hset(r_hash, "add_line_2", "APT BUILDING")
     r_client.hset(r_hash, "county", "3RD COUNTY")
     r_client.hset(r_hash, "city", "SUN CITY")
     r_client.hset(r_hash, "zip", "123456")
    
     print("...\r\nYou've successfully set a company profile.\r\n...")
    
     print("Company profile information \r\n" )
    
     print(json.dumps(str(r_client.hgetall(r_hash)))) 
    
     print("Company Name : " + r_client.hget(r_hash, "company_name").decode("utf-8"))

    保存并关闭文件。

    在上述应用中:

    • 该变量表示 Redis® 数据库中的哈希键。r_hash
    • 该函数在 Redis 服务器中设置哈希值。此函数与以下内容相同:r_client.hset(r_hash, "company_name", "XYZ COMPANY")
        company_profile['company_name'] =  "XYZ COMPANY"
    • r_client.hgetall(r_hash):检索给定哈希的所有键值对
    • r_client.hget(r_hash, "company_name"):检索哈希中给定键的值
  3. 运行应用程序
     $ python3 redis_hash.py

    输出:

     ...
     You've successfully set a company profile.
     ...
     Company profile information
    
     "{b'company_name': b'XYZ COMPANY', b'add_line_1': b'123 SAMPLE STREET', b'add_line_2': b'APT BUILDING', b'county': b'3RD COUNTY', b'city': b'SUN CITY', b'zip': b'123456'}"
     Company Name : XYZ COMPANY

实现 Redis® 排序集

排序集表示按关联乐谱排列的字符串集合。元素在排序集中只能出现一次。Redis® 提供了用于添加和检索排序集值的 and 函数。在 Python 应用程序中实现这些函数,如下所述。zaddzrange

  1. 创建新文件redis_sorted_set.py
     $ nano redis_sorted_set.py
  2. 将以下内容添加到文件中
     import redis_gateway
     import json
    
     r_gateway = redis_gateway.RedisGateway() 
     r_client  = r_gateway.r_client
    
     r_sorted_set = "database_ratings"
    
     database_scores = {
         'MySQL': 1, 
         'PostgreSQl': 2,
         'SQLite': 3,
         'MongoDB': 4 
     }
    
     r_client.zadd(r_sorted_set, database_scores)
    
     print("...\r\nYou've successfully entered four database ratings.\r\n...")
    
     print("Database rating information: \r\n")
    
     print(r_client.zrange(r_sorted_set, 0, 3))

    保存并关闭文件。

    在上述应用中:

    • r_sorted_set:声明排序集的键
    • database_scores = {...}:包含四个具有匹配分数的元素
    • r_client.zadd(r_sorted_set, database_scores):将 set 元素添加到 Redis® 服务器
    • r_client.zrange(r_sorted_set, 0, 3):从数据库中返回所有排序的集合值
  3. 运行应用程序
     $ python3 redis_sorted_set.py

    输出:

     ...
     You've successfully entered four database ratings.
     ...
     Database rating information:
    
     [b'MySQL', b'PostgreSQl', b'SQLite', b'MongoDB']

结论

在本指南中,您已使用 Vultr Managed Database for Caching with Python 实现了不同的数据类型。根据您的应用程序用例,实现相关的 Redis® 数据类型以在数据库中缓存和存储数据。

THE END