Explorar o código

添加redis工具类及配置

my-csc-config-file.git %!s(int64=5) %!d(string=hai) anos
pai
achega
44675b0bf0

+ 53 - 0
src/main/java/com/unissoft/config/RedisConfig.java

@@ -0,0 +1,53 @@
1
+package com.unissoft.config;
2
+
3
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
4
+import com.fasterxml.jackson.annotation.PropertyAccessor;
5
+import com.fasterxml.jackson.databind.ObjectMapper;
6
+import org.springframework.context.annotation.Bean;
7
+import org.springframework.context.annotation.Configuration;
8
+import org.springframework.data.redis.connection.RedisConnectionFactory;
9
+import org.springframework.data.redis.core.RedisTemplate;
10
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
11
+import org.springframework.data.redis.serializer.StringRedisSerializer;
12
+
13
+@Configuration
14
+public class RedisConfig {
15
+
16
+    /**
17
+     * @SuppressWarnings 该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默
18
+     *
19
+     *    关键字         用途
20
+     *    deprecation   使用了不赞成使用的类或方法时的警告
21
+     *    unchecked     执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型。
22
+     *    fallthrough   当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。
23
+     *    path          在类路径、源文件路径等中有不存在的路径时的警告。
24
+     *    serial        当在可序列化的类上缺少 serialVersionUID 定义时的警告。
25
+     *    finally       任何 finally 子句不能正常完成时的警告。
26
+     *    all           关于以上所有情况的警告。
27
+     */
28
+
29
+//    注入 Spring 容器中,忽略所有警告
30
+    @Bean
31
+    @SuppressWarnings("all")
32
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
33
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
34
+        template.setConnectionFactory(factory);
35
+        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
36
+        ObjectMapper objectMapper = new ObjectMapper();
37
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
38
+        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
39
+        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
40
+        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
41
+//        key 采用 String 的序列化方式
42
+        template.setKeySerializer(stringRedisSerializer);
43
+//        hash 的 key 也采用 String 的序列化方式
44
+        template.setHashKeySerializer(stringRedisSerializer);
45
+//        value 的序列化方式采用 JSON
46
+        template.setValueSerializer(jackson2JsonRedisSerializer);
47
+//        hash value 的序列化方式也采用 JSON
48
+        template.setHashValueSerializer(jackson2JsonRedisSerializer);
49
+        template.afterPropertiesSet();
50
+        return template;
51
+    }
52
+
53
+}

+ 538 - 0
src/main/java/com/unissoft/utils/RedisUtil.java

