用RedisTemplate调用RedisScript
maven依赖spring-boot-starter-data-redis和jedis
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</exclusion>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
配置文件
application.yml
spring:
redis:
database: 0
host: 127.0.0.1
port: 6379
jedis:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
timeout: 2000ms
server:
port: 9000
checkandset.lua脚本
local current = redis.call('GET', KEYS[1])
if current == ARGV[1]
then redis.call('SET', KEYS[1], ARGV[2])
return true
end
return false
配置客户端和脚本
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory ) {
//设置序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置redisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer); // key序列化
redisTemplate.setValueSerializer(stringSerializer); // value序列化
redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化
redisTemplate.setHashValueSerializer(stringSerializer); // Hash value序列化
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@Bean
public DefaultRedisScript<Boolean> redisScript() {
DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/checkandset.lua")));
redisScript.setResultType(Boolean.class);
return redisScript;
}
}
调用
@RestController
public class RedisController {
//虽然配置bean泛型是<String, Object>,但是可以注入<String, String>
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private DefaultRedisScript<Boolean> redisScript;
@RequestMapping("redis")
public String getKey() {
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
String visitCount_redis = "visitCount_redis";
Boolean flag = valueOperations.setIfAbsent(visitCount_redis, "1", 10, TimeUnit.SECONDS);
if (flag) {
System.out.println("第一次访问");
} else {
valueOperations.increment(visitCount_redis);
}
String s = valueOperations.get(visitCount_redis);
int i = Integer.valueOf(s);
if (i > 10) {
return "此接口十秒内访问超过10次,请稍后访问";
}
return s;
}
@RequestMapping("/redisTest")
public void redisTest(){
ListOperations<String, String> listOperations = redisTemplate.opsForList();
listOperations.leftPushAll("l1", "a1", "a2");
listOperations.leftPushAll("l2", "v1", "v2");
BoundListOperations<String, String> boundListOperations = redisTemplate.boundListOps("l2");
String o = boundListOperations.rightPop();
System.out.println(o);
}
//http://localhost:9000/luaTest
@RequestMapping("/luaTest")
public String luaTest(){
String key = "testredislua";
redisTemplate.delete(key);
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
String hahaha = "hahaha";
valueOperations.set(key, hahaha);
String s = valueOperations.get(key);
System.out.println(s);
redisTemplate.execute(redisScript, Collections.singletonList(key), hahaha, "3333");
String s1 = valueOperations.get(key);
System.out.println(s1);
return null;
}
}
项目https://github.com/mingwulipo/redis-demo