Skip to content

Commit 044888c

Browse files
committed
Support UNLINK command interface for redis v4
1 parent ddf058b commit 044888c

File tree

4 files changed

+82
-0
lines changed

4 files changed

+82
-0
lines changed

lib/redis.rb

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

528+
# Unlink one or more keys.
529+
#
530+
# @param [String, Array<String>] keys
531+
# @return [Fixnum] number of keys that were unlinked
532+
def unlink(*keys)
533+
synchronize do |client|
534+
client.call([:unlink] + keys)
535+
end
536+
end
537+
528538
# Determine if a key exists.
529539
#
530540
# @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: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,38 @@ def test_del_with_array_argument
3838
assert_equal [], r.keys("*").sort
3939
end
4040

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

test/distributed_commands_on_value_types_test.rb

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

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

0 commit comments

Comments
 (0)