激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - Redis整合SpringBoot的RedisTemplate實現類(實例詳解)

Redis整合SpringBoot的RedisTemplate實現類(實例詳解)

2021-02-24 17:51小鵬子的博客 Redis

這篇文章主要介紹了Redis整合SpringBoot的RedisTemplate實現類,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Redis整合SpringBoot》》RedisService 接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
package com.tuan.common.base.redis;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public interface RedisService {
 
 //Redis 字符串(String)
 
 /**
  * 模糊值再刪除
  * @param key
  * @return
  */
 boolean delslike(String key);
 
 /**
  * 通過鍵來獲取值
  * @param key
  * @return String
  */
 String get(String key);
 
 /**
  * 獲取值裝成Int類型
  * @param key
  * @return
  */
 Integer getInt(String key);
 
 /**
  * 刪除一個鍵
  * @param key
  * @return
  */
 boolean del(String key);
 
 /**
  * key設置value 沒有失效時間
  * @param key
  * @param value
  */
 void set(String key, String value);
 /**
  * key設置value 有失效時間
  * @param key
  * @param value
  * @param expire
  */
 void set(String key, String value, Integer expire);
 
 /**
  * 向key遞增1
  * @param key
  * @return
  */
 Long incr(String key);
 
 /**
  * 向key遞增1 ,設置expire失效時間
  * @param key
  * @param expire
  * @return
  */
 Long incr(String key, Integer expire);
 
 /**
  * 向key遞增delta數值 并設置expire失效時間
  * @param key
  * @param delta
  * @param expire
  * @return
  */
 Long incr(String key, int delta, Integer expire);
 /**
  * 向key遞減1
  * @param key
  * @return
  */
 Long decr(String key);
 /**
  * 向key遞減1 ,設置expire失效時間
  * @param key
  * @param expire
  * @return
  */
 Long decr(String key, Integer expire);
 
 /**
  * 向key設置expire失效時間
  * @param key
  * @param expire
  */
 void expire(String key, Integer expire);
 
 /**
  * 判斷key是不存在,設值為1和設置失效時間 成功返回 true
  * 判斷key是存在,直接返回false
  * @param key
  * @param expire
  * @return
  */
 boolean setnx(String key, Integer expire);
 /**
  * 判斷key是不存在,設值為value和設置失效時間 成功返回 true
  * 判斷key是存在,直接返回false
  * @param key
  * @param expire
  * @return
  */
 boolean setnxv(String key,String value ,Integer expire);
 
 /**
  * 判斷鍵是否存在
  * @param key
  * @return
  */
 Boolean hasKey(String key);
 //Redis 集合(Set)
 /**
 Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重復的數據。
 Redis 中集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
  */
 
 /**
  * Redis Sadd 命令將一個或多個成員元素加入到集合中,已經存在于集合的成員元素將被忽略。
  * 假如集合 key 不存在,則創建一個只包含添加的元素作成員的集合。
  * 當集合 key 不是集合類型時,返回一個錯誤。
  * 注意:在 Redis2.4 版本以前, SADD 只接受單個成員值。
  */
 /**
  * 設置set 不重復的值,
  * 向key插入value值 ,
  * expire為鍵的失效時間
  * @param key
  * @param value
  * @param expire null 無時間
  */
 void sadd(String key, String value, Integer expire);
 
 /**
  * 向key鍵 的set 刪除一個元素memeber
  * @param key
  * @param memeber
  */
 void srem(String key, String memeber);
 
 /**
  * set中命令判斷成員元素是否是集合的成員。
  * @param key
  * @param value
  * @return
  */
 boolean sismember(String key, String value);
 
 /**
  * set取出key所有的數據
  * @param key
  * @return
  */
 Set<String> smembers(String key);
 
 /**
  * set中這個key值的數量
  * @param key
  * @return
  */
 Long ssize(String key);
 
 //Redis 列表(List)
 /**
 Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
 一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)。
  */
 
 /**
  * 取得key分頁的數據
  * @param key list 的鍵
  * @param start 開始下標
  * @param end 結束下標
  * @return
  */
 List<String> lrange(String key, int start, int end);
 
 /**
  * list取key的下值的數量
  * @param key
  * @return
  */
 int llen(String key);
 
 /**
  *   開始---結尾
  * 向右添加數據 左---→右 添加數據
  * @param key list 鍵
  * @param value 添加到list的值
  * @param expire list 失效時間
  */
 void rpush(String key, String value, Integer expire);
 /**
  *   結尾---開始
  * 向左添加數據 右---→左 添加數據
  * @param key list 鍵
  * @param value 添加到list的值
  * @param expire list 失效時間
  */
 void lpush(String key, String value, Integer expire);
 
 /**
  * list中這個key鍵下刪除count個value值
  * @param key list 鍵
  * @param count 刪除多少個值
  * @param value list 中的值
  */
 void rmpush(String key,Integer count, String value);
 
 /**
  * 移出并獲取列表的第一個元素(下標為0的元素)
  * @param key list 鍵
  * @return
  */
 String lpop(String key);
 
 // Redis 有序集合(sorted set)
    /**
    Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
    不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
    有序集合的成員是唯一的,但分數(score)卻可以重復。
    集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
     */
 
 /**
  * Redis Zadd 命令用于將一個或多個成員元素及其分數值加入到有序集當中。
  * 如果某個成員已經是有序集的成員,那么更新這個成員的分數值,并通過重新插入這個成員元素,來保證該成員在正確的位置上。
  * 分數值可以是整數值或雙精度浮點數。
  * 如果有序集合 key 不存在,則創建一個空的有序集并執行 ZADD 操作。
  * 當 key 存在但不是有序集類型時,返回一個錯誤。
  * 注意: 在 Redis 2.4 版本以前, ZADD 每次只能添加一個元素。
  */
 
  /**
  * @param key 有序集合 key
  * @param member 成員元素
  * @param score 成員的分數值
  * @return 成功與否
  */
 boolean zadd(String key, String member, double score, Integer expire);
 
 /**
  * Redis Zinterstore 命令計算給定的一個或多個有序集的交集,其中給定 key 的數量必須以 numkeys 參數指定,并將該交集(結果集)儲存到 destination 。
  * 默認情況下,結果集中某個成員的分數值是所有給定集下該成員分數值之和
  */
 long zinterstore(String key, List<String> otherKeys, String destKey, Integer expire);
 
 /**
  * 獲取有序集合的第一個元素,通過索引區間來實現,而不是通過分數
  * @param key
  * @return
  */
 String zfirst(String key);
 
 /**
  * 刪除zset中指定的member值
  * @param key
  * @param member
  * @return
  */
 boolean zrem(String key, String member);
 
 /**
  * zset取出key中所有的數據
  * @param key
  * @return
  */
 Map<String, Double> zscan(String key);
 
 /**
  * 對key的zset中member進行遞增或者遞減incrScore值
  * @param key zset 鍵
  * @param member 目標
  * @param incrScore 要改變的數值
  * @param expire 失效時間
  * @return
  */
 Double zincrby(String key, String member, double incrScore, Integer expire);
 
 /**
  * 找到對key的zset中member值(也就是這個member分數)
  * @param key
  * @param member
  * @return
  */
 Double zscore(String key, String member);
 
 //Redis 哈希(Hash)
 
 /**
 Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。
 Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
  */
 
 /**
  * 添加 hash對象
  * hash一般存儲對象 key 標記那個用戶
  * hashKey用戶下的什么信息
  * value 具體數據
  * @param key hash 的鍵
  * @param hashKey 目標鍵
  * @param value 存儲的值
  * @param expire 失效時間
  */
 void hput(String key, String hashKey, Object value, Integer expire);
 
 /**
  * 刪除 hash對象 key鍵 中的 hashKey
  * @param key
  * @param hashKey
  */
 void hdel(String key, String hashKey);
 
 /**
  * 獲取 hash對象 key鍵 中的 hashKey具體的數據
  * @param key
  * @param hashKey
  */
 Object hget(String key, String hashKey);
 
 /**
  * 獲取 hash對象 key鍵 下有多少個對象數量
  * @param key
  * @return
  */
 Long hsize(String key);
 
 /**
  *獲 取 hash對象 key鍵 下有所有的對象
  * @param key
  * @return
  */
 List<Object> hgetAll(String key);
 
 //Redis 管道(Pipeline)
 
 /**
  * 這個過程稱為Round trip time(簡稱RTT, 往返時間),mget mset有效節約了RTT,
  * 但大部分命令(如hgetall,并沒有mhgetall)不支持批量操作,需要消耗N次RTT ,
  * 這個時候需要pipeline來解決這個問題
  */
 
 /**
  * 管道批量插入
  * @author DuanLinpeng
  * @date 2021/01/08 15:15
  * @param saveList
  * @param unit
  * @param timeout
  * @return void
  */
  void batchInsert(List<Map<String, String>> saveList, TimeUnit unit, int timeout);
 
 /**
  * batchGet管道形式(推薦,性能高,類型多)
  * @param keyList
  * @return
  */
  List<String> batchGet(List<String> keyList);
 
 /**
  * multiGet批量查詢(只能是str)
  * @param keys
  * @return List<String>
  */
 List<String> getmultiet(List<String> keys);
 
}

