1、創建SpringBoot工程
使用idea自帶的Spring Initializr創建一個基本的SpringBoot工程。
2、修改POM文件
工程創建成功后,修改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>
3、添加所需配置
application.properties配置

# 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=true
RedisConfig配置文件

@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; } }
4、編寫代碼
編寫RedisUtil工具類

@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(); } } }
編寫Controller,便於從瀏覽器進行測試

@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; } }
5、啟動測試
啟動SpringBoot工程,打開瀏覽器進行測試
http://localhost:8080/testDistributedLock?name=jack&value=25
瀏覽器成功響應OK