Redis を使用すると、ユーザーは Lua スクリプトを使用してカスタマイズされたスクリプトを作成し、Redis サーバー上で実行できます。 Lua は、シンプルさ、効率性、スケーラビリティという利点を備えた軽量のスクリプト言語です。 Redis では、Lua スクリプトをデータのフィルタリング、集計、並べ替えなどの複雑なデータ処理に使用でき、Redis サーバーのパフォーマンスも向上させることができます。
従来の Redis コマンド方式と比較して、Lua スクリプトには以下の利点があります:
(2) 削減ネットワーク遅延: 複数の Redis コマンドを 1 つの Lua スクリプトに統合し、クライアントとサーバー間のネットワーク対話を削減します。同時に、Redis サーバーはスクリプトの SHA1 値をサーバーにキャッシュできる EVALSHA コマンドも提供しており、次回同じスクリプトを実行するときは SHA1 値を渡すだけで済み、ネットワーク送信時間が短縮されます。
(2) アトミック操作: Lua スクリプトは、複数の Redis コマンドのアトミック性を確保し、同時実行の問題を回避できます。
(3) カスタム コマンド: Lua スクリプトを通じて、Redis コマンド セットを拡張し、カスタム コマンドを実装できます。
(1) 複雑なクエリ: 一部の複雑なクエリ要件については、Lua スクリプトを使用することで迅速に実装できます。ローカルで実行するため、クライアント側でのデータ処理の問題を回避できます。
(2) 計算ロジック: 計算ロジックが必要な一部のシナリオでは、対応する計算コマンドが Redis に提供されていない場合でも、Lua スクリプトを通じてカスタマイズされた計算ロジックを実装できます。
(3) トランザクション操作: Lua スクリプトは、一連の Redis コマンドのアトミック性を保証できるため、Redis 上でトランザクション操作を実装できます。
(4) リアルタイム統計: Lua スクリプトは、リアルタイム UV、PV、その他のデータの計算など、Redis 内のデータをリアルタイムでカウントできます。
Redis Lua スクリプトは EVAL コマンドまたは EVALSHA コマンドで実行できます。具体的な使用方法は以下のとおりです。 #
EVAL script numkeys key [key ...] arg [arg ...] EVALSHA sha1 numkeys key [key ...] arg [arg ...]
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
#コードで文字列定義を使用する
RedisTemplate で定義
# Redis数据库地址 spring.redis.host=127.0.0.1 # Redis端口 spring.redis.port=6379 # Redis密码(如果没有密码不用填写) spring.redis.password=
@Bean public RedisScript<Long> redisScript() { RedisScript<Long> redisScript = new DefaultRedisScript<>(); redisScript.setLocation(new ClassPathResource("lua/RedisCRUD.lua")); redisScript.setResultType(Long.class); return redisScript; }
@Service public class RedisServiceImpl implements RedisService { @Autowired private RedisTemplate<String, Object> redisTemplate; @Autowired private RedisScript<Long> redisScript; public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } public void delete(String key) { redisTemplate.delete(key); } public Boolean exists(String key) { return redisTemplate.hasKey(key); } public Long hset(String key, String field, Object value) { return redisTemplate.opsForHash().put(key, field, value); } public Object hget(String key, String field) { return redisTemplate.opsForHash().get(key, field); } public void hdelete(String key, String... fields) { redisTemplate.opsForHash().delete(key, fields); } public Boolean hexists(String key, String field) { return redisTemplate.opsForHash().hasKey(key, field); } public Long eval(String script, List<String> keys, List<Object> args) { return redisTemplate.execute(RedisScript.of(script), keys, args.toArray()); } public Long eval(List<String> keys, List<Object> args) { return redisTemplate.execute(redisScript, keys, args.toArray()); } }
-- set if KEYS[1] and ARGV[1] then redis.call('SET', KEYS[1], ARGV[1]) return 1 end -- get if KEYS[1] and not ARGV[1] then return redis.call('GET', KEYS[1]) end -- delete if KEYS[1] and not ARGV[1] then redis.call('DEL', KEYS[1]) return 1 end -- exists if KEYS[1] and not ARGV[1] then if redis.call('EXISTS', KEYS[1]) == 1 then return true else return false end end -- hset if KEYS[1] and ARGV[1] and ARGV[2] and ARGV[3] then redis.call('HSET', KEYS[1], ARGV[1], ARGV[2]) redis.call('EXPIRE', KEYS[1], ARGV[3]) return 1 end -- hget if KEYS[1] and ARGV[1] and not ARGV[2] then return redis.call('HGET', KEYS[1], ARGV[1]) end -- hdelete if KEYS[1] and ARGV[1] and not ARGV[2] then redis.call('HDEL', KEYS[1], ARGV[1]) return 1 end -- hexists if KEYS[1] and ARGV[1] and not ARGV[2] then if redis.call('HEXISTS', KEYS[1], ARGV[1]) == 1 then return true else return false end end
以上がRedisにおけるLuaスクリプトの実装方法と適用シナリオは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。