SoFunction
Updated on 2025-03-03

Analysis of the usage scenarios of Lua scripts in Redis

Lua scripts in Redis can be used in a variety of scenarios. Here are some common usage scenarios and their corresponding Java implementation examples.
By using Lua scripts, complex logical and atomic operations can be implemented in Redis, while using Java clients such as Spring Data Redis to facilitate execution of these scripts, improving performance and reducing network latency.

1. Atomic Count

Scenario: Increase the counter atomically.
Lua script:
local current = (‘INCR’, KEYS[1])
return current
Java implementation:

String luaScript = "local current = ('INCR', KEYS[1]) return current";
Long count = (Long) (new DefaultRedisScript<>(luaScript, ), 
                                          ("counter"));

2. Condition update

Scenario: Updated only if the current value is equal to a specific value.
Lua script:

local current = ('GET', KEYS[1])
if current == ARGV[1] then
    ('SET', KEYS[1], ARGV[2])
    return true
else
    return false
end
Java accomplish:
String luaScript = "local current = ('GET', KEYS[1]) " +
                   "if current == ARGV[1] then " +
                   "    ('SET', KEYS[1], ARGV[2]) return true " +
                   "else return false end";
Boolean updated = (Boolean) (new DefaultRedisScript&lt;&gt;(luaScript, ), 
                                                  ("key"), "oldValue", "newValue");

3. Transactional operations

Scenario: Get the value of a key and delete the key.
Lua script:

local value = ('GET', KEYS[1])
('DEL', KEYS[1])
return value
Java accomplish:
String luaScript = "local value = ('GET', KEYS[1]) " +
                   "('DEL', KEYS[1]) return value";
String value = (String) (new DefaultRedisScript&lt;&gt;(luaScript, ), 
                                             ("key"));

4. Distributed lock

Scenario: Ensure exclusive execution of an operation.
Lua script:

if ('SETNX', KEYS[1], ARGV[1]) == 1 then
    ('EXPIRE', KEYS[1], ARGV[2])
    return true
else
    return false
end
Java accomplish:
String luaScript = "if ('SETNX', KEYS[1], ARGV[1]) == 1 then " +
                   "    ('EXPIRE', KEYS[1], ARGV[2]) return true " +
                   "else return false end";
Boolean lockAcquired = (Boolean) (new DefaultRedisScript&lt;&gt;(luaScript, ), 
                                                     ("lockKey"), "lockValue", "10");

5. Batch processing

Scenario: Get the values ​​of multiple keys at once.
Lua script:

local result = {}
for i = 1, #KEYS do
    result[i] = ('GET', KEYS[i])
end
return result
Java accomplish:
String luaScript = "local result = {} " +
                   "for i = 1, #KEYS do " +
                   "    result[i] = ('GET', KEYS[i]) " +
                   "end return result";
List&lt;String&gt; values = (List&lt;String&gt;) (new DefaultRedisScript&lt;&gt;(luaScript, ), 
                                                          ("key1", "key2", "key3"));

6. Counter and Expiration Management

Scenario: Website access count and set expiration time.
Lua script:

local current = ('INCR', KEYS[1])
if current == 1 then
    ('EXPIRE', KEYS[1], ARGV[1])
end
return current
Java accomplish:
String luaScript = "local current = ('INCR', KEYS[1]) " +
                   "if current == 1 then " +
                   "    ('EXPIRE', KEYS[1], ARGV[1]) " +
                   "end return current";
Long visitCount = (Long) (new DefaultRedisScript&lt;&gt;(luaScript, ), 
                                              ("pageVisitCounter"), "60");

7. Conditional deletion

Scenario: Delete the key under certain conditions.
Lua script:

local current = ('GET', KEYS[1])
if current == ARGV[1] then
    ('DEL', KEYS[1])
    return true
else
    return false
end
Java accomplish:
String luaScript = "local current = ('GET', KEYS[1]) " +
                   "if current == ARGV[1] then " +
                   "    ('DEL', KEYS[1]) return true " +
                   "else return false end";
Boolean deleted = (Boolean) (new DefaultRedisScript&lt;&gt;(luaScript, ), 
                                                  ("key"), "valueToMatch");

8. Data aggregation

Scenario: Calculate the sum of multiple values.
Lua script:

local sum = 0
for i = 1, #KEYS do
    sum = sum + tonumber(('GET', KEYS[i]) or 0)
end
return sum
Java accomplish:
String luaScript = "local sum = 0 " +
                   "for i = 1, #KEYS do " +
                   "    sum = sum + tonumber(('GET', KEYS[i]) or 0) " +
                   "end return sum";
Long total = (Long) (new DefaultRedisScript&lt;&gt;(luaScript, ), 
                                          ("key1", "key2", "key3"));

This is the end of this article about the usage scenarios of Lua scripts in Redis. For more related Redis Lua script content, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!