当前位置:   article > 正文

spring boot中集成jedis操作redis_spring.redis.pool.testonborrow

spring.redis.pool.testonborrow

1:添加maven依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-redis</artifactId>
  4. <version>1.4.7.RELEASE</version>
  5. </dependency>

2:在application.yml中配置redis的连接参数

  1. spring:
  2. redis:
  3. database: 0
  4. hostName: 127.0.0.1
  5. port: 6379
  6. timeout: 0
  7. password:
  8. pool:
  9. maxTotal: 200
  10. maxWaitMillis: 10000
  11. maxIdle: 50
  12. minIdle: 10
  13. testOnBorrow: true

3:创建redis的配置类RedisConfig.java 

  1. @Configuration
  2. @EnableCaching
  3. public class RedisConfig extends CachingConfigurerSupport {
  4. @Value("${spring.redis.database}")
  5. private int database;
  6. @Value("${spring.redis.hostName}")
  7. private String hostName;
  8. @Value("${spring.redis.port}")
  9. private int port;
  10. @Value("${spring.redis.password}")
  11. private String password;
  12. @Value("${spring.redis.timeout}")
  13. private int timeout;
  14. @Value("${spring.redis.pool.maxIdle}")
  15. private int maxIdle;
  16. @Value("${spring.redis.pool.minIdle}")
  17. private int minIdle;
  18. @Value("${spring.redis.pool.maxTotal}")
  19. private int maxTotal;
  20. @Value("${spring.redis.pool.maxWaitMillis}")
  21. private long maxWaitMillis;
  22. @Value("${spring.redis.pool.testOnBorrow}")
  23. private boolean testOnBorrow;
  24. public JedisPoolConfig poolCofig(int maxIdle, int maxTotal,
  25. long maxWaitMillis, boolean testOnBorrow) {
  26. JedisPoolConfig poolCofig = new JedisPoolConfig();
  27. poolCofig.setMaxIdle(maxIdle);
  28. poolCofig.setMaxIdle(minIdle);
  29. poolCofig.setMaxTotal(maxTotal);
  30. poolCofig.setMaxWaitMillis(maxWaitMillis);
  31. poolCofig.setTestOnBorrow(testOnBorrow);
  32. return poolCofig;
  33. }
  34. @Bean
  35. public JedisConnectionFactory redisConnectionFactory() {
  36. JedisConnectionFactory factory = new JedisConnectionFactory();
  37. factory.setDatabase(database);
  38. factory.setHostName(hostName);
  39. factory.setPort(port);
  40. factory.setPassword(password);
  41. factory.setTimeout(timeout);
  42. factory.setPoolConfig(poolCofig(maxIdle, maxTotal, maxWaitMillis, testOnBorrow));
  43. // 初始化连接pool
  44. factory.afterPropertiesSet();
  45. return factory;
  46. }
  47. @Bean
  48. @Override
  49. public KeyGenerator keyGenerator() {
  50. return (target, method, objects) -> {
  51. StringBuilder sb = new StringBuilder();
  52. sb.append(target.getClass().getName());
  53. sb.append("::" + method.getName() + ":");
  54. for (Object obj : objects) {
  55. sb.append(obj.toString());
  56. }
  57. return sb.toString();
  58. };
  59. }
  60. // @Bean
  61. // public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
  62. // return new RedisCacheManager(redisTemplate);
  63. // }
  64. @Bean
  65. public RedisTemplate<String, String> redisTemplate(
  66. RedisConnectionFactory factory) {
  67. StringRedisTemplate template = new StringRedisTemplate(factory);
  68. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  69. ObjectMapper om = new ObjectMapper();
  70. //om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  71. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  72. jackson2JsonRedisSerializer.setObjectMapper(om);
  73. template.setValueSerializer(jackson2JsonRedisSerializer);
  74. template.afterPropertiesSet();
  75. return template;
  76. }
  77. @Bean
  78. public JedisPool getJedisPool(){
  79. JedisPoolConfig config = new JedisPoolConfig();
  80. config.setMaxTotal(maxTotal);
  81. config.setMaxIdle(maxIdle);
  82. config.setMinIdle(minIdle);
  83. config.setTestOnBorrow(testOnBorrow);
  84. config.setTestOnReturn(false);
  85. config.setBlockWhenExhausted(true);
  86. config.setMaxWaitMillis(maxWaitMillis);
  87. JedisPool pool = new JedisPool(config,hostName,port,timeout,password);
  88. return pool;
  89. }
  90. }

