redistemplateを使用してluaスクリプトを呼び出す簡単な適用シーン

1579 ワード

最近luaを学んで、主にredisあるいはnginxでいくつか開拓をしたいと思って、redisのデータ型は多くて、私達の業務の中の多くのシーンを処理することを助けることができて、Redis 2.6.0バージョンから、内蔵のLua解釈器を通じて、EVALコマンドを使ってLuaスクリプトに対して値を求めることができます.
redisのluaスクリプトへの呼び出しは原子的であるため、分散ロックを実装するようにluaで実装できる特殊なシーンもあります.
本編では主にredistemplateを用いてluaスクリプトを呼び出す簡単な応用シーンを記録し,luaスクリプトを記述してip制限速度を実現する
  • で作成されたluaスクリプト
  • local count = redis.call('incr',KEYS[1])
    if count == 1 then
      redis.call('expire',KEYS[1],ARGV[1])
    end
    
    if count > tonumber(ARGV[2]) then
      return 0
    end
    
    return 1
       ipをkeyとして入力し、それをカウント+1し、私たちが入力した制限回数(ARGV[2])を超えると0を返し、そうでないと1を返します.
        2.redistemplateを使用してスクリプトを呼び出す
    @Service("ipAccessService")
    public class IpAccessService {
    
    	 @Autowired
    	 private RedisTemplate redisTemplate;
    	 private DefaultRedisScript script;
    	 private static final String IPACCESS_KEY_PREX = "ipaccess_";
    	 
    	 @PostConstruct
    	 private void init(){
    		script = new DefaultRedisScript();
    		script.setResultType(Long.class);
    		script.setScriptSource(new ResourceScriptSource(new 
     ClassPathResource("ipaccess.lua")));
         }
    
    	 public boolean exec(String ip) {
    		 List keys = new ArrayList<>();
    		 keys.add(IPACCESS_KEY_PREX + ip);
    		 return redisTemplate.execute(script, keys, 10, 20) == 1 ? true : false;
    	 }
    }
    呼び出しは主にredistempalteパッケージのexecuteを使用して実現され、2番目のパラメータはluaスクリプトのKEYS[1]、その後は可変パラメータであり、可変パラメータは我々が必要とする値に伝達され、それぞれARGV[1]、ARGV[2]に対応する.
       3.ブロッカーを作成し、ipを取得し、そのサービスを注入してipに呼び出しを完了し、残りは自分の必要な論理を作成することができる.