Skip to content

Commit 73bf749

Browse files
committed
Merge pull request #766 from ksss/unlink
Support UNLINK command interface for redis v4
1 parent bc80cb1 commit 73bf749

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
@@ -524,6 +524,16 @@ def del(*keys)
524524
end
525525
end
526526

527+
# Unlink one or more keys.
528+
#
529+
# @param [String, Array<String>] keys
530+
# @return [Fixnum] number of keys that were unlinked
531+
def unlink(*keys)
532+
synchronize do |client|
533+
client.call([:unlink] + keys)
534+
end
535+
end
536+
527537
# Determine if a key exists.
528538
#
529539
# @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)