summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorItamar Haber <itamar@redislabs.com>2018-10-15 21:24:31 +0300
committerRoey Prat <roey.prat@redislabs.com>2018-10-28 12:12:54 +0200
commitf5f9bef17dabcacd3efdd9229af6fe9701628788 (patch)
tree0413f2137293d6ae64baf8fd9b892f75f14729bc
parent2a15e07f1a8aec26d287ec31ed330f598a1fca00 (diff)
downloadredis-py-f5f9bef17dabcacd3efdd9229af6fe9701628788.tar.gz
Implements XTRIM
-rwxr-xr-xredis/client.py15
-rw-r--r--tests/test_commands.py16
2 files changed, 30 insertions, 1 deletions
diff --git a/redis/client.py b/redis/client.py
index 45b9879..136f36d 100755
--- a/redis/client.py
+++ b/redis/client.py
@@ -433,7 +433,7 @@ class StrictRedis(object):
'XINFO GROUPS': parse_xinfo_list
},
string_keys_to_dict(
- 'XACK XDEL',
+ 'XACK XDEL XTRIM',
int
),
string_keys_to_dict(
@@ -1973,6 +1973,19 @@ class StrictRedis(object):
"""
return self.execute_command('XDEL', name, *ids)
+ def xtrim(self, name, maxlen, approximate=True):
+ """
+ Trims old messages from a stream.
+ name: name of the stream.
+ maxlen: truncate old stream messages beyond this size
+ approximate: actual stream length may be slightly more than maxlen
+ """
+ pieces = ['MAXLEN']
+ if approximate:
+ pieces.append('~')
+ pieces.append(maxlen)
+ return self.execute_command('XTRIM', name, *pieces)
+
# SORTED SET COMMANDS
def zadd(self, name, *args, **kwargs):
"""
diff --git a/tests/test_commands.py b/tests/test_commands.py
index ab9c9c9..997d928 100644
--- a/tests/test_commands.py
+++ b/tests/test_commands.py
@@ -1756,6 +1756,22 @@ class TestStrictCommands(object):
assert sr.xdel(stream_name, 1, stamp) == 1
assert sr.xdel(stream_name, 1, stamp, 42) == 0
+ @skip_if_server_version_lt('5.0.0')
+ def test_strict_xtrim(self, sr):
+ stream_name = 'xtrim_test_stream'
+ sr.delete(stream_name)
+
+ assert sr.xtrim(stream_name, 1000) == 0
+
+ for i in range(300):
+ sr.xadd(stream_name, index=i)
+
+ assert sr.xtrim(stream_name, 1000, approximate=False) == 0
+ assert sr.xtrim(stream_name, 300) == 0
+ assert sr.xtrim(stream_name, 299) == 0
+ assert sr.xtrim(stream_name, 234) == 0
+ assert sr.xtrim(stream_name, 234, approximate=False) == 66
+
def test_strict_zadd(self, sr):
sr.zadd('a', 1.0, 'a1', 2.0, 'a2', a3=3.0)
assert sr.zrange('a', 0, -1, withscores=True) == \