4:创建redis操作服务类RedisService.java

  1. @Component
  2. public class RedisService {
  3. @Autowired
  4. private RedisTemplate redisTemplate;
  5. @Autowired
  6. private JedisPool jedisPool;
  7. public Jedis getResource() {
  8. return jedisPool.getResource();
  9. }
  10. public void returnResource(Jedis jedis) {
  11. if (jedis != null) {
  12. jedisPool.returnResourceObject(jedis);
  13. }
  14. }
  15. //=============================common============================
  16. /**
  17. * 指定缓存失效时间
  18. *
  19. * @param key 键
  20. * @param time 时间(秒)
  21. * @return
  22. */
  23. public boolean expire(String key, long time) {
  24. try {
  25. if (time > 0) {
  26. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  27. }
  28. return true;
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. return false;
  32. }
  33. }
  34. /**
  35. * 根据key 获取过期时间
  36. *
  37. * @param key 键 不能为null
  38. * @return 时间(秒) 返回0代表为永久有效
  39. */
  40. public long getExpire(String key) {
  41. return redisTemplate.getExpire(key, TimeUnit.SECONDS);
  42. }
  43. /**
  44. * 判断key是否存在
  45. *
  46. * @param key 键
  47. * @return true 存在 false不存在
  48. */
  49. public boolean hasKey(String key) {
  50. try {
  51. return redisTemplate.hasKey(key);
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. return false;
  55. }
  56. }
  57. /**
  58. * 删除缓存
  59. *
  60. * @param key 可以传一个值 或多个
  61. */
  62. @SuppressWarnings("unchecked")
  63. public void del(String... key) {
  64. if (key != null && key.length > 0) {
  65. if (key.length == 1) {
  66. redisTemplate.delete(key[0]);
  67. } else {
  68. redisTemplate.delete(CollectionUtils.arrayToList(key));
  69. }
  70. }
  71. }
  72. //============================String=============================
  73. /**
  74. * 普通缓存获取
  75. *
  76. * @param key 键
  77. * @return 值
  78. */
  79. public Object get(String key) {
  80. return key == null ? null : redisTemplate.opsForValue().get(key);
  81. }
  82. /**
  83. * 普通缓存放入
  84. *
  85. * @param key 键
  86. * @param value 值
  87. * @return true成功 false失败
  88. */
  89. public boolean set(String key, Object value) {
  90. try {
  91. redisTemplate.opsForValue().set(key, value);
  92. return true;
  93. } catch (Exception e) {
  94. e.printStackTrace();
  95. return false;
  96. }
  97. }
  98. /**
  99. * 普通缓存放入并设置时间
  100. *
  101. * @param key 键
  102. * @param value 值
  103. * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
  104. * @return true成功 false 失败
  105. */
  106. public boolean set(String key, Object value, long time) {
  107. try {
  108. if (time > 0) {
  109. redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
  110. } else {
  111. set(key, value);
  112. }
  113. return true;
  114. } catch (Exception e) {
  115. e.printStackTrace();
  116. return false;
  117. }
  118. }
  119. /**
  120. * 递增
  121. *
  122. * @param key 键
  123. * @param delta 要增加几(大于0)
  124. * @return
  125. */
  126. public long incr(String key, long delta) {
  127. if (delta < 0) {
  128. throw new RuntimeException("递增因子必须大于0");
  129. }
  130. return redisTemplate.opsForValue().increment(key, delta);
  131. }
  132. /**
  133. * 递减
  134. *
  135. * @param key 键
  136. * @param delta 要减少几(小于0)
  137. * @return
  138. */
  139. public long decr(String key, long delta) {
  140. if (delta < 0) {
  141. throw new RuntimeException("递减因子必须大于0");
  142. }
  143. return redisTemplate.opsForValue().increment(key, -delta);
  144. }
  145. //================================Map=================================
  146. /**
  147. * HashGet
  148. *
  149. * @param key 键 不能为null
  150. * @param item 项 不能为null
  151. * @return 值
  152. */
  153. public Object hget(String key, String item) {
  154. return redisTemplate.opsForHash().get(key, item);
  155. }
  156. /**
  157. * 获取hashKey对应的所有键值
  158. *
  159. * @param key 键
  160. * @return 对应的多个键值
  161. */
  162. public Map<Object, Object> hmget(String key) {
  163. return redisTemplate.opsForHash().entries(key);
  164. }
  165. /**
  166. * HashSet
  167. *
  168. * @param key 键
  169. * @param map 对应多个键值
  170. * @return true 成功 false 失败
  171. */
  172. public boolean hmset(String key, Map<String, Object> map) {
  173. try {
  174. redisTemplate.opsForHash().putAll(key, map);
  175. return true;
  176. } catch (Exception e) {
  177. e.printStackTrace();
  178. return false;
  179. }
  180. }
  181. /**
  182. * HashSet 并设置时间
  183. *
  184. * @param key 键
  185. * @param map 对应多个键值
  186. * @param time 时间(秒)
  187. * @return true成功 false失败
  188. */
  189. public boolean hmset(String key, Map<String, Object> map, long time) {
  190. try {
  191. redisTemplate.opsForHash().putAll(key, map);
  192. if (time > 0) {
  193. expire(key, time);
  194. }
  195. return true;
  196. } catch (Exception e) {
  197. e.printStackTrace();
  198. return false;
  199. }
  200. }
  201. /**
  202. * 向一张hash表中放入数据,如果不存在将创建
  203. *
  204. * @param key 键
  205. * @param item 项
  206. * @param value 值
  207. * @return true 成功 false失败
  208. */
  209. public boolean hset(String key, String item, Object value) {
  210. try {
  211. redisTemplate.opsForHash().put(key, item, value);
  212. return true;
  213. } catch (Exception e) {
  214. e.printStackTrace();
  215. return false;
  216. }
  217. }
  218. /**
  219. * 向一张hash表中放入数据,如果不存在将创建
  220. *
  221. * @param key 键
  222. * @param item 项
  223. * @param value 值
  224. * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
  225. * @return true 成功 false失败
  226. */
  227. public boolean hset(String key, String item, Object value, long time) {
  228. try {
  229. redisTemplate.opsForHash().put(key, item, value);
  230. if (time > 0) {
  231. expire(key, time);
  232. }
  233. return true;
  234. } catch (Exception e) {
  235. e.printStackTrace();
  236. return false;
  237. }
  238. }
  239. /**
  240. * 删除hash表中的值
  241. *
  242. * @param key 键 不能为null
  243. * @param item 项 可以使多个 不能为null
  244. */
  245. public void hdel(String key, Object... item) {
  246. redisTemplate.opsForHash().delete(key, item);
  247. }
  248. /**
  249. * 判断hash表中是否有该项的值
  250. *
  251. * @param key 键 不能为null
  252. * @param item 项 不能为null
  253. * @return true 存在 false不存在
  254. */
  255. public boolean hHasKey(String key, String item) {
  256. return redisTemplate.opsForHash().hasKey(key, item);
  257. }
  258. /**
  259. * hash递增 如果不存在,就会创建一个 并把新增后的值返回
  260. *
  261. * @param key 键
  262. * @param item 项
  263. * @param by 要增加几(大于0)
  264. * @return
  265. */
  266. public double hincr(String key, String item, double by) {
  267. return redisTemplate.opsForHash().increment(key, item, by);
  268. }
  269. /**
  270. * hash递减
  271. *
  272. * @param key 键
  273. * @param item 项
  274. * @param by 要减少记(小于0)
  275. * @return
  276. */
  277. public double hdecr(String key, String item, double by) {
  278. return redisTemplate.opsForHash().increment(key, item, -by);
  279. }
  280. //============================set=============================
  281. /**
  282. * 根据key获取Set中的所有值
  283. *
  284. * @param key 键
  285. * @return
  286. */
  287. public Set<Object> sGet(String key) {
  288. try {
  289. return redisTemplate.opsForSet().members(key);
  290. } catch (Exception e) {
  291. e.printStackTrace();
  292. return null;
  293. }
  294. }
  295. /**
  296. * 根据value从一个set中查询,是否存在
  297. *
  298. * @param key 键
  299. * @param value 值
  300. * @return true 存在 false不存在
  301. */
  302. public boolean sHasKey(String key, Object value) {
  303. try {
  304. return redisTemplate.opsForSet().isMember(key, value);
  305. } catch (Exception e) {
  306. e.printStackTrace();
  307. return false;
  308. }
  309. }
  310. /**
  311. * 将数据放入set缓存
  312. *
  313. * @param key 键
  314. * @param values 值 可以是多个
  315. * @return 成功个数
  316. */
  317. public long sSet(String key, Object... values) {
  318. try {
  319. return redisTemplate.opsForSet().add(key, values);
  320. } catch (Exception e) {
  321. e.printStackTrace();
  322. return 0;
  323. }
  324. }
  325. /**
  326. * 将set数据放入缓存
  327. *
  328. * @param key 键
  329. * @param time 时间(秒)
  330. * @param values 值 可以是多个
  331. * @return 成功个数
  332. */
  333. public long sSetAndTime(String key, long time, Object... values) {
  334. try {
  335. Long count = redisTemplate.opsForSet().add(key, values);
  336. if (time > 0) expire(key, time);
  337. return count;
  338. } catch (Exception e) {
  339. e.printStackTrace();
  340. return 0;
  341. }
  342. }
  343. /**
  344. * 获取set缓存的长度
  345. *
  346. * @param key 键
  347. * @return
  348. */
  349. public long sGetSetSize(String key) {
  350. try {
  351. return redisTemplate.opsForSet().size(key);
  352. } catch (Exception e) {
  353. e.printStackTrace();
  354. return 0;
  355. }
  356. }
  357. /**
  358. * 移除值为value的
  359. *
  360. * @param key 键
  361. * @param values 值 可以是多个
  362. * @return 移除的个数
  363. */
  364. public long setRemove(String key, Object... values) {
  365. try {
  366. Long count = redisTemplate.opsForSet().remove(key, values);
  367. return count;
  368. } catch (Exception e) {
  369. e.printStackTrace();
  370. return 0;
  371. }
  372. }
  373. //===============================list=================================
  374. /**
  375. * 获取list缓存的内容
  376. *
  377. * @param key 键
  378. * @param start 开始
  379. * @param end 结束 0 到 -1代表所有值
  380. * @return
  381. */
  382. public List<Object> lGet(String key, long start, long end) {
  383. try {
  384. return redisTemplate.opsForList().range(key, start, end);
  385. } catch (Exception e) {
  386. e.printStackTrace();
  387. return null;
  388. }
  389. }
  390. /**
  391. * 获取list缓存的长度
  392. *
  393. * @param key 键
  394. * @return
  395. */
  396. public long lGetListSize(String key) {
  397. try {
  398. return redisTemplate.opsForList().size(key);
  399. } catch (Exception e) {
  400. e.printStackTrace();
  401. return 0;
  402. }
  403. }
  404. /**
  405. * 通过索引 获取list中的值
  406. *
  407. * @param key 键
  408. * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
  409. * @return
  410. */
  411. public Object lGetIndex(String key, long index) {
  412. try {
  413. return redisTemplate.opsForList().index(key, index);
  414. } catch (Exception e) {
  415. e.printStackTrace();
  416. return null;
  417. }
  418. }
  419. /**
  420. * 将list放入缓存
  421. *
  422. * @param key 键
  423. * @param value 值
  424. * @return
  425. */
  426. public boolean lSet(String key, Object value) {
  427. try {
  428. redisTemplate.opsForList().rightPush(key, value);
  429. return true;
  430. } catch (Exception e) {
  431. e.printStackTrace();
  432. return false;
  433. }
  434. }
  435. /**
  436. * 将list放入缓存
  437. *
  438. * @param key 键
  439. * @param value 值
  440. * @param time 时间(秒)
  441. * @return
  442. */
  443. public boolean lSet(String key, Object value, long time) {
  444. try {
  445. redisTemplate.opsForList().rightPush(key, value);
  446. if (time > 0) expire(key, time);
  447. return true;
  448. } catch (Exception e) {
  449. e.printStackTrace();
  450. return false;
  451. }
  452. }
  453. /**
  454. * 将list放入缓存
  455. *
  456. * @param key 键
  457. * @param value 值
  458. * @return
  459. */
  460. public boolean lSet(String key, List<Object> value) {
  461. try {
  462. redisTemplate.opsForList().rightPushAll(key, value);
  463. return true;
  464. } catch (Exception e) {
  465. e.printStackTrace();
  466. return false;
  467. }
  468. }
  469. /**
  470. * 将list放入缓存
  471. *
  472. * @param key 键
  473. * @param value 值
  474. * @param time 时间(秒)
  475. * @return
  476. */
  477. public boolean lSet(String key, List<Object> value, long time) {
  478. try {
  479. redisTemplate.opsForList().rightPushAll(key, value);
  480. if (time > 0) expire(key, time);
  481. return true;
  482. } catch (Exception e) {
  483. e.printStackTrace();
  484. return false;
  485. }
  486. }
  487. /**
  488. * 根据索引修改list中的某条数据
  489. *
  490. * @param key 键
  491. * @param index 索引
  492. * @param value 值
  493. * @return
  494. */
  495. public boolean lUpdateIndex(String key, long index, Object value) {
  496. try {
  497. redisTemplate.opsForList().set(key, index, value);
  498. return true;
  499. } catch (Exception e) {
  500. e.printStackTrace();
  501. return false;
  502. }
  503. }
  504. /**
  505. * 移除N个值为value
  506. *
  507. * @param key 键
  508. * @param count 移除多少个
  509. * @param value 值
  510. * @return 移除的个数
  511. */
  512. public long lRemove(String key, long count, Object value) {
  513. try {
  514. Long remove = redisTemplate.opsForList().remove(key, count, value);
  515. return remove;
  516. } catch (Exception e) {
  517. e.printStackTrace();
  518. return 0;
  519. }
  520. }
  521. //======================================
  522. /**
  523. * 批量删除对应的value
  524. *
  525. * @param keys
  526. */
  527. public void remove(final String... keys) {
  528. for (String key : keys) {
  529. remove(key);
  530. }
  531. }
  532. /**
  533. * 批量删除key
  534. *
  535. * @param pattern
  536. */
  537. public void removePattern(final String pattern) {
  538. Set<Serializable> keys = redisTemplate.keys(pattern);
  539. if (keys.size() > 0)
  540. redisTemplate.delete(keys);
  541. }
  542. /**
  543. * 删除对应的value
  544. *
  545. * @param key
  546. */
  547. public void remove(final String key) {
  548. if (exists(key)) {
  549. redisTemplate.delete(key);
  550. }
  551. }
  552. /**
  553. * 判断缓存中是否有对应的value
  554. *
  555. * @param key
  556. * @return
  557. */
  558. public boolean exists(final String key) {
  559. return redisTemplate.hasKey(key);
  560. }
  561. // /**
  562. // * 读取缓存
  563. // *
  564. // * @param key
  565. // * @return
  566. // */
  567. // public Object get(final String key) {
  568. // Object result = null;
  569. // ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  570. // result = operations.get(key);
  571. // return result;
  572. // }
  573. // /**
  574. // * 写入缓存
  575. // *
  576. // * @param key
  577. // * @param value
  578. // * @return
  579. // */
  580. // public boolean set(final String key, Object value) {
  581. // boolean result = false;
  582. // try {
  583. // ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  584. // operations.set(key, value);
  585. // result = true;
  586. // } catch (Exception e) {
  587. // e.printStackTrace();
  588. // }
  589. // return result;
  590. // }
  591. // /**
  592. // * 写入缓存
  593. // *
  594. // * @param key
  595. // * @param value
  596. // * @return
  597. // */
  598. // public boolean set(final String key, Object value, Long expireTime) {
  599. // boolean result = false;
  600. // try {
  601. // ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
  602. // operations.set(key, value);
  603. // redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
  604. // result = true;
  605. // } catch (Exception e) {
  606. // e.printStackTrace();
  607. // }
  608. // return result;
  609. // }
  610. /**
  611. * 删除单个key
  612. *
  613. * @param key
  614. */
  615. public void removeMemberSet(String key) {
  616. redisTemplate.opsForSet().getOperations().delete(key);
  617. }
  618. /**
  619. * 判断制定集合value是否存在
  620. *
  621. * @param key
  622. * @return
  623. */
  624. public boolean isMemberSet(String key, String value) {
  625. return redisTemplate.opsForSet().isMember(key, value);
  626. }
  627. /**
  628. * 向指定无序集合Set里添加value
  629. *
  630. * @param key
  631. */
  632. public void addMemberSet(String key, String value) {
  633. redisTemplate.opsForSet().add(key, value);
  634. }
  635. /**
  636. * 删除指定key获得集合里的值
  637. *
  638. * @param key
  639. * @param value
  640. * @return
  641. */
  642. public boolean removeMemberSetValue(String key, String value) {
  643. return redisTemplate.opsForSet().remove(key, value) == 1;
  644. }
  645. public Set<? extends Object> getMeberSetMeber(String key) {
  646. return redisTemplate.opsForSet().members(key);
  647. }
  648. //分布式锁工具类 start
  649. /**
  650. * 获取key的VALUE
  651. *
  652. * @param key
  653. * @return
  654. */
  655. @SuppressWarnings("finally")
  656. public String getByKey(String key) {
  657. Jedis jedis = null;
  658. String result = null;
  659. try {
  660. jedis = getResource();
  661. result = jedis.get(key);
  662. } catch (Exception e) {
  663. e.printStackTrace();
  664. } finally {
  665. if (jedis != null) {
  666. returnResource(jedis);
  667. }
  668. return result;
  669. }
  670. }
  671. /**
  672. * 不存在新增 成功返回1 ,不成功返回0
  673. *
  674. * @param key
  675. * @param value
  676. * @return
  677. */
  678. @SuppressWarnings("finally")
  679. public Long setnxByKey(String key, String value) {
  680. Jedis jedis = null;
  681. Long result = null;
  682. try {
  683. jedis = getResource();
  684. result = jedis.setnx(key, value);
  685. } catch (Exception e) {
  686. e.printStackTrace();
  687. } finally {
  688. if (jedis != null) {
  689. returnResource(jedis);
  690. }
  691. return result;
  692. }
  693. }
  694. /**
  695. * 获取老版本的旧值
  696. *
  697. * @param key
  698. * @param value
  699. * @return
  700. */
  701. @SuppressWarnings("finally")
  702. public String getSetByKey(String key, String value) {
  703. Jedis jedis = null;
  704. String result = null;
  705. try {
  706. jedis = getResource();
  707. result = jedis.getSet(key, value);
  708. } catch (Exception e) {
  709. e.printStackTrace();
  710. } finally {
  711. if (jedis != null) {
  712. returnResource(jedis);
  713. }
  714. return result;
  715. }
  716. }
  717. /**
  718. * 制定KEY过期
  719. *
  720. * @param key
  721. * @param seconds
  722. * @return
  723. */
  724. @SuppressWarnings("finally")
  725. public Long expireByKey(String key, int seconds) {
  726. Jedis jedis = null;
  727. Long result = null;
  728. try {
  729. jedis = getResource();
  730. result = jedis.expire(key, seconds);
  731. } catch (Exception e) {
  732. e.printStackTrace();
  733. } finally {
  734. if (jedis != null) {
  735. returnResource(jedis);
  736. }
  737. return result;
  738. }
  739. }
  740. /**
  741. * 删除制定KEY的VALUE
  742. *
  743. * @param key
  744. * @return
  745. */
  746. @SuppressWarnings("finally")
  747. public Long delByKey(String key) {
  748. Jedis jedis = null;
  749. Long result = null;
  750. try {
  751. jedis = getResource();
  752. result = jedis.del(key);
  753. } catch (Exception e) {
  754. e.printStackTrace();
  755. } finally {
  756. if (jedis != null) {
  757. returnResource(jedis);
  758. }
  759. return result;
  760. }
  761. }
  762. /**
  763. * 获取分布式锁
  764. *
  765. * @param lockName
  766. * @return
  767. */
  768. public boolean lock(String lockName) {//lockName可以为共享变量名,也可以为方法名,主要是用于模拟锁信息
  769. System.out.println(Thread.currentThread() + "开始尝试加锁!");
  770. Long result = setnxByKey(lockName, String.valueOf(System.currentTimeMillis() + 10000));
  771. if (result != null && result.intValue() == 1) {
  772. System.out.println(Thread.currentThread() + "加锁成功!");
  773. expireByKey(lockName, 10);
  774. System.out.println(Thread.currentThread() + "获得锁可以开始执行业务逻辑!");
  775. // delByKey(lockName); //在业务代码里执行
  776. return true;
  777. } else {
  778. String lockValueA = getByKey(lockName);
  779. if (lockValueA != null && Long.parseLong(lockValueA) >= System.currentTimeMillis()) {
  780. String lockValueB = getSetByKey(lockName, String.valueOf(System.currentTimeMillis() + 10000));
  781. if (lockValueB == null || lockValueB.equals(lockValueA)) {
  782. System.out.println(Thread.currentThread() + "加锁成功!");
  783. expireByKey(lockName, 10);
  784. System.out.println(Thread.currentThread() + "获得锁可以开始执行业务逻辑!");
  785. // delByKey(lockName); //在业务代码里执行
  786. return true;
  787. } else {
  788. return false;
  789. }
  790. } else {
  791. return false;
  792. }
  793. }
  794. }
  795. //分布式锁工具类 end
  796. }

5:写测试类来测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class NanawalletServerApplicationTests {
  4. @Autowired
  5. private RedisService redisService;
  6. @Test
  7. public void contextLoads() {
  8. }
  9. @Test
  10. public void testInsertRedis(){
  11. this.redisService.set("test_redis","123456");
  12. System.out.println( this.redisService.get("test_redis"));
  13. }
  14. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/160053
推荐阅读
相关标签
  

闽ICP备14008679号