RedisUtil.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. package jnpf.util;
  2. import jnpf.consts.RedisConst;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.commons.collections4.CollectionUtils;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.redis.core.RedisTemplate;
  7. import org.springframework.stereotype.Component;
  8. import java.util.*;
  9. import java.util.concurrent.TimeUnit;
  10. import java.util.stream.Collectors;
  11. /**
  12. *
  13. * @author JNPF开发平台组
  14. * @version V3.1.0
  15. * @copyright 引迈信息技术有限公司
  16. * @date 2021/3/16 10:51
  17. */
  18. @Slf4j
  19. @Component
  20. public class RedisUtil {
  21. /**
  22. * 默认缓存时间 60S
  23. */
  24. public final static int CAHCETIME = 60;
  25. /**
  26. * 默认缓存时间 1hr
  27. */
  28. public final static int CAHCEHOUR = 60 * 60;
  29. /**
  30. * 默认缓存时间 1Day
  31. */
  32. public final static int CAHCEDAY = 60 * 60 * 24;
  33. /**
  34. * 默认缓存时间 1week
  35. */
  36. public final static int CAHCEWEEK = 60 * 60 * 24 * 7;
  37. /**
  38. * 默认缓存时间 1month
  39. */
  40. public final static int CAHCEMONTH = 60 * 60 * 24 * 7 * 30;
  41. /**
  42. * 默认缓存时间 1年
  43. */
  44. public final static int CAHCEYEAR = 60 * 60 * 24 * 7 * 30 * 12;
  45. private static long expiresIn = TimeUnit.SECONDS.toSeconds(CAHCEHOUR * 8);
  46. @Autowired
  47. private RedisTemplate redisTemplate;
  48. @Autowired
  49. private CacheKeyUtil cacheKeyUtil;
  50. // =============================common============================
  51. /**
  52. * 获取所有的key
  53. *
  54. * @return
  55. */
  56. public Set<String> getAllVisiualKeys() {
  57. Set<String> allKey = new HashSet<>(16);
  58. allKey.addAll(Objects.requireNonNull(redisTemplate.keys("*" + cacheKeyUtil.getAllUser() + "*")));
  59. allKey.addAll(Objects.requireNonNull(redisTemplate.keys("*" + cacheKeyUtil.getCompanySelect() + "*")));
  60. allKey.addAll(Objects.requireNonNull(redisTemplate.keys("*" + cacheKeyUtil.getDictionary() + "*")));
  61. allKey.addAll(Objects.requireNonNull(redisTemplate.keys("*" + cacheKeyUtil.getDynamic() + "*")));
  62. allKey.addAll(Objects.requireNonNull(redisTemplate.keys("*" + cacheKeyUtil.getOrganizeList() + "*")));
  63. allKey.addAll(Objects.requireNonNull(redisTemplate.keys("*" + cacheKeyUtil.getPositionList() + "*")));
  64. allKey.addAll(Objects.requireNonNull(redisTemplate.keys("*" + cacheKeyUtil.getVisiualData() + "*")));
  65. return allKey;
  66. }
  67. /**
  68. * 获取所有的key
  69. *
  70. * @return
  71. */
  72. public Set<String> getAllKeys() {
  73. Set<String> keys = redisTemplate.keys("*");
  74. if(CollectionUtils.isNotEmpty(keys)) {
  75. //排除ID生成器的缓存记录, 如果删除在集群情况下ID生成器的机器编号可能会重复导致生成的ID重复
  76. keys = keys.stream().filter(s ->
  77. !s.startsWith(CacheKeyUtil.IDGENERATOR) && !s.startsWith(RedisConst.REDIS_LOCK4J_PREFIX)
  78. ).collect(Collectors.toSet());
  79. }
  80. return keys;
  81. }
  82. /**
  83. * 返回 key 的剩余的过期时间
  84. *
  85. * @param key
  86. * @return
  87. */
  88. public Long getLiveTime(String key) {
  89. return redisTemplate.getExpire(key);
  90. }
  91. /**
  92. * 删除指定key
  93. *
  94. * @param key
  95. */
  96. public void remove(String key) {
  97. if (exists(key)) {
  98. redisTemplate.delete(key);
  99. }
  100. }
  101. /**
  102. * 删除全部redis
  103. */
  104. public void removeAll() {
  105. Set<String> keys = getAllKeys();
  106. if (CollectionUtils.isNotEmpty(keys)) {
  107. //兼容Redis集群, 不同的KEY在不同服务器上不允许同时联合操作
  108. keys.forEach(k->redisTemplate.delete(k));
  109. }
  110. }
  111. /**
  112. * 判断缓存中是否有对应的value
  113. *
  114. * @param key
  115. * @return
  116. */
  117. public boolean exists(final String key) {
  118. return redisTemplate.hasKey(key);
  119. }
  120. /**
  121. * 指定缓存失效时间
  122. *
  123. * @param key
  124. * @param time
  125. * @return
  126. */
  127. public void expire(String key, long time) {
  128. if (time > 0) {
  129. redisTemplate.expire(key, time, TimeUnit.SECONDS);
  130. } else {
  131. redisTemplate.expire(key, expiresIn, TimeUnit.SECONDS);
  132. }
  133. }
  134. /**
  135. * 插入缓存(无时间)
  136. *
  137. * @param key
  138. * @param object
  139. */
  140. public void insert(String key, Object object) {
  141. insert(key, object, 0);
  142. }
  143. /**
  144. * 插入缓存(有时间)
  145. *
  146. * @param key
  147. * @param object
  148. */
  149. public void insert(String key, Object object, long time) {
  150. if (object instanceof Map) {
  151. redisTemplate.opsForHash().putAll(key, (Map<String, String>) object);
  152. } else if (object instanceof List) {
  153. redisTemplate.opsForList().rightPushAll(key, (List)object);
  154. } else if (object instanceof Set) {
  155. redisTemplate.opsForSet().add(key, ((Set<?>) object).toArray());
  156. } else {
  157. redisTemplate.opsForValue().set(key, toJson(object));
  158. }
  159. expire(key, time);
  160. }
  161. /**
  162. * Object转成JSON数据
  163. */
  164. private String toJson(Object object) {
  165. if (object instanceof Integer || object instanceof Long || object instanceof Float ||
  166. object instanceof Double || object instanceof Boolean || object instanceof String) {
  167. return String.valueOf(object);
  168. }
  169. return JsonUtil.getObjectToString(object);
  170. }
  171. /**
  172. * 修改key
  173. *
  174. * @param oldKey 旧的key
  175. * @param newKey 新的key
  176. */
  177. public void rename(String oldKey, String newKey) {
  178. redisTemplate.rename(oldKey, newKey);
  179. }
  180. /**
  181. * 返回key存储的类型
  182. *
  183. * @param key
  184. */
  185. public String getType(String key) {
  186. return redisTemplate.type(key).code();
  187. }
  188. // ============================String=============================
  189. /**
  190. * 获取redis的String值
  191. *
  192. * @param key
  193. * @return
  194. */
  195. public Object getString(String key) {
  196. return redisTemplate.opsForValue().get(key);
  197. }
  198. // ============================Map=============================
  199. /**
  200. * 判断hash表中是否有对应的value
  201. *
  202. * @param hashId
  203. * @param key
  204. * @return
  205. */
  206. public boolean hasKey(String hashId, String key) {
  207. return redisTemplate.opsForHash().hasKey(hashId, key);
  208. }
  209. /**
  210. * 获取hashKey对应的所有键
  211. *
  212. * @param hashId 键
  213. */
  214. public List<String> getHashKeys(String hashId) {
  215. List<String> list = new ArrayList<>();
  216. Map<Object, Object> map = this.getMap(hashId);
  217. for (Object object : map.keySet()) {
  218. if (object instanceof String) {
  219. list.add(String.valueOf(object));
  220. }
  221. }
  222. return list;
  223. }
  224. /**
  225. * 获取hashKey对应的所有值
  226. *
  227. * @param hashId 键
  228. */
  229. public List<String> getHashValues(String hashId) {
  230. List<String> list = new ArrayList<>();
  231. Map<Object, Object> map = this.getMap(hashId);
  232. for (Object object : map.keySet()) {
  233. if (map.get(object) instanceof String) {
  234. list.add(String.valueOf(map.get(object)));
  235. }
  236. }
  237. return list;
  238. }
  239. /**
  240. * 查询具体map的值
  241. *
  242. * @param hashId
  243. * @param key
  244. * @return
  245. */
  246. public String getHashValues(String hashId, String key) {
  247. Object object = redisTemplate.opsForHash().get(hashId, key);
  248. if (object != null) {
  249. return String.valueOf(object);
  250. } else {
  251. return null;
  252. }
  253. }
  254. /**
  255. * 删除指定map的key
  256. *
  257. * @param key
  258. */
  259. public void removeHash(String hashId, String key) {
  260. if (hasKey(hashId, key)) {
  261. redisTemplate.opsForHash().delete(hashId, key);
  262. }
  263. }
  264. /**
  265. * 获取所有的map缓存
  266. *
  267. * @param key
  268. * @return
  269. */
  270. public <K,V> Map<K, V> getMap(String key) {
  271. return (Map<K, V>) redisTemplate.opsForHash().entries(key);
  272. }
  273. /**
  274. * 插入map的值
  275. *
  276. * @param hashId 主键id
  277. * @param key map的key
  278. * @param value map的值
  279. */
  280. public void insertHash(String hashId, String key, String value) {
  281. redisTemplate.opsForHash().put(hashId, key, value);
  282. }
  283. // ============================set=============================
  284. /**
  285. * 根据key获取Set中的所有值
  286. *
  287. * @param key 键
  288. * @return
  289. */
  290. public Set<Object> getSet(String key) {
  291. try {
  292. return redisTemplate.opsForSet().members(key);
  293. } catch (Exception e) {
  294. log.error(key, e);
  295. return null;
  296. }
  297. }
  298. /**
  299. * 获取set缓存的长度
  300. *
  301. * @param key 键
  302. * @return
  303. */
  304. public long getSetSize(String key) {
  305. try {
  306. return redisTemplate.opsForSet().size(key);
  307. } catch (Exception e) {
  308. log.error(key, e);
  309. return 0;
  310. }
  311. }
  312. // ===============================list=================================
  313. /**
  314. * 获取list缓存的内容
  315. *
  316. * @param key 键
  317. * @param start 开始 0 是第一个元素
  318. * @param end 结束 -1代表所有值
  319. * @return
  320. * @取出来的元素 总数 end-start+1
  321. */
  322. public List<Object> get(String key, long start, long end) {
  323. try {
  324. return redisTemplate.opsForList().range(key, start, end);
  325. } catch (Exception e) {
  326. log.error(key, e);
  327. return null;
  328. }
  329. }
  330. /**
  331. * 获取list缓存的长度
  332. *
  333. * @param key 键
  334. * @return
  335. */
  336. public long getListSize(String key) {
  337. try {
  338. return redisTemplate.opsForList().size(key);
  339. } catch (Exception e) {
  340. log.error(key, e);
  341. return 0;
  342. }
  343. }
  344. /**
  345. * 通过索引 获取list中的值
  346. *
  347. * @param key 键
  348. * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
  349. * @return
  350. */
  351. public Object getIndex(String key, long index) {
  352. try {
  353. return redisTemplate.opsForList().index(key, index);
  354. } catch (Exception e) {
  355. log.error(key, e);
  356. return null;
  357. }
  358. }
  359. }