diff --git a/lib/kredis/types/counter.rb b/lib/kredis/types/counter.rb index cacebb3..bcfcf62 100644 --- a/lib/kredis/types/counter.rb +++ b/lib/kredis/types/counter.rb @@ -4,16 +4,16 @@ class Kredis::Types::Counter < Kredis::Types::Proxying attr_accessor :expires_in def increment(by: 1) - multi do - set 0, ex: expires_in, nx: true - incrby by + multi do |pipeline| + pipeline.set 0, ex: expires_in, nx: true + pipeline.incrby by end[-1] end def decrement(by: 1) - multi do - set 0, ex: expires_in, nx: true - decrby by + multi do |pipeline| + pipeline.set 0, ex: expires_in, nx: true + pipeline.decrby by end[-1] end diff --git a/lib/kredis/types/list.rb b/lib/kredis/types/list.rb index cbda3bd..cc1867d 100644 --- a/lib/kredis/types/list.rb +++ b/lib/kredis/types/list.rb @@ -8,16 +8,16 @@ def elements end alias to_a elements - def remove(*elements) - types_to_strings(elements, typed).each { |element| lrem 0, element } + def remove(*elements, pipeline: nil) + types_to_strings(elements, typed).each { |element| (pipeline || proxy).lrem 0, element } end - def prepend(*elements) - lpush types_to_strings(elements, typed) if elements.flatten.any? + def prepend(*elements, pipeline: nil) + (pipeline || proxy).lpush types_to_strings(elements, typed) if elements.flatten.any? end - def append(*elements) - rpush types_to_strings(elements, typed) if elements.flatten.any? + def append(*elements, pipeline: nil) + (pipeline || proxy).rpush types_to_strings(elements, typed) if elements.flatten.any? end alias << append diff --git a/lib/kredis/types/proxy.rb b/lib/kredis/types/proxy.rb index 99033f2..172ff2f 100644 --- a/lib/kredis/types/proxy.rb +++ b/lib/kredis/types/proxy.rb @@ -9,8 +9,13 @@ def initialize(redis, key, **options) options.each { |key, value| send("#{key}=", value) } end - def multi(...) - redis.multi(...) + def multi(&block) + # NOTE: to be removed when Redis 4 compatibility gets dropped + return redis.multi unless block + + redis.multi do |pipeline| + block.call(Kredis::Types::Proxy.new(pipeline, key)) + end end def method_missing(method, *args, **kwargs) diff --git a/lib/kredis/types/set.rb b/lib/kredis/types/set.rb index 5f7a1e0..dcb79e1 100644 --- a/lib/kredis/types/set.rb +++ b/lib/kredis/types/set.rb @@ -8,19 +8,19 @@ def members end alias to_a members - def add(*members) - sadd types_to_strings(members, typed) if members.flatten.any? + def add(*members, pipeline: nil) + (pipeline || proxy).sadd types_to_strings(members, typed) if members.flatten.any? end alias << add - def remove(*members) - srem types_to_strings(members, typed) if members.flatten.any? + def remove(*members, pipeline: nil) + (pipeline || proxy).srem types_to_strings(members, typed) if members.flatten.any? end def replace(*members) - multi do - del - add members + multi do |pipeline| + pipeline.del + add members, pipeline: pipeline end end diff --git a/lib/kredis/types/unique_list.rb b/lib/kredis/types/unique_list.rb index eb4bbcc..ddbd57e 100644 --- a/lib/kredis/types/unique_list.rb +++ b/lib/kredis/types/unique_list.rb @@ -8,10 +8,10 @@ def prepend(elements) elements = Array(elements).uniq return if elements.empty? - multi do - remove elements + multi do |pipeline| + remove elements, pipeline: pipeline super - ltrim 0, (limit - 1) if limit + pipeline.ltrim 0, (limit - 1) if limit end end @@ -19,10 +19,10 @@ def append(elements) elements = Array(elements).uniq return if elements.empty? - multi do - remove elements + multi do |pipeline| + remove elements, pipeline: pipeline super - ltrim -limit, -1 if limit + pipeline.ltrim -limit, -1 if limit end end alias << append