使用 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
我使用 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