Skip to content

Commit de9922a

Browse files
Adding EXAT and PXAT (unix time support) support for SET (#1547)
* set in unix time * update skip version
1 parent efdba1a commit de9922a

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

redis/commands.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,7 +1014,8 @@ def restore(self, name, ttl, value, replace=False, absttl=False):
10141014
return self.execute_command('RESTORE', *params)
10151015

10161016
def set(self, name, value,
1017-
ex=None, px=None, nx=False, xx=False, keepttl=False, get=False):
1017+
ex=None, px=None, nx=False, xx=False, keepttl=False, get=False,
1018+
exat=None, pxat=None):
10181019
"""
10191020
Set the value at key ``name`` to ``value``
10201021
@@ -1034,6 +1035,12 @@ def set(self, name, value,
10341035
``get`` if True, set the value at key ``name`` to ``value`` and return
10351036
the old value stored at key, or None when key did not exist.
10361037
(Available since Redis 6.2)
1038+
1039+
``exat`` sets an expire flag on key ``name`` for ``ex`` seconds,
1040+
specified in unix time.
1041+
1042+
``pxat`` sets an expire flag on key ``name`` for ``ex`` milliseconds,
1043+
specified in unix time.
10371044
"""
10381045
pieces = [name, value]
10391046
options = {}
@@ -1047,15 +1054,26 @@ def set(self, name, value,
10471054
if isinstance(px, datetime.timedelta):
10481055
px = int(px.total_seconds() * 1000)
10491056
pieces.append(px)
1057+
if exat is not None:
1058+
pieces.append('EXAT')
1059+
if isinstance(exat, datetime.datetime):
1060+
s = int(exat.microsecond / 1000000)
1061+
exat = int(time.mktime(exat.timetuple())) + s
1062+
pieces.append(exat)
1063+
if pxat is not None:
1064+
pieces.append('PXAT')
1065+
if isinstance(pxat, datetime.datetime):
1066+
ms = int(pxat.microsecond / 1000)
1067+
pxat = int(time.mktime(pxat.timetuple())) * 1000 + ms
1068+
pieces.append(pxat)
1069+
if keepttl:
1070+
pieces.append('KEEPTTL')
10501071

10511072
if nx:
10521073
pieces.append('NX')
10531074
if xx:
10541075
pieces.append('XX')
10551076

1056-
if keepttl:
1057-
pieces.append('KEEPTTL')
1058-
10591077
if get:
10601078
pieces.append('GET')
10611079
options["get"] = True

tests/test_commands.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,18 @@ def test_set_ex_timedelta(self, r):
10401040
assert r.set('a', '1', ex=expire_at)
10411041
assert 0 < r.ttl('a') <= 60
10421042

1043+
@skip_if_server_version_lt('6.2.0')
1044+
def test_set_exat_timedelta(self, r):
1045+
expire_at = redis_server_time(r) + datetime.timedelta(seconds=10)
1046+
assert r.set('a', '1', exat=expire_at)
1047+
assert 0 < r.ttl('a') <= 10
1048+
1049+
@skip_if_server_version_lt('6.2.0')
1050+
def test_set_pxat_timedelta(self, r):
1051+
expire_at = redis_server_time(r) + datetime.timedelta(seconds=10)
1052+
assert r.set('a', '1', pxat=expire_at)
1053+
assert 0 < r.ttl('a') <= 10
1054+
10431055
@skip_if_server_version_lt('2.6.0')
10441056
def test_set_multipleoptions(self, r):
10451057
r['a'] = 'val'

0 commit comments

Comments
 (0)