使用 redis_om (python) 覆盖 redis 上的信息

overwrite information on redis using redis_om (python)

我使用 redis_OM 是为了更轻松地使用 redisearch 模块进行聚合。问题是我想每天上传一些数据到redis,而不保留前一天上传的数据,也就是说,我要么让旧数据过期,要么用新数据覆盖。

我是用Redis文档和redis云的例子来做的。这是我的模型:

import datetime
from typing import Optional
from pydantic import EmailStr
from redis_om import HashModel


class Customer(HashModel):
    first_name: str
    last_name: str
    email: EmailStr
    join_date: datetime.date
    age: int
    bio: Optional[str]

这是我上传数据的方式:

import csv

import os
os.environ["REDIS_OM_URL"]="redis://default:TbmcFFUUjPiOakJA5RcZKV1DBNRRFV9L@redis-18508.c228.us-central1-1.gce.cloud.redislabs.com:18508/test"

from customer_model import Customer
from redis_om import Migrator

with open('customers.csv') as csv_file:
    customers = csv.DictReader(csv_file)

    for customer in customers:
        cus = Customer(**customer)

        print(f"{customer['firstName']} -> {cus.pk}")
        cus.save()

# Create a RediSearch index
Migrator().run()

我知道我们可以使用 EXPIRE key seconds 让 redis 中的数据过期。但是如何使整个模型过期?

我能以某种方式覆盖它吗?我不认为第二个选项是可行的,因为每个对象都链接到一个唯一的 pk。

谢谢!

如果要使 Customer 对象过期,可以使用 expire 方法通过获取 Customer 模型的基础 redis-py 连接来实现。这是一个例子:

from redis_om import HashModel, Migrator

# Define a customer model
class Customer(HashModel):
    first_name: str
    last_name: str
    age: int
    bio: str

# Create some customers
cust1 = Customer(
    first_name="Customer",
    last_name="One",
    age=38,
    bio="This is some text about customer 1"
)

cust2 = Customer(
    first_name="Customer",
    last_name="Two",
    age=38,
    bio="This is some text about customer 2"
)

# Persist customers to Redis, setting expiry to 60 seconds
cust1.save()
print(f"Expiring {cust1.key()}")
Customer.db().expire(cust1.key(), 60)
cust2.save()
print(f"Expiring {cust2.key()}")
Customer.db().expire(cust2.key(), 60)

# Create index
Migrator().run()

显示 Redis 中设置的到期时间:

$ redis-cli
127.0.0.1:6379> ttl :__main__.Customer:01FY4VVCW081EHDH6S5W6JY9FD
(integer) 52
127.0.0.1:6379> ttl :__main__.Customer:01FY4VVCW133PPMVXH6HNERKXE
(integer) 46