RedisUtil.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. package com.happy.redis;
  2. import redis.clients.jedis.Jedis;
  3. import redis.clients.jedis.JedisPool;
  4. import redis.clients.jedis.JedisPoolConfig;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.Map;
  8. /**
  9. * Redis连接池
  10. *
  11. * @author AK
  12. *
  13. */
  14. public final class RedisUtil {
  15. // Redis服务器IP
  16. private static String IP = "127.0.0.1";
  17. // Redis的端口号
  18. private static int PORT = 6379;
  19. // 访问密码
  20. private static String AUTH = "Ytw-2015#Ehsan";
  21. // 可用连接实例的最大数目,默认值为8;
  22. // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
  23. private static int MAX_ACTIVE = 1024;
  24. // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
  25. private static int MAX_IDLE = 200;
  26. // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
  27. private static long MAX_WAIT = 10000;
  28. // 最大延迟时间
  29. private static int TIMEOUT = 10000;
  30. // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
  31. private static boolean TEST_ON_BORROW = true;
  32. private static JedisPool jedisPool = null;
  33. /**
  34. * 初始化Redis连接池
  35. */
  36. static {
  37. try {
  38. JedisPoolConfig config = new JedisPoolConfig();
  39. // 控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
  40. // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
  41. config.setMaxIdle(500);
  42. // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
  43. config.setMinIdle(2);
  44. config.setMaxIdle(10);
  45. // 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
  46. config.setMaxWaitMillis(1000 * 10);
  47. // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
  48. config.setTestOnBorrow(true);
  49. jedisPool = new JedisPool(config, IP, PORT);
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. /**
  55. * 获取Jedis实例
  56. *
  57. * @return
  58. */
  59. public synchronized static Jedis getJedis() {
  60. try {
  61. if (jedisPool != null) {
  62. Jedis resource = jedisPool.getResource();
  63. return resource;
  64. } else {
  65. return null;
  66. }
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. return null;
  70. }
  71. }
  72. /**
  73. * 释放jedis资源
  74. *
  75. * @param jedis
  76. */
  77. public static void returnResource(final Jedis jedis) {
  78. if (jedis != null) {
  79. jedisPool.returnResource(jedis);
  80. }
  81. }
  82. /**
  83. * 设置数据
  84. *
  85. * @param key
  86. * @return
  87. */
  88. public static String set(String key, String value) {
  89. Jedis jedis = null;
  90. try {
  91. jedis = jedisPool.getResource();
  92. jedis.set(key, value);
  93. } catch (Exception e) {
  94. // 释放redis对象
  95. jedisPool.returnBrokenResource(jedis);
  96. e.printStackTrace();
  97. } finally {
  98. // 返还到连接池
  99. returnResource(jedis);
  100. }
  101. return value;
  102. }
  103. public static String setBySeconds(String key, int seconds, String value) {
  104. Jedis jedis = null;
  105. try {
  106. jedis = jedisPool.getResource();
  107. jedis.setex(key, seconds, value);
  108. } catch (Exception e) {
  109. // 释放redis对象
  110. jedisPool.returnBrokenResource(jedis);
  111. e.printStackTrace();
  112. } finally {
  113. // 返还到连接池
  114. returnResource(jedis);
  115. }
  116. return value;
  117. }
  118. /**
  119. * 删除数据
  120. *
  121. * @param key
  122. * @return
  123. */
  124. public boolean del(String key) {
  125. Jedis jedis = null;
  126. try {
  127. jedis = jedisPool.getResource();
  128. return jedis.del(key) > 0 ? true : false;
  129. } catch (Throwable e) {
  130. e.printStackTrace();
  131. } finally {
  132. returnResource(jedis);
  133. }
  134. return false;
  135. }
  136. public String get(String key) {
  137. Jedis jedis = null;
  138. try {
  139. jedis = jedisPool.getResource();
  140. return jedis.get(key);
  141. } catch (Throwable e) {
  142. e.printStackTrace();
  143. } finally {
  144. returnResource(jedis);
  145. }
  146. return null;
  147. }
  148. /**
  149. * 存储到redis队列中,插入到表头
  150. *
  151. * @param key
  152. * @param value
  153. */
  154. public void lpush(byte[] key, byte[] value) {
  155. Jedis jedis = null;
  156. try {
  157. jedis = jedisPool.getResource();
  158. jedis.lpush(key, value);
  159. } catch (Throwable e) {
  160. e.printStackTrace();
  161. } finally {
  162. returnResource(jedis);
  163. }
  164. }
  165. /**
  166. * 存储到redis队列中,插入到表尾
  167. *
  168. * @param key
  169. * @param value
  170. */
  171. public void rpush(byte[] key, byte[] value) {
  172. Jedis jedis = null;
  173. try {
  174. jedis = jedisPool.getResource();
  175. jedis.rpush(key, value);
  176. } catch (Throwable e) {
  177. e.printStackTrace();
  178. } finally {
  179. returnResource(jedis);
  180. }
  181. }
  182. public byte[] lpop(byte[] key) {
  183. Jedis jedis = null;
  184. try {
  185. jedis = jedisPool.getResource();
  186. return jedis.lpop(key);
  187. } catch (Throwable e) {
  188. e.printStackTrace();
  189. } finally {
  190. returnResource(jedis);
  191. }
  192. return null;
  193. }
  194. public byte[] rpop(byte[] key) {
  195. Jedis jedis = null;
  196. try {
  197. jedis = jedisPool.getResource();
  198. return jedis.rpop(key);
  199. } catch (Throwable e) {
  200. e.printStackTrace();
  201. } finally {
  202. returnResource(jedis);
  203. }
  204. return null;
  205. }
  206. public Long getLen(byte[] key) {
  207. Jedis jedis = null;
  208. try {
  209. jedis = jedisPool.getResource();
  210. return jedis.llen(key);
  211. } catch (Throwable e) {
  212. e.printStackTrace();
  213. } finally {
  214. returnResource(jedis);
  215. }
  216. return 0L;
  217. }
  218. public List<byte[]> getRedisList(byte[] key) {
  219. Jedis jedis = null;
  220. try {
  221. jedis = jedisPool.getResource();
  222. return jedis.lrange(key, 0, -1);
  223. } catch (Throwable e) {
  224. e.printStackTrace();
  225. } finally {
  226. returnResource(jedis);
  227. }
  228. return null;
  229. }
  230. public boolean isExistUpdate(final String... param) {
  231. Jedis jedis = null;
  232. try {
  233. jedis = jedisPool.getResource();
  234. String key = param[0];
  235. int expire = 20;
  236. if (param.length > 1) {
  237. expire = Integer.parseInt(param[1]);
  238. }
  239. long status = jedis.setnx("redis_lock_" + key, "true");
  240. // if (status > 0) {
  241. jedis.expire("redis_lock_" + key, expire);
  242. // }
  243. return status <= 0 ? true : false;
  244. } catch (Throwable e) {
  245. e.printStackTrace();
  246. } finally {
  247. returnResource(jedis);
  248. }
  249. return false;
  250. }
  251. public static boolean acquireLock(String lock, String expired) {
  252. // 1. 通过SETNX试图获取一个lock
  253. boolean success = false;
  254. Jedis jedis = null;
  255. try {
  256. jedis = jedisPool.getResource();
  257. long acquired = jedis.setnx(lock, String.valueOf(expired));
  258. // SETNX成功,则成功获取一个锁
  259. if (acquired == 1) {
  260. success = true;
  261. }
  262. // SETNX失败,说明锁仍然被其他对象保持,检查其是否已经超时
  263. else {
  264. success = false;
  265. }
  266. } catch (Throwable e) {
  267. e.printStackTrace();
  268. } finally {
  269. returnResource(jedis);
  270. }
  271. return success;
  272. }
  273. public Long unLockRedisKey(final String key) {
  274. Jedis jedis = null;
  275. try {
  276. jedis = jedisPool.getResource();
  277. return jedis.del("redis_lock_" + key);
  278. } catch (Throwable e) {
  279. e.printStackTrace();
  280. } finally {
  281. returnResource(jedis);
  282. }
  283. return -1L;
  284. }
  285. /**
  286. * Redis 哈希
  287. */
  288. public class RedisHash {
  289. private String key;
  290. public RedisHash(String key) {
  291. this.key = key;
  292. }
  293. /**
  294. * 获取指定属性值
  295. *
  296. * @param field
  297. * 属性名
  298. *
  299. * @return 属性值
  300. */
  301. public String get(final String field) {
  302. Jedis jedis = null;
  303. try {
  304. jedis = jedisPool.getResource();
  305. return jedis.hget(key, field);
  306. } catch (Throwable e) {
  307. e.printStackTrace();
  308. } finally {
  309. returnResource(jedis);
  310. }
  311. return null;
  312. }
  313. /**
  314. * 获取指定属性值
  315. *
  316. * @param fields
  317. * 属性名
  318. *
  319. * @return 属性值
  320. */
  321. public List<String> get(final String... fields) {
  322. Jedis jedis = null;
  323. try {
  324. jedis = jedisPool.getResource();
  325. return jedis.hmget(key, fields);
  326. } catch (Throwable e) {
  327. e.printStackTrace();
  328. } finally {
  329. returnResource(jedis);
  330. }
  331. return null;
  332. }
  333. /**
  334. * 设置属性
  335. *
  336. * @param field
  337. * 属性名
  338. * @param value
  339. * 属性值
  340. */
  341. public void put(final String field, final String value) {
  342. Jedis jedis = null;
  343. try {
  344. jedis = jedisPool.getResource();
  345. jedis.hset(key, field, value);
  346. } catch (Throwable e) {
  347. e.printStackTrace();
  348. } finally {
  349. returnResource(jedis);
  350. }
  351. }
  352. /**
  353. * 仅当属性名不存在是设置属性
  354. *
  355. * @param field
  356. * 属性名
  357. * @param value
  358. * 属性值
  359. *
  360. * @return 0表示属性已存在
  361. */
  362. public int setOnlyIfNotExists(final String field, final String value) {
  363. Jedis jedis = null;
  364. try {
  365. jedis = jedisPool.getResource();
  366. return jedis.hsetnx(key, field, value).intValue();
  367. } catch (Throwable e) {
  368. e.printStackTrace();
  369. } finally {
  370. returnResource(jedis);
  371. }
  372. return -1;
  373. }
  374. /**
  375. * 保存多个属性名和属性值
  376. *
  377. * @param map
  378. * 属性
  379. */
  380. public void putAll(final Map<String, String> map) {
  381. Jedis jedis = null;
  382. try {
  383. jedis = jedisPool.getResource();
  384. jedis.hmset(key, map);
  385. } catch (Throwable e) {
  386. e.printStackTrace();
  387. } finally {
  388. returnResource(jedis);
  389. }
  390. }
  391. /**
  392. * 删除一个或多个属性
  393. *
  394. * @param fields
  395. * 属性名
  396. *
  397. * @return 被删除的属性数量
  398. */
  399. public int delete(final String... fields) {
  400. Jedis jedis = null;
  401. try {
  402. jedis = jedisPool.getResource();
  403. return jedis.hdel(key, fields).intValue();
  404. } catch (Throwable e) {
  405. e.printStackTrace();
  406. } finally {
  407. returnResource(jedis);
  408. }
  409. return -1;
  410. }
  411. /**
  412. * 列出所有属性
  413. *
  414. * @return 所有属性名
  415. */
  416. public List<String> keys() {
  417. Jedis jedis = null;
  418. try {
  419. jedis = jedisPool.getResource();
  420. return new ArrayList<String>(jedis.hkeys(key));
  421. } catch (Throwable e) {
  422. e.printStackTrace();
  423. } finally {
  424. returnResource(jedis);
  425. }
  426. return null;
  427. }
  428. /**
  429. * 读取所有属性值并转换为 Map 对象
  430. *
  431. * @return 所有属性值
  432. */
  433. public Map<String, String> toMap() {
  434. Jedis jedis = null;
  435. try {
  436. jedis = jedisPool.getResource();
  437. return jedis.hgetAll(key);
  438. } catch (Throwable e) {
  439. e.printStackTrace();
  440. } finally {
  441. returnResource(jedis);
  442. }
  443. return null;
  444. }
  445. /**
  446. * 读取key的长度
  447. *
  448. * @return 所有属性值
  449. */
  450. public Long getLen() {
  451. Jedis jedis = null;
  452. try {
  453. jedis = jedisPool.getResource();
  454. return jedis.hlen(key);
  455. } catch (Throwable e) {
  456. e.printStackTrace();
  457. } finally {
  458. returnResource(jedis);
  459. }
  460. return 0L;
  461. }
  462. /**
  463. * 是否存在一个key
  464. *
  465. * @return 所有属性值
  466. */
  467. public Boolean isExist(final String field) {
  468. Jedis jedis = null;
  469. try {
  470. jedis = jedisPool.getResource();
  471. return jedis.hexists(key, field);
  472. } catch (Throwable e) {
  473. e.printStackTrace();
  474. } finally {
  475. returnResource(jedis);
  476. }
  477. return false;
  478. }
  479. }
  480. public RedisHash getRedisHash(String key) {
  481. return new RedisHash(key);
  482. }
  483. public static void main(String[] args) {
  484. // System.out.println(getJedis().flushAll());
  485. }
  486. }