MLXY 2020-06-09
使用idea自带的Spring Initializr创建一个基本的SpringBoot工程。
工程创建成功后,修改pom文件,添加所需的jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</scope> </dependency>View Code
# Redis服务器地址 redis.host=127.0.0.1 # Redis服务器连接端口 redis.port=6379 # Redis服务器连接密码(默认为空) redis.password=null redis.timeout=30000 # 连接池最大连接数(使用负值表示没有限制) redis.maxTotal=30 # 连接池中的最大空闲连接 redis.maxIdle=10 redis.numTestsPerEvictionRun=1024 redis.timeBetweenEvictionRunsMillis=30000 redis.minEvictableIdleTimeMillis=1800000 redis.softMinEvictableIdleTimeMillis=10000 # 连接池最大阻塞等待时间(使用负值表示没有限制) redis.maxWaitMillis=1500 redis.testOnBorrow=true redis.testWhileIdle=true redis.blockWhenExhausted=false redis.JmxEnabled=trueView Code
@Configuration @PropertySource("classpath:application.properties") public class RedisConfig { @Value("${redis.host}") private String host; @Value("${redis.port}") private int port; @Value("${redis.timeout}") private int timeout; @Value("${redis.maxIdle}") private int maxIdle; @Value("${redis.maxWaitMillis}") private int maxWaitMillis; @Value("${redis.blockWhenExhausted}") private Boolean blockWhenExhausted; @Value("${redis.JmxEnabled}") private Boolean JmxEnabled; @Bean public JedisPool jedisPoolFactory() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); // 连接耗尽时是否阻塞, false报异常,true阻塞直到超时, 默认true jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted); // 是否启用pool的jmx管理功能, 默认true jedisPoolConfig.setJmxEnabled(JmxEnabled); JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout); return jedisPool; } }View Code
@Component public class RedisUtil { @Autowired private JedisPool jedisPool; /** * 向Redis中存值,永久有效 */ public String set(String key, String value) { Jedis jedis = null; try { jedis = jedisPool.getResource(); return jedis.set(key, value); } catch (Exception e) { return "0"; } finally { jedis.close(); } } /** * 根据传入Key获取指定Value */ public String get(String key) { Jedis jedis = null; String value; try { jedis = jedisPool.getResource(); value = jedis.get(key); } catch (Exception e) { return "0"; } finally { jedis.close(); } return value; } /** * 校验Key值是否存在 */ public Boolean exists(String key) { Jedis jedis = null; try { jedis = jedisPool.getResource(); return jedis.exists(key); } catch (Exception e) { return false; } finally { jedis.close(); } } /** * 删除指定Key-Value */ public Long del(String key) { Jedis jedis = null; try { jedis = jedisPool.getResource(); return jedis.del(key); } catch (Exception e) { return 0L; } finally { jedis.close(); } } /** * 分布式锁 * @param key * @param value * @param time 锁的超时时间,单位:秒 * * @return 获取锁成功返回"OK",失败返回null */ public String getDistributedLock(String key,String value,int time){ Jedis jedis = null; String ret = ""; try { jedis = jedisPool.getResource(); ret = jedis.set(key, value, new SetParams().nx().ex(time)); return ret; } catch (Exception e) { return null; } finally { jedis.close(); } } }View Code
@RestController @Slf4j public class RedisController { @Autowired private RedisUtil redisUtil; @RequestMapping("/testDistributedLock") public String testSetIfNotExists(@RequestParam("name") String name, @RequestParam("value") int age){ log.info("******testSetIfNotExists******"); int time = 10;//超时时间写死为10秒 String ageStr = String.valueOf(age); String s = redisUtil.getDistributedLock(name, ageStr, time); log.info("******s是否为null:" + (s == null)); log.info("******s=" + s); return s; } }View Code
http://localhost:8080/testDistributedLock?name=jack&value=25
浏览器成功响应OK
Redis哨兵模式是Redis高可用方案的一种实现方式,通过哨兵来自动实现故障转移,从而保证高可用。-- lettuce客户端需要使用到 -->. application.yml哨兵模式配置属性示例。