Redis整合SpringBoot》》 RedisServiceImpl 實現

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
package com.tuan.common.base.redis.impl;
 
import com.tuan.common.base.redis.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.StringRedisConnection;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
 
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
 
@Service
public class RedisServiceImpl implements RedisService {
 private final String KVS_KEY_SPLIT = "-";
 
 @Value("${spring.application.name}")
 private String applicationName;
 @Value("${spring.profiles.active}")
 private String profileActive;
 @Value("${customize.copyright.name.en}")
 private String copyrightEn;
 @Autowired
 private StringRedisTemplate stringRedisTemplate;
 
 /**
  * stringRedisTemplate.opsForValue();  //操作字符串
  * stringRedisTemplate.opsForHash();   //操作hash
  * stringRedisTemplate.opsForList();   //操作list
  * stringRedisTemplate.opsForSet();   //操作set
  * stringRedisTemplate.opsForZSet();   //操作有序set
  */
 
 /**
  * assembleCacheKey所有鍵的拼接
  * @param key
  * @return
  */
 private String assembleCacheKey(String key) {
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return copyrightEn + KVS_KEY_SPLIT + applicationName + KVS_KEY_SPLIT + profileActive + KVS_KEY_SPLIT + key;
 }
 
 @Override
 public List<String> getmultiet(List<String> keys) {
  if (CollectionUtils.isEmpty(keys)) {
   return null;
  }
  keys= keys.stream().map( key -> assembleCacheKey(key)).collect(Collectors.toList());
  return stringRedisTemplate.opsForValue().multiGet(keys);
 }
 
