diff --git a/local_examples/cmds_stream/ioredis/cmds-stream.js b/local_examples/cmds_stream/ioredis/cmds-stream.js index 7c6fd0a6e1..a49458f163 100644 --- a/local_examples/cmds_stream/ioredis/cmds-stream.js +++ b/local_examples/cmds_stream/ioredis/cmds-stream.js @@ -36,6 +36,32 @@ assert.deepEqual(res4[1][1], ['field1', 'value1', 'field2', 'value2', 'field3', await redis.del('mystream'); // REMOVE_END +// STEP_START xadd2 +const res5 = await redis.call('XADD', 'mystream', 'IDMP', 'producer1', 'msg1', '*', 'field', 'value'); +console.log(res5); // >>> 1726055713867-0 + +// Attempting to add the same message again with IDMP returns the original entry ID +const res6 = await redis.call('XADD', 'mystream', 'IDMP', 'producer1', 'msg1', '*', 'field', 'different_value'); +console.log(res6); // >>> 1726055713867-0 (same ID as res5, message was deduplicated) + +const res7 = await redis.call('XADD', 'mystream', 'IDMPAUTO', 'producer2', '*', 'field', 'value'); +console.log(res7); // >>> 1726055713867-1 + +// Auto-generated idempotent ID prevents duplicates for same producer+content +const res8 = await redis.call('XADD', 'mystream', 'IDMPAUTO', 'producer2', '*', 'field', 'value'); +console.log(res8); // >>> 1726055713867-1 (same ID as res7, duplicate detected) + +// Configure idempotent message processing settings +const res9 = await redis.call('XCFGSET', 'mystream', 'IDMP-DURATION', 300, 'IDMP-MAXSIZE', 1000); +console.log(res9); // >>> OK +// STEP_END + +// REMOVE_START +assert.equal(res5, res6); +assert.equal(res7, res8); +await redis.del('mystream'); +// REMOVE_END + // HIDE_START redis.disconnect(); // HIDE_END diff --git a/local_examples/cmds_stream/ruby/cmds_stream.rb b/local_examples/cmds_stream/ruby/cmds_stream.rb index 992839a09a..ef0dc8ad7d 100644 --- a/local_examples/cmds_stream/ruby/cmds_stream.rb +++ b/local_examples/cmds_stream/ruby/cmds_stream.rb @@ -38,5 +38,31 @@ def assert_equal(expected, actual) assert_equal({ 'name' => 'Sara', 'surname' => 'OConnor' }, res4[0][1]) assert_equal({ 'field1' => 'value1', 'field2' => 'value2', 'field3' => 'value3' }, res4[1][1]) r.del('mystream') +# REMOVE_END + +# STEP_START xadd2 +res5 = r.call('XADD', 'mystream', 'IDMP', 'producer1', 'msg1', '*', 'field', 'value') +puts res5 # >>> 1726055713867-0 + +# Attempting to add the same message again with IDMP returns the original entry ID +res6 = r.call('XADD', 'mystream', 'IDMP', 'producer1', 'msg1', '*', 'field', 'different_value') +puts res6 # >>> 1726055713867-0 (same ID as res5, message was deduplicated) + +res7 = r.call('XADD', 'mystream', 'IDMPAUTO', 'producer2', '*', 'field', 'value') +puts res7 # >>> 1726055713867-1 + +# Auto-generated idempotent ID prevents duplicates for same producer+content +res8 = r.call('XADD', 'mystream', 'IDMPAUTO', 'producer2', '*', 'field', 'value') +puts res8 # >>> 1726055713867-1 (same ID as res7, duplicate detected) + +# Configure idempotent message processing settings +res9 = r.call('XCFGSET', 'mystream', 'IDMP-DURATION', 300, 'IDMP-MAXSIZE', 1000) +puts res9 # >>> OK +# STEP_END + +# REMOVE_START +assert_equal(res5, res6) +assert_equal(res7, res8) +r.del('mystream') r.close # REMOVE_END