Skip to content

Commit

Permalink
Merge pull request #172 from redis/add-expire-#171
Browse files Browse the repository at this point in the history
Add expire behavior
  • Loading branch information
Simon Prickett authored Mar 29, 2022
2 parents f024b39 + 93aa9f7 commit e35257c
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 0 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ print(andrew.pk)
# We can save the model to Redis by calling `save()`:
andrew.save()

# Expire the model after 2 mins (120 seconds)
andrew.expire(120)

# To retrieve this customer with its primary key, we use `Customer.get()`:
assert Customer.get(andrew.pk) == andrew
```
Expand Down
9 changes: 9 additions & 0 deletions aredis_om/model/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -1130,6 +1130,15 @@ async def update(self, **field_values):
async def save(self, pipeline: Optional[Pipeline] = None) -> "RedisModel":
raise NotImplementedError

async def expire(self, num_seconds: int, pipeline: Optional[Pipeline] = None):
if pipeline is None:
db = self.db()
else:
db = pipeline

# TODO: Wrap any Redis response errors in a custom exception?
await db.expire(self.make_primary_key(self.pk), num_seconds)

@validator("pk", always=True, allow_reuse=True)
def validate_pk(cls, v):
if not v:
Expand Down
9 changes: 9 additions & 0 deletions docs/getting_started.md
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,15 @@ andrew = Customer(
andrew.save()
```

## Expiring Models

We can expire an instance of a model using `expire`, and passing it the number of seconds after which we want the instance to expire in Redis:

```python
# Expire Andrew in 2 minutes (120 seconds)
andrew.expire(120)
```

## Examining Your Data In Redis

You can view the data stored in Redis for any Redis OM model.
Expand Down
18 changes: 18 additions & 0 deletions tests/test_hash_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,24 @@ async def test_delete(m):
assert response == 1


@pytest.mark.asyncio
async def test_expire(m):
member = m.Member(
first_name="Expire",
last_name="Test",
email="[email protected]",
join_date=today,
age=93,
bio="This is a test user for expiry",
)

await member.save()
await member.expire(60)

ttl = await m.Member.db().ttl(member.key())
assert ttl > 0


def test_raises_error_with_embedded_models(m):
class Address(m.BaseHashModel):
address_line_1: str
Expand Down

0 comments on commit e35257c

Please sign in to comment.