 @Override
 public String get(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForValue().get(key);
 }
 
 @Override
 public List<String> lrange(String key, int start, int end) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForList().range(key, start, end);
 }
 
 @Override
 public int llen(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return 0;
  }
  Long size = stringRedisTemplate.opsForList().size(key);
  return null == size ? 0 : size.intValue();
 }
 
 @Override
 public Integer getInt(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  String value = stringRedisTemplate.opsForValue().get(key);
  if (StringUtils.isEmpty(value)) {
   return null;
  }
  try {
   return Integer.valueOf(value);
  } catch (NumberFormatException e) {
   e.printStackTrace();
   return null;
  }
 }
 
 @Override
 public boolean del(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return false;
  }
  try {
   Boolean delete = stringRedisTemplate.delete(key);
   return null != delete && delete;
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  }
 }
 
 @Override
 public boolean delslike(String key) {
  key = assembleCacheKey(key);
  Set<String> keys = stringRedisTemplate.keys(key);
  if (StringUtils.isEmpty(key)) {
   return false;
  }
  try {
   Long delete = stringRedisTemplate.delete(keys);
   return delete > 0 ?true:false;
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  }
 }
 
 @Override
 public void set(String key, String value) {
  set(key, value, null);
 }
 
 @Override
 public void set(String key, String value, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
   return;
  }
  if (null != expire) {
   stringRedisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
  } else {
   stringRedisTemplate.opsForValue().set(key, value);
  }
 }
 
 @Override
 public Long incr(String key) {
  return incr(key, 1, null);
 }
 
 @Override
 public Long incr(String key, Integer expire) {
  return incr(key, 1, expire);
 }
 
 @Override
 public Long incr(String key, int delta, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  Long ret = stringRedisTemplate.opsForValue().increment(key, delta);
  if (null != expire) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
  return ret;
 }
 
 @Override
 public Long decr(String key) {
  return incr(key, -1, null);
 }
 
 @Override
 public Long decr(String key, Integer expire) {
  return incr(key, -1, expire);
 }
 
 @Override
 public void rpush(String key, String value, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
   return;
  }
  stringRedisTemplate.opsForList().rightPush(key, value);
  if (null != expire) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
 }
 
 @Override
 public void lpush(String key, String value, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
   return;
  }
  stringRedisTemplate.opsForList().leftPush(key, value);
  if (null != expire) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
 }
 
 @Override
 public void rmpush(String key, Integer count, String value) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
   return;
  }
  stringRedisTemplate.opsForList().remove(key,count, value);
 }
 
 @Override
 public String lpop(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForList().leftPop(key);
 }
 
 @Override
 public void expire(String key, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return;
  }
  if (null != expire) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
 }
 
 @Override
 public boolean setnx(String key, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return false;
  }
  Boolean ret = stringRedisTemplate.opsForValue().setIfAbsent(key, "1");
  if (null == ret || !ret) {
   return false;
  }
  if (null != expire) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
  return true;
 }
 
 @Override
 public boolean setnxv(String key,String value ,Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return false;
  }
  Boolean ret = stringRedisTemplate.opsForValue().setIfAbsent(key, value);
  if (null == ret || !ret) {
   return false;
  }
  if (null != expire) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
  return true;
 }
 
 @Override
 public Boolean hasKey(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return false;
  }
  Boolean result = stringRedisTemplate.hasKey(key);
  return null == result ? false : result;
 }
 
 @Override
 public void sadd(String key, String value, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
   return;
  }
  Long result = stringRedisTemplate.opsForSet().add(key, value);
  if (null != expire && null != result && result > 0) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
 }
 
 @Override
 public void srem(String key, String memeber) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key) || StringUtils.isEmpty(memeber)) {
   return;
  }
  stringRedisTemplate.opsForSet().remove(key, memeber);
 }
 
 @Override
 public boolean sismember(String key, String value) {
  if (StringUtils.isEmpty(value)) {
   return false;
  }
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return false;
  }
  Boolean result = stringRedisTemplate.opsForSet().isMember(key, value);
  return null == result ? false : result;
 }
 
 @Override
 public Set<String> smembers(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForSet().members(key);
 }
 
 @Override
 public Long ssize(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForSet().size(key);
 }
 
 @Override
 public boolean zadd(String key, String member, double score, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return false;
  }
  Boolean result = stringRedisTemplate.opsForZSet().add(key, member, score);
  if (null == result || !result) {
   return false;
  }
  if (null != expire) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
  return true;
 }
 
 @Override
 public long zinterstore(String key, List<String> otherKeys, String destKey, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return 0;
  }
  destKey = assembleCacheKey(destKey);
  if (StringUtils.isEmpty(destKey)) {
   return 0;
  }
  if (CollectionUtils.isEmpty(otherKeys)) {
   return 0;
  }
  List<String> finalOtherKeys = new ArrayList<>();
  for (String eachOtherKey : otherKeys) {
   finalOtherKeys.add(assembleCacheKey(eachOtherKey));
  }
  Long result = stringRedisTemplate.opsForZSet().intersectAndStore(key, finalOtherKeys, destKey);
  if (null == result || result <= 0) {
   return 0;
  }
  if (null != expire) {
   stringRedisTemplate.expire(destKey, expire, TimeUnit.SECONDS);
  }
  return result;
 }
 
 @Override
 public String zfirst(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  Set<String> stringSet = stringRedisTemplate.opsForZSet().range(key, 0, 0);
  return CollectionUtils.isEmpty(stringSet) ? null : stringSet.toArray()[0].toString();
 }
 
 @Override
 public boolean zrem(String key, String member) {
  if (StringUtils.isEmpty(member)) {
   return false;
  }
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return false;
  }
  Long result = stringRedisTemplate.opsForZSet().remove(key, member);
  return null != result && result > 0;
 }
 
 @Override
 public Map<String, Double> zscan(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  try {
   Cursor<ZSetOperations.TypedTuple<String>> tupleCursor = stringRedisTemplate.opsForZSet().scan(key, ScanOptions.scanOptions().build());
   Map<String, Double> result = new HashMap<>();
   while (tupleCursor.hasNext()) {
    ZSetOperations.TypedTuple<String> tuple = tupleCursor.next();
    result.put(tuple.getValue(), tuple.getScore());
   }
   return result;
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
 }
 
 @Override
 public Double zincrby(String key, String member, double incrScore, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  Double score = stringRedisTemplate.opsForZSet().incrementScore(key, member, incrScore);
  if (null != expire && expire > 0) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
  return score;
 }
 
 @Override
 public Double zscore(String key, String member) {
  if (StringUtils.isEmpty(member)) {
   return null;
  }
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForZSet().score(key, member);
 }
 
 @Override
 public void hput(String key, String hashKey, Object value, Integer expire) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return;
  }
  stringRedisTemplate.opsForHash().put(key, hashKey, value);
  if (null != expire && expire > 0) {
   stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
  }
 }
 
 @Override
 public void hdel(String key, String hashKey) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return;
  }
  stringRedisTemplate.opsForHash().delete(key, hashKey);
 }
 
 @Override
 public Object hget(String key, String hashKey) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForHash().get(key, hashKey);
 }
 
 @Override
 public Long hsize(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForHash().size(key);
 }
 
 @Override
 public List<Object> hgetAll(String key) {
  key = assembleCacheKey(key);
  if (StringUtils.isEmpty(key)) {
   return null;
  }
  return stringRedisTemplate.opsForHash().values(key);
 }
 
 @Override
 public void batchInsert(List<Map<String, String>> saveList, TimeUnit unit, int timeout) {
  /* 插入多條數據 */
  stringRedisTemplate.executePipelined(new SessionCallback<Object>() {
   @Override
   public <K, V> Object execute(RedisOperations<K, V> redisOperations) throws DataAccessException {
    for (Map<String, String> needSave : saveList) {
     stringRedisTemplate.opsForValue().set(needSave.get("key"), needSave.get("value"), timeout,unit);
    }
    return null;
   }
  });
 }
 
 @Override
 public List<String> batchGet(List<String> keyList) {
  /* 批量獲取多條數據 */
  List<Object> objects = stringRedisTemplate.executePipelined(new RedisCallback<String>() {
   @Override
   public String doInRedis(RedisConnection redisConnection) throws DataAccessException {
    StringRedisConnection stringRedisConnection = (StringRedisConnection) redisConnection;
    for (String key : keyList) {
     stringRedisConnection.get(key);
    }
    return null;
   }
  });
 
  List<String> collect = objects.stream().map(val -> String.valueOf(val)).collect(Collectors.toList());
 
  return collect;
 }
 
}

