redistemplateを使用してluaスクリプトを呼び出す簡単な適用シーン
1579 ワード
最近luaを学んで、主にredisあるいはnginxでいくつか開拓をしたいと思って、redisのデータ型は多くて、私達の業務の中の多くのシーンを処理することを助けることができて、Redis 2.6.0バージョンから、内蔵のLua解釈器を通じて、EVALコマンドを使ってLuaスクリプトに対して値を求めることができます.
redisのluaスクリプトへの呼び出しは原子的であるため、分散ロックを実装するようにluaで実装できる特殊なシーンもあります.
本編では主にredistemplateを用いてluaスクリプトを呼び出す簡単な応用シーンを記録し,luaスクリプトを記述してip制限速度を実現するで作成されたluaスクリプト
2.redistemplateを使用してスクリプトを呼び出す
3.ブロッカーを作成し、ipを取得し、そのサービスを注入してipに呼び出しを完了し、残りは自分の必要な論理を作成することができる.
redisのluaスクリプトへの呼び出しは原子的であるため、分散ロックを実装するようにluaで実装できる特殊なシーンもあります.
本編では主にredistemplateを用いてluaスクリプトを呼び出す簡単な応用シーンを記録し,luaスクリプトを記述してip制限速度を実現する
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に呼び出しを完了し、残りは自分の必要な論理を作成することができる.