comandos 1.redis-lua relacionados
# Lua de execução de script EVAL chave numkeys de script [key ...] arg [arg ...] EVALSHA chave numkeys SHA1 [key ...] arg [arg ...] # Verifique se o script especificado que foi armazenada em cache. Script existe roteiro [script ...] # Remova todos os scripts a partir do cache script. SCRIPT FLUSH # Kill Lua script atualmente em execução SCRIPT MATANÇA # Lua script para adicionar uma memória script de carregamento SCRIPT
2.redis executar Lua maneira
# 1.redis executar o script será carregado na memória EVAL chave numkeys de script [key ...] arg [arg ...] EVALSHA chave numkeys SHA1 [key ...] arg [arg ...] # 2. execução do script local não será carregado na memória Redis-cli --eval test.lua aaa, bbb
3. Implementação do princípio da Lua
valor SHA1 é calculado de acordo com um script Lua Se houver sha1 Redis memória para a memória uso # Redis ver se a carga ao longo de um script Lua Script existe sha1 值
4. prova
roteiro calculado lua valor SHA1
package plantomjs;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author
* @since 2020—01-09
*/
public class PlanTomJs {
public static void main(String[] args) throws NoSuchAlgorithmException {
//lua 脚本
String lua =
"local getnum = function( count )\n"
+ "\tif count == false then\n"
+ "\t\treturn 0 ;\n"
+ "\telse\t\n"
+ "\t\treturn count ; \n"
+ "\tend\n"
+ "\treturn 0 ;\n"
+ "end\t\n"
+ "local plan = KEYS[1] ;\n"
+ "local result = redis.call('get', KEYS[2] );\n"
+ "local keywordPlan = KEYS[3] ;\n"
+ "local keywordResult = redis.call('get', KEYS[4] ) ;\n"
+ "\n"
+ "if tonumber(getnum(plan)) > tonumber(getnum(result)) and tonumber(getnum(keywordPlan)) > tonumber(getnum(keywordResult)) then\n"
+ " \tredis.call('incrby', KEYS[2] , 1 );\n"
+ " \tredis.call('incrby', KEYS[4] , 1 );\n"
+ " \tredis.call('expire', KEYS[2] , 60*60*24 );\n"
+ " \tredis.call('expire', KEYS[4] , 60*60*24 );\n"
+ " \treturn '1';\n"
+ " else\n"
+ " \treturn '0';\n"
+ " end\t\t\n"
+ "\n";
System.out.println(getSha1(lua.getBytes()));
}
public static String getSha1(byte[] input) throws NoSuchAlgorithmException {
MessageDigest mDigest = MessageDigest.getInstance("SHA1");
byte[] result = mDigest.digest(input);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < result.length; i++) {
sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
SHA1 valor 8f8b5c2314b53cd128e2ead7b9e5d42f5f1eabe8
Indicando a memória Redis presença
5. Ver Redis configuração -lua
#Lua tamanho da memória do motor utilizado (em bytes) used_memory_lua: 46080 # Ibid. used_memory_lua_human: 45.00K scripts de #Lua ocupam tamanho da memória used_memory_scripts: 53784 used_memory_scripts_human: 52.52K Número # Lua roteiro carregado na memória number_of_cached_scripts: 95
Use Redis-lua roteiro (-dados primavera-Redis) 6. Projecto em
private boolean ipLuaCheckCount(String ip, App app) {
String lua = "\n"
+ "local result = redis.call('hget', KEYS[1] , ARGV[1])\n"
+ "if result == false then \n"
+ "\tresult = 0 ;\n"
+ "end\n"
+ "local num = KEYS[2] \n"
+ "if tonumber(result) < tonumber(num) then\n"
+ "\tredis.call('hincrby', KEYS[1] ,ARGV[1] , 1 )\n"
+ "\tredis.call('expire', KEYS[1] , 60*60*24 )\n"
+ "\treturn '1' ;\n"
+ "else \n"
+ "\treturn '0' ; \n"
+ "end\n"
+ "\n";
DefaultRedisScript<String> rs = new DefaultRedisScript<>();
//设置脚本
rs.setScriptText(lua);
//定义返回类型。注意如果没有这个定义,spring不会返回结果
rs.setResultType(String.class);
RedisSerializer valueSerializer = jsonRedisTemplate.getValueSerializer();
RedisSerializer stringSerializer = jsonRedisTemplate.getStringSerializer();
List<String> keyList = new ArrayList<>();
keyList.add(RedisKeys.ipMonitorResult(app.getId()));
keyList.add(Objects.nonNull(app.getIpMonitorCount()) ? String.valueOf(app.getIpMonitorCount()) : String.valueOf(3));
List<String> valsList = new ArrayList<>();
valsList.add(ip);
String restult = redisTemplate.execute(rs, valueSerializer, stringSerializer, keyList, valsList.toArray());
if ("0".equals(restult)) {
throw new ConnectException(ConnectExceptionEnum.IP_TASK_BE_ALREADY_FULL);
}
return true;
}