Skip to content

Commit e4d8c49

Browse files
authored
Merge pull request #766 from ksss/unlink
Support UNLINK command interface for redis v4
2 parents 8b01ab6 + bcb42b3 commit e4d8c49

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed

lib/redis.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,16 @@ def del(*keys)
527527
end
528528
end
529529

530+
# Unlink one or more keys.
531+
#
532+
# @param [String, Array<String>] keys
533+
# @return [Fixnum] number of keys that were unlinked
534+
def unlink(*keys)
535+
synchronize do |client|
536+
client.call([:unlink] + keys)
537+
end
538+
end
539+
530540
# Determine if a key exists.
531541
#
532542
# @param [String] key

lib/redis/distributed.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,14 @@ def del(*args)
161161
end
162162
end
163163

164+
# Unlink keys.
165+
def unlink(*args)
166+
keys_per_node = args.group_by { |key| node_for(key) }
167+
keys_per_node.inject(0) do |sum, (node, keys)|
168+
sum + node.unlink(*keys)
169+
end
170+
end
171+
164172
# Determine if a key exists.
165173
def exists(key)
166174
node_for(key).exists(key)

test/commands_on_value_types_test.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,42 @@ def test_del_with_array_argument
3838
assert_equal [], r.keys("*").sort
3939
end
4040

41+
def test_unlink
42+
target_version "4.0.0" do
43+
r.set "foo", "s1"
44+
r.set "bar", "s2"
45+
r.set "baz", "s3"
46+
47+
assert_equal ["bar", "baz", "foo"], r.keys("*").sort
48+
49+
assert_equal 1, r.unlink("foo")
50+
51+
assert_equal ["bar", "baz"], r.keys("*").sort
52+
53+
assert_equal 2, r.unlink("bar", "baz")
54+
55+
assert_equal [], r.keys("*").sort
56+
end
57+
end
58+
59+
def test_unlink_with_array_argument
60+
target_version "4.0.0" do
61+
r.set "foo", "s1"
62+
r.set "bar", "s2"
63+
r.set "baz", "s3"
64+
65+
assert_equal ["bar", "baz", "foo"], r.keys("*").sort
66+
67+
assert_equal 1, r.unlink(["foo"])
68+
69+
assert_equal ["bar", "baz"], r.keys("*").sort
70+
71+
assert_equal 2, r.unlink(["bar", "baz"])
72+
73+
assert_equal [], r.keys("*").sort
74+
end
75+
end
76+
4177
def test_randomkey
4278
assert r.randomkey.to_s.empty?
4379

test/distributed_commands_on_value_types_test.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,42 @@ def test_del_with_array_argument
3838
assert_equal [], r.keys("*").sort
3939
end
4040

41+
def test_unlink
42+
target_version "4.0.0" do
43+
r.set "foo", "s1"
44+
r.set "bar", "s2"
45+
r.set "baz", "s3"
46+
47+
assert_equal ["bar", "baz", "foo"], r.keys("*").sort
48+
49+
assert_equal 1, r.unlink("foo")
50+
51+
assert_equal ["bar", "baz"], r.keys("*").sort
52+
53+
assert_equal 2, r.unlink("bar", "baz")
54+
55+
assert_equal [], r.keys("*").sort
56+
end
57+
end
58+
59+
def test_unlink_with_array_argument
60+
target_version "4.0.0" do
61+
r.set "foo", "s1"
62+
r.set "bar", "s2"
63+
r.set "baz", "s3"
64+
65+
assert_equal ["bar", "baz", "foo"], r.keys("*").sort
66+
67+
assert_equal 1, r.unlink(["foo"])
68+
69+
assert_equal ["bar", "baz"], r.keys("*").sort
70+
71+
assert_equal 2, r.unlink(["bar", "baz"])
72+
73+
assert_equal [], r.keys("*").sort
74+
end
75+
end
76+
4177
def test_randomkey
4278
assert_raise Redis::Distributed::CannotDistribute do
4379
r.randomkey

0 commit comments

Comments
 (0)