到此這篇關于Redis整合SpringBoot的RedisTemplate實現類的文章就介紹到這了,更多相關Redis整合SpringBoot實現類內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_44519874/article/details/112384702

延伸 · 閱讀

精彩推薦
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
主站蜘蛛池模板: 欧美日韩精品一二三区 | 狠狠婷婷综合久久久久久妖精 | 一区在线视频观看 | 精品久久久久久中文字幕 | 草久在线| 午夜色视频在线观看 | 成人区精品一区二区婷婷 | 国产精品9191| 夜添久久精品亚洲国产精品 | 欧美顶级毛片在线播放小说 | 91在线精品亚洲一区二区 | 日韩在线观看免费 | 成人国产精品一区 | 亚洲第一视频 | 免费在线观看成人网 | 一级做a爱视频 | 久草视频在线看 | 欧产日产国产精品v | 羞羞羞网站 | 91福利在线观看 | 国产精品久久av | 国产精品入口夜色视频大尺度 | 99成人精品视频 | 美女喷水网站 | 久久亚洲激情 | 免费久久久久久 | 精品国产一区二区三区久久久蜜月 | 99久久超碰中文字幕伊人 | 国产精品刺激对白麻豆99 | 国产精品久久久久久久久久 | 国产精品久久久免费观看 | 白白在线免费视频 | 成人 日韩 | 欧美一级毛片大片免费播放 | 黄色大片在线免费看 | 三人弄娇妻高潮3p视频 | 国产欧美日韩在线不卡第一页 | 国产精品免费av一区二区三区 | 日韩一级免费毛片 | 国产91精品一区二区麻豆亚洲 | 欧美一区二区三区免费电影 |