diff --git a/src/main/java/org/redisson/RedissonList.java b/src/main/java/org/redisson/RedissonList.java index 41d65037c..b5e367ebe 100644 --- a/src/main/java/org/redisson/RedissonList.java +++ b/src/main/java/org/redisson/RedissonList.java @@ -392,9 +392,15 @@ public class RedissonList extends RedissonExpirable implements RList { @Override public Future lastIndexOfAsync(Object o) { return commandExecutor.evalReadAsync(getName(), new RedisCommand("EVAL", new IntegerReplayConvertor(), 4), - "local s = redis.call('llen', KEYS[1]);" + - "for i = s, 0, -1 do if ARGV[1] == redis.call('lindex', KEYS[1], i) then return i end end;" + - "return -1", + "local key = KEYS[1] " + + "local obj = ARGV[1] " + + "local items = redis.call('lrange', key, 0, -1) " + + "for i = table.getn(items), 0, -1 do " + + "if items[i] == obj then " + + "return i - 1 " + + "end " + + "end " + + "return -1", Collections.singletonList(getName()), o); } diff --git a/src/test/java/org/redisson/RedissonListTest.java b/src/test/java/org/redisson/RedissonListTest.java index 9b3c9081d..37a473e73 100644 --- a/src/test/java/org/redisson/RedissonListTest.java +++ b/src/test/java/org/redisson/RedissonListTest.java @@ -11,7 +11,9 @@ import java.util.ListIterator; import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; +import org.redisson.core.RBatch; import org.redisson.core.RList; +import org.redisson.core.RListAsync; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.FutureListener; @@ -269,6 +271,18 @@ public class RedissonListTest extends BaseTest { Assert.assertFalse(iterator.hasPrevious()); } + @Test + public void testLastIndexOfNone() { + List list = redisson.getList("list"); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + + Assert.assertEquals(-1, list.lastIndexOf(10)); + } + @Test public void testLastIndexOf2() { List list = redisson.getList("list");