@@ -0,0 +1,538 @@
1
+package com.unissoft.utils;
2
+
3
+import org.springframework.beans.factory.annotation.Autowired;
4
+import org.springframework.data.redis.core.RedisTemplate;
5
+import org.springframework.stereotype.Component;
6
+import org.springframework.util.CollectionUtils;
7
+
8
+import java.util.List;
9
+import java.util.Map;
10
+import java.util.Set;
11
+import java.util.concurrent.TimeUnit;
12
+
13
+@Component
14
+public class RedisUtil {
15
+
16
+    @Autowired
17
+    private RedisTemplate<String, Object> redisTemplate;
18
+
19
+    /**
20
+     * 指定缓存失效时间
21
+     * @param key 键
22
+     * @param time 时间(秒)
23
+     * @return true / false
24
+     */
25
+    public boolean expire(String key, long time) {
26
+        try {
27
+            if (time > 0) {
28
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
29
+            }
30
+            return true;
31
+        } catch (Exception e) {
32
+            e.printStackTrace();
33
+            return false;
34
+        }
35
+    }
36
+
37
+    /**
38
+     * 根据 key 获取过期时间
39
+     * @param key 键
40
+     * @return
41
+     */
42
+    public long getExpire(String key) {
43
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
44
+    }
45
+
46
+    /**
47
+     * 判断 key 是否存在
48
+     * @param key 键
49
+     * @return true / false
50
+     */
51
+    public boolean hasKey(String key) {
52
+        try {
53
+            return redisTemplate.hasKey(key);
54
+        } catch (Exception e) {
55
+            e.printStackTrace();
56
+            return false;
57
+        }
58
+    }
59
+
60
+    /**
61
+     * 删除缓存
62
+     * @SuppressWarnings("unchecked") 忽略类型转换警告
63
+     * @param key 键(一个或者多个)
64
+     */
65
+    @SuppressWarnings("unchecked")
66
+    public void del(String... key) {
67
+        if (key != null && key.length > 0) {
68
+            if (key.length == 1) {
69
+                redisTemplate.delete(key[0]);
70
+            } else {
71
+//                传入一个 Collection<String> 集合
72
+                redisTemplate.delete(CollectionUtils.arrayToList(key));
73
+            }
74
+        }
75
+    }
76
+
77
+//    ============================== String ==============================
78
+
79
+    /**
80
+     * 普通缓存获取
81
+     * @param key 键
82
+     * @return 值
83
+     */
84
+    public Object get(String key) {
85
+        return key == null ? null : redisTemplate.opsForValue().get(key);
86
+    }
87
+
88
+    /**
89
+     * 普通缓存放入
90
+     * @param key 键
91
+     * @param value 值
92
+     * @return true / false
93
+     */
94
+    public boolean set(String key, Object value) {
95
+        try {
96
+            redisTemplate.opsForValue().set(key, value);
97
+            return true;
98
+        } catch (Exception e) {
99
+            e.printStackTrace();
100
+            return false;
101
+        }
102
+    }
103
+
104
+    /**
105
+     * 普通缓存放入并设置时间
106
+     * @param key 键
107
+     * @param value 值
108
+     * @param time 时间(秒),如果 time < 0 则设置无限时间
109
+     * @return true / false
110
+     */
111
+    public boolean set(String key, Object value, long time) {
112
+        try {
113
+            if (time > 0) {
114
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
115
+            } else {
116
+                set(key, value);
117
+            }
118
+            return true;
119
+        } catch (Exception e) {
120
+            e.printStackTrace();
121
+            return false;
122
+        }
123
+    }
124
+
125
+    /**
126
+     * 递增
127
+     * @param key 键
128
+     * @param delta 递增大小
129
+     * @return
130
+     */
131
+    public long incr(String key, long delta) {
132
+        if (delta < 0) {
133
+            throw new RuntimeException("递增因子必须大于 0");
134
+        }
135
+        return redisTemplate.opsForValue().increment(key, delta);
136
+    }
137
+
138
+    /**
139
+     * 递减
140
+     * @param key 键
141
+     * @param delta 递减大小
142
+     * @return
143
+     */
144
+    public long decr(String key, long delta) {
145
+        if (delta < 0) {
146
+            throw new RuntimeException("递减因子必须大于 0");
147
+        }
148
+        return redisTemplate.opsForValue().increment(key, delta);
149
+    }
150
+
151
+//    ============================== Map ==============================
152
+
153
+    /**
154
+     * HashGet
155
+     * @param key 键(no null)
156
+     * @param item 项(no null)
157
+     * @return 值
158
+     */
159
+    public Object hget(String key, String item) {
160
+        return redisTemplate.opsForHash().get(key, item);
161
+    }
162
+
163
+    /**
164
+     * 获取 key 对应的 map
165
+     * @param key 键(no null)
166
+     * @return 对应的多个键值
167
+     */
168
+    public Map<Object, Object> hmget(String key) {
169
+        return redisTemplate.opsForHash().entries(key);
170
+    }
171
+
172
+    /**
173
+     * HashSet
174
+     * @param key 键
175
+     * @param map 值
176
+     * @return true / false
177
+     */
178
+    public boolean hmset(String key, Map<Object, Object> map) {
179
+        try {
180
+            redisTemplate.opsForHash().putAll(key, map);
181
+            return true;
182
+        } catch (Exception e) {
183
+            e.printStackTrace();
184
+            return false;
185
+        }
186
+    }
187
+
188
+    /**
189
+     * HashSet 并设置时间
190
+     * @param key 键
191
+     * @param map 值
192
+     * @param time 时间
193
+     * @return true / false
194
+     */
195
+    public boolean hmset(String key, Map<Object, Object> map, long time) {
196
+        try {
197
+            redisTemplate.opsForHash().putAll(key, map);
198
+            if (time > 0) {
199
+                expire(key, time);
200
+            }
201
+            return true;
202
+        } catch (Exception e) {
203
+            e.printStackTrace();
204
+            return false;
205
+        }
206
+    }
207
+
208
+    /**
209
+     * 向一张 Hash表 中放入数据,如不存在则创建
210
+     * @param key 键
211
+     * @param item 项
212
+     * @param value 值
213
+     * @return true / false
214
+     */
215
+    public boolean hset(String key, String item, Object value) {
216
+        try {
217
+            redisTemplate.opsForHash().put(key, item, value);
218
+            return true;
219
+        } catch (Exception e) {
220
+            e.printStackTrace();
221
+            return false;
222
+        }
223
+    }
224
+
225
+    /**
226
+     * 向一张 Hash表 中放入数据,并设置时间,如不存在则创建
227
+     * @param key 键
228
+     * @param item 项
229
+     * @param value 值
230
+     * @param time 时间(如果原来的 Hash表 设置了时间,这里会覆盖)
231
+     * @return true / false
232
+     */
233
+    public boolean hset(String key, String item, Object value, long time) {
234
+        try {
235
+            redisTemplate.opsForHash().put(key, item, value);
236
+            if (time > 0) {
237
+                expire(key, time);
238
+            }
239
+            return true;
240
+        } catch (Exception e) {
241
+            e.printStackTrace();
242
+            return false;
243
+        }
244
+    }
245
+
246
+    /**
247
+     * 删除 Hash表 中的值
248
+     * @param key 键
249
+     * @param item 项(可以多个,no null)
250
+     */
251
+    public void hdel(String key, Object... item) {
252
+        redisTemplate.opsForHash().delete(key, item);
253
+    }
254
+
255
+    /**
256
+     * 判断 Hash表 中是否有该键的值
257
+     * @param key 键(no null)
258
+     * @param item 值(no null)
259
+     * @return true / false
260
+     */
261
+    public boolean hHasKey(String key, String item) {
262
+        return redisTemplate.opsForHash().hasKey(key, item);
263
+    }
264
+
265
+    /**
266
+     * Hash递增,如果不存在则创建一个,并把新增的值返回
267
+     * @param key 键
268
+     * @param item 项
269
+     * @param by 递增大小 > 0
270
+     * @return
271
+     */
272
+    public Double hincr(String key, String item, Double by) {
273
+        return redisTemplate.opsForHash().increment(key, item, by);
274
+    }
275
+
276
+    /**
277
+     * Hash递减
278
+     * @param key 键
279
+     * @param item 项
280
+     * @param by 递减大小
281
+     * @return
282
+     */
283
+    public Double hdecr(String key, String item, Double by) {
284
+        return redisTemplate.opsForHash().increment(key, item, -by);
285
+    }
286
+
287
+//    ============================== Set ==============================
288
+
289
+    /**
290
+     * 根据 key 获取 set 中的所有值
291
+     * @param key 键
292
+     * @return 值
293
+     */
294
+    public Set<Object> sGet(String key) {
295
+        try {
296
+            return redisTemplate.opsForSet().members(key);
297
+        } catch (Exception e) {
298
+            e.printStackTrace();
299
+            return null;
300
+        }
301
+    }
302
+
303
+    /**
304
+     * 从键为 key 的 set 中,根据 value 查询是否存在
305
+     * @param key 键
306
+     * @param value 值
307
+     * @return true / false
308
+     */
309
+    public boolean sHasKey(String key, Object value) {
310
+        try {
311
+            return redisTemplate.opsForSet().isMember(key, value);
312
+        } catch (Exception e) {
313
+            e.printStackTrace();
314
+            return false;
315
+        }
316
+    }
317
+
318
+    /**
319
+     * 将数据放入 set缓存
320
+     * @param key 键值
321
+     * @param values 值(可以多个)
322
+     * @return 成功个数
323
+     */
324
+    public long sSet(String key, Object... values) {
325
+        try {
326
+            return redisTemplate.opsForSet().add(key, values);
327
+        } catch (Exception e) {
328
+            e.printStackTrace();
329
+            return 0;
330
+        }
331
+    }
332
+
333
+    /**
334
+     * 将数据放入 set缓存,并设置时间
335
+     * @param key 键
336
+     * @param time 时间
337
+     * @param values 值(可以多个)
338
+     * @return 成功放入个数
339
+     */
340
+    public long sSet(String key, long time, Object... values) {
341
+        try {
342
+            long count = redisTemplate.opsForSet().add(key, values);
343
+            if (time > 0) {
344
+                expire(key, time);
345
+            }
346
+            return count;
347
+        } catch (Exception e) {
348
+            e.printStackTrace();
349
+            return 0;
350
+        }
351
+    }
352
+
353
+    /**
354
+     * 获取 set缓存的长度
355
+     * @param key 键
356
+     * @return 长度
357
+     */
358
+    public long sGetSetSize(String key) {
359
+        try {
360
+            return redisTemplate.opsForSet().size(key);
361
+        } catch (Exception e) {
362
+            e.printStackTrace();
363
+            return 0;
364
+        }
365
+    }
366
+
367
+    /**
368
+     * 移除 set缓存中,值为 value 的
369
+     * @param key 键
370
+     * @param values 值
371
+     * @return 成功移除个数
372
+     */
373
+    public long setRemove(String key, Object... values) {
374
+        try {
375
+            return redisTemplate.opsForSet().remove(key, values);
376
+        } catch (Exception e) {
377
+            e.printStackTrace();
378
+            return 0;
379
+        }
380
+    }
381
+
382
+//    ============================== List ==============================
383
+
384
+    /**
385
+     * 获取 list缓存的内容
386
+     * @param key 键
387
+     * @param start 开始
388
+     * @param end 结束(0 到 -1 代表所有值)
389
+     * @return
390
+     */
391
+    public List<Object> lGet(String key, long start, long end) {
392
+        try {
393
+            return redisTemplate.opsForList().range(key, start, end);
394
+        } catch (Exception e) {
395
+            e.printStackTrace();
396
+            return null;
397
+        }
398
+    }
399
+
400
+    /**
401
+     * 获取 list缓存的长度
402
+     * @param key 键
403
+     * @return 长度
404
+     */
405
+    public long lGetListSize(String key) {
406
+        try {
407
+            return redisTemplate.opsForList().size(key);
408
+        } catch (Exception e) {
409
+            e.printStackTrace();
410
+            return 0;
411
+        }
412
+    }
413
+
414
+    /**
415
+     * 根据索引 index 获取键为 key 的 list 中的元素
416
+     * @param key 键
417
+     * @param index 索引
418
+     *              当 index >= 0 时 {0:表头, 1:第二个元素}
419
+     *              当 index < 0 时 {-1:表尾, -2:倒数第二个元素}
420
+     * @return 值
421
+     */
422
+    public Object lGetIndex(String key, long index) {
423
+        try {
424
+            return redisTemplate.opsForList().index(key, index);
425
+        } catch (Exception e) {
426
+            e.printStackTrace();
427
+            return null;
428
+        }
429
+    }
430
+
431
+    /**
432
+     * 将值 value 插入键为 key 的 list 中,如果 list 不存在则创建空 list
433
+     * @param key 键
434
+     * @param value 值
435
+     * @return true / false
436
+     */
437
+    public boolean lSet(String key, Object value) {
438
+        try {
439
+            redisTemplate.opsForList().rightPush(key, value);
440
+            return true;
441
+        } catch (Exception e) {
442
+            e.printStackTrace();
443
+            return false;
444
+        }
445
+    }
446
+
447
+    /**
448
+     * 将值 value 插入键为 key 的 list 中,并设置时间
449
+     * @param key 键
450
+     * @param value 值
451
+     * @param time 时间
452
+     * @return true / false
453
+     */
454
+    public boolean lSet(String key, Object value, long time) {
455
+        try {
456
+            redisTemplate.opsForList().rightPush(key, value);
457
+            if (time > 0) {
458
+                expire(key, time);
459
+            }
460
+            return true;
461
+        } catch (Exception e) {
462
+            e.printStackTrace();
463
+            return false;
464
+        }
465
+    }
466
+
467
+    /**
468
+     * 将 values 插入键为 key 的 list 中
469
+     * @param key 键
470
+     * @param values 值
471
+     * @return true / false
472
+     */
473
+    public boolean lSetList(String key, List<Object> values) {
474
+        try {
475
+            redisTemplate.opsForList().rightPushAll(key, values);
476
+            return true;
477
+        } catch (Exception e) {
478
+            e.printStackTrace();
479
+            return false;
480
+        }
481
+    }
482
+
483
+    /**
484
+     * 将 values 插入键为 key 的 list 中,并设置时间
485
+     * @param key 键
486
+     * @param values 值
487
+     * @param time 时间
488
+     * @return true / false
489
+     */
490
+    public boolean lSetList(String key, List<Object> values, long time) {
491
+        try {
492
+            redisTemplate.opsForList().rightPushAll(key, values);
493
+            if (time > 0) {
494
+                expire(key, time);
495
+            }
496
+            return true;
497
+        } catch (Exception e) {
498
+            e.printStackTrace();
499
+            return false;
500
+        }
501
+    }
502
+
503
+    /**
504
+     * 根据索引 index 修改键为 key 的值
505
+     * @param key 键
506
+     * @param index 索引
507
+     * @param value 值
508
+     * @return true / false
509
+     */
510
+    public boolean lUpdateIndex(String key, long index, Object value) {
511
+        try {
512
+            redisTemplate.opsForList().set(key, index, value);
513
+            return true;
514
+        } catch (Exception e) {
515
+            e.printStackTrace();
516
+            return false;
517
+        }
518
+    }
519
+
520
+    /**
521
+     * 在键为 key 的 list 中删除值为 value 的元素
522
+     * @param key 键
523
+     * @param count 如果 count == 0 则删除 list 中所有值为 value 的元素
524
+     *              如果 count > 0 则删除 list 中最左边那个值为 value 的元素
525
+     *              如果 count < 0 则删除 list 中最右边那个值为 value 的元素
526
+     * @param value
527
+     * @return
528
+     */
529
+    public long lRemove(String key, long count, Object value) {
530
+        try {
531
+            return redisTemplate.opsForList().remove(key, count, value);
532
+        } catch (Exception e) {
533
+            e.printStackTrace();
534
+            return 0;
535
+        }
536
+    }
537
+
538
+}