introdução redis-lua, a implementação do princípio da

 

 

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;
    }

 

Publicado 15 artigos originais · ganhou elogios 21 · vê 30000 +

Acho que você gosta

Origin blog.csdn.net/q690080900/article/details/104944550
Recomendado
Clasificación