application.properties 文件内容
1 #Redis数据库索引(默认为0) 2 spring.redis.database=0 3 #Redis服务器地址 4 spring.redis.host=localhost 5 #Redis服务器连接端口 6 spring.redis.port=6379 7 #Redis服务器连接密码(默认为空) 8 spring.redis.password= 9 #连接池最大连接数(使用负值表示没有限制) 10 spring.redis.jedis.pool.max-active=200 11 #连接池最大阻塞等待时间(使用负值表示没有限制) 12 spring.redis.lettuce.pool.max-wait=-1 13 #连接池中的最大空闲连接 14 spring.redis.jedis.pool.max-idle=10 15 #连接池中的最小空闲连接 16 spring.redis.jedis.pool.min-idle=0 17 #连接超时时间(毫秒) 18 spring.redis.timeout=1000
接下来我们自己创建一个RedisTemplate实例,不用SpringBoot自动为我们创建的那个
1 import com.fasterxml.jackson.annotation.JsonAutoDetect; 2 import com.fasterxml.jackson.annotation.PropertyAccessor; 3 import com.fasterxml.jackson.databind.ObjectMapper; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.data.redis.connection.RedisConnectionFactory; 7 import org.springframework.data.redis.core.RedisTemplate; 8 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; 9 import org.springframework.data.redis.serializer.StringRedisSerializer; 10 11 @Configuration 12 public class RedisConfig { 13 @Bean 14 @SuppressWarnings("all") 15 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { 16 RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); 17 template.setConnectionFactory(factory); 18 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); 19 ObjectMapper om = new ObjectMapper(); 20 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 21 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 22 jackson2JsonRedisSerializer.setObjectMapper(om); 23 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); 24 // key采用String的序列化方式 25 template.setKeySerializer(stringRedisSerializer); 26 // hash的key也采用String的序列化方式 27 template.setHashKeySerializer(stringRedisSerializer); 28 // value序列化方式采用jackson 29 template.setValueSerializer(jackson2JsonRedisSerializer); 30 // hash的value序列化方式采用jackson 31 template.setHashValueSerializer(jackson2JsonRedisSerializer); 32 template.afterPropertiesSet(); 33 return template; 34 } 35 }
1 import org.springframework.beans.factory.annotation.Autowired; 2 import org.springframework.data.redis.core.RedisTemplate; 3 import org.springframework.stereotype.Component; 4 import org.springframework.util.CollectionUtils; 5 import java.util.List; 6 import java.util.Map; 7 import java.util.Set; 8 import java.util.concurrent.TimeUnit; 9 10 @Component 11 public class RedisUtil { 12 /** 13 * Redis工具类 14 * @author ZENG.XIAO.YAN 15 * @date 年6月7日 16 */ 17 @Autowired 18 private RedisTemplate<String, Object> redisTemplate; 19 // =============================common============================ 20 /** 21 * 指定缓存失效时间 22 * 23 * @param key 键 24 * @param time 时间(秒) 25 * @return 26 */ 27 public boolean expire(String key, long time) { 28 try { 29 if (time > 0) { 30 redisTemplate.expire(key, time, TimeUnit.SECONDS); 31 } 32 return true; 33 } catch (Exception e) { 34 e.printStackTrace(); 35 return false; 36 } 37 } 38 39 /** 40 * 根据key 获取过期时间 41 * @param key 键 不能为null 42 * @return 时间(秒) 返回0代表为永久有效 43 */ 44 public long getExpire(String key) { 45 return redisTemplate.getExpire(key, TimeUnit.SECONDS); 46 } 47 48 /** 49 * 判断key是否存在 50 * @param key 键 51 * @return true 存在 false不存在 52 */ 53 public boolean hasKey(String key) { 54 try { 55 return redisTemplate.hasKey(key); 56 } catch (Exception e) { 57 e.printStackTrace(); 58 return false; 59 } 60 } 61 /** 62 * 删除缓存 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 redisTemplate.delete(CollectionUtils.arrayToList(key)); 72 } 73 } 74 } 75 // ============================String============================= 76 77 /** 78 * 普通缓存获取 79 * @param key 键 80 * @return 值 81 */ 82 public Object get(String key) { 83 return (key == null) ? null : redisTemplate.opsForValue().get(key); 84 } 85 /** 86 * 普通缓存放入 87 * @param key 键 88 * @param value 值 89 * @return true成功 false失败 90 */ 91 public boolean set(String key, Object value) { 92 try { 93 redisTemplate.opsForValue().set(key, value); 94 95 return true; 96 } catch (Exception e) { 97 e.printStackTrace(); 98 return false; 99 } 100 } 101 /** 102 * 普通缓存放入并设置时间 103 * @param key 键 104 * @param value 值 105 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 106 * @return true成功 false 失败 107 */ 108 public boolean set(String key, Object value, long time) { 109 try { 110 if (time > 0) { 111 redisTemplate.opsForValue() 112 .set(key, value, time, TimeUnit.SECONDS); 113 } else { 114 set(key, value); 115 } 116 return true; 117 } catch (Exception e) { 118 e.printStackTrace(); 119 return false; 120 } 121 } 122 /** 123 * 递增 124 * @param key 键 125 * @param delta 要增加几(大于0) 126 * @return 127 */ 128 public long incr(String key, long delta) { 129 if (delta < 0) { 130 throw new RuntimeException("递增因子必须大于0"); 131 } 132 return redisTemplate.opsForValue().increment(key, delta); 133 } 134 /** 135 * 递减 136 * @param key 键 137 * @param delta 要减少几(小于0) 138 * @return 139 */ 140 public long decr(String key, long delta) { 141 if (delta < 0) { 142 throw new RuntimeException("递减因子必须大于0"); 143 } 144 return redisTemplate.opsForValue().increment(key, -delta); 145 } 146 // ================================Map================================= 147 /** 148 * HashGet 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 /** 167 * HashSet 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 * @param key 键 184 * @param map 对应多个键值 185 * @param time 时间(秒) 186 * @return true成功 false失败 187 */ 188 public boolean hmset(String key, Map<String, Object> map, long time) { 189 try { 190 redisTemplate.opsForHash().putAll(key, map); 191 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 * @param key 键 204 * @param item 项 205 * @param value 值 206 * @return true 成功 false失败 207 */ 208 public boolean hset(String key, String item, Object value) { 209 try { 210 redisTemplate.opsForHash().put(key, item, value); 211 return true; 212 } catch (Exception e) { 213 e.printStackTrace(); 214 215 return false; 216 } 217 } 218 /** 219 * 向一张hash表中放入数据,如果不存在将创建 220 * @param key 键 221 * @param item 项 222 * @param value 值 223 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 224 * @return true 成功 false失败 225 */ 226 public boolean hset(String key, String item, Object value, long time) { 227 try { 228 redisTemplate.opsForHash().put(key, item, value); 229 if (time > 0) { 230 expire(key, time); 231 } 232 return true; 233 } catch (Exception e) { 234 e.printStackTrace(); 235 return false; 236 } 237 } 238 /** 239 * 删除hash表中的值 240 * @param key 键 不能为null 241 * @param item 项 可以使多个 不能为null 242 */ 243 public void hdel(String key, Object... item) { 244 redisTemplate.opsForHash().delete(key, item); 245 } 246 /** 247 * 判断hash表中是否有该项的值 248 * @param key 键 不能为null 249 * @param item 项 不能为null 250 * @return true 存在 false不存在 251 */ 252 public boolean hHasKey(String key, String item) { 253 return redisTemplate.opsForHash().hasKey(key, item); 254 } 255 /** 256 * hash递增 如果不存在,就会创建一个 并把新增后的值返回 257 * @param key 键 258 * @param item 项 259 * @param by 要增加几(大于0) 260 * @return 261 */ 262 public double hincr(String key, String item, double by) { 263 return redisTemplate.opsForHash().increment(key, item, by); 264 } 265 /** 266 * hash递减 267 * @param key 键 268 * @param item 项 269 * @param by 要减少记(小于0) 270 * @return 271 */ 272 public double hdecr(String key, String item, double by) { 273 return redisTemplate.opsForHash().increment(key, item, -by); 274 } 275 // ============================set============================= 276 /** 277 * 根据key获取Set中的所有值 278 * @param key 键 279 * @return 280 */ 281 public Set<Object> sGet(String key) { 282 try { 283 return redisTemplate.opsForSet().members(key); 284 } catch (Exception e) { 285 e.printStackTrace(); 286 return null; 287 } 288 } 289 /** 290 * 根据value从一个set中查询,是否存在 291 * @param key 键 292 * @param value 值 293 * @return true 存在 false不存在 294 */ 295 public boolean sHasKey(String key, Object value) { 296 try { 297 return redisTemplate.opsForSet().isMember(key, value); 298 } catch (Exception e) { 299 e.printStackTrace(); 300 return false; 301 } 302 } 303 /** 304 * 将数据放入set缓存 305 * @param key 键 306 * @param values 值 可以是多个 307 * @return 成功个数 308 */ 309 public long sSet(String key, Object... values) { 310 try { 311 return redisTemplate.opsForSet().add(key, values); 312 } catch (Exception e) { 313 e.printStackTrace(); 314 return 0; 315 } 316 } 317 /** 318 * 将set数据放入缓存 319 * @param key 键 320 * @param time 时间(秒) 321 * @param values 值 可以是多个 322 * @return 成功个数 323 */ 324 public long sSetAndTime(String key, long time, Object... values) { 325 try { 326 Long count = redisTemplate.opsForSet().add(key, values); 327 328 if (time > 0) { 329 expire(key, time); 330 } 331 return count; 332 } catch (Exception e) { 333 e.printStackTrace(); 334 return 0; 335 } 336 } 337 /** 338 * 获取set缓存的长度 339 * 340 * @param key 键 341 * @return 342 */ 343 public long sGetSetSize(String key) { 344 try { 345 return redisTemplate.opsForSet().size(key); 346 } catch (Exception e) { 347 e.printStackTrace(); 348 return 0; 349 } 350 } 351 /** 352 * 移除值为value的 353 * @param key 键 354 * @param values 值 可以是多个 355 * @return 移除的个数 356 */ 357 public long setRemove(String key, Object... values) { 358 try { 359 Long count = redisTemplate.opsForSet().remove(key, values); 360 361 return count; 362 } catch (Exception e) { 363 e.printStackTrace(); 364 return 0; 365 } 366 } 367 // ===============================list================================= 368 369 /** 370 * 获取list缓存的内容 371 * @param key 键 372 * @param start 开始 373 * @param end 结束 0 到 -1代表所有值 374 * @return 375 */ 376 public List<Object> lGet(String key, long start, long end) { 377 try { 378 return redisTemplate.opsForList().range(key, start, end); 379 } catch (Exception e) { 380 e.printStackTrace(); 381 return null; 382 } 383 } 384 /** 385 * 获取list缓存的长度 386 * 387 * @param key 键 388 * @return 389 */ 390 public long lGetListSize(String key) { 391 try { 392 return redisTemplate.opsForList().size(key); 393 } catch (Exception e) { 394 e.printStackTrace(); 395 return 0; 396 } 397 } 398 /** 399 * 通过索引 获取list中的值 400 * @param key 键 401 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 402 * @return 403 */ 404 public Object lGetIndex(String key, long index) { 405 try { 406 return redisTemplate.opsForList().index(key, index); 407 } catch (Exception e) { 408 e.printStackTrace(); 409 return null; 410 } 411 } 412 /** 413 * 将list放入缓存 414 * @param key 键 415 * @param value 值 416 * @param time 时间(秒) 417 * @return 418 */ 419 public boolean lSet(String key, Object value) { 420 try { 421 redisTemplate.opsForList().rightPush(key, value); 422 return true; 423 } catch (Exception e) { 424 e.printStackTrace(); 425 return false; 426 } 427 } 428 /** 429 * 将list放入缓存 430 * @param key 键 431 * @param value 值 432 * @param time 时间(秒) 433 * @return 434 */ 435 public boolean lSet(String key, Object value, long time) { 436 try { 437 redisTemplate.opsForList().rightPush(key, value); 438 if (time > 0) { 439 expire(key, time); 440 } 441 return true; 442 } catch (Exception e) { 443 e.printStackTrace(); 444 return false; 445 } 446 } 447 /** 448 * 将list放入缓存 449 * 450 * @param key 键 451 * @param value 值 452 * @param time 时间(秒) 453 * @return 454 */ 455 public boolean lSet(String key, List<Object> value) { 456 try { 457 redisTemplate.opsForList().rightPushAll(key, value); 458 return true; 459 } catch (Exception e) { 460 e.printStackTrace(); 461 return false; 462 } 463 } 464 465 /** 466 * 将list放入缓存 467 * @param key 键 468 * @param value 值 469 * @param time 时间(秒) 470 * @return 471 */ 472 public boolean lSet(String key, List<Object> value, long time) { 473 try { 474 redisTemplate.opsForList().rightPushAll(key, value); 475 if (time > 0) { 476 expire(key, time); 477 } 478 return true; 479 } catch (Exception e) { 480 e.printStackTrace(); 481 return false; 482 } 483 } 484 /** 485 * 根据索引修改list中的某条数据 486 * @param key 键 487 * @param index 索引 488 * @param value 值 489 * @return 490 */ 491 public boolean lUpdateIndex(String key, long index, Object value) { 492 try { 493 redisTemplate.opsForList().set(key, index, value); 494 return true; 495 } catch (Exception e) { 496 e.printStackTrace(); 497 498 return false; 499 } 500 } 501 /** 502 * 移除N个值为value 503 * @param key 键 504 * @param count 移除多少个 505 * @param value 值 506 * @return 移除的个数 507 */ 508 public long lRemove(String key, long count, Object value) { 509 try { 510 Long remove = redisTemplate.opsForList().remove(key, count, value); 511 512 return remove; 513 } catch (Exception e) { 514 e.printStackTrace(); 515 return 0; 516 } 517 } 518 }