redis工具类-说明文档
- 一、键值设计
- 二、说明文档
- 1、【写】存放key,并设置存活时间 value为字符串
- 2、【写】存放key,设置存活时间 value为泛型对象
- 3、【写】存放key value为字符串
- 4、【读】获取key,返参为字符串
- 5、【读】获取key,返参为泛型对象
- 6、【读】获取key,返参为泛型对象的集合
- 7、【写】删除key的数据
- 8、【写】对指定key进行尝试加锁(在指定时间内获取到锁返回true,获取不到返回false)
- 9、【写】对指定key进行加锁,设置默认值
- 10、【写】获取指定key的锁,在指定时间范围内
- 11、【写】释放锁,删除指定key的数据
- 12、【读】判断key是否存在
- 13、【写】往List头部中追加值-单个
- 14、【写】往List中头追加值-集合(注意集合类型)
- 15、【写】往List尾部中追加值-单个
- 16、【写】往List尾部中追加值-集合(注意集合类型)
- 17、【读】获取List中的头部数据
- 18、【读】获取List中的尾部数据
- 19、【写】设置key过期时间
- 20、【写】修剪现有列表,使其只包含指定的指定范围的元素,起始和停止都是基于0的索引:
- 21、【写】设置key +1
- 22、【写】设置key -1
- 23、【写】设置kry过期时间
一、键值设计
1、key 名设计
可读性和可管理性
以业务名 (或数据库名) 为前缀(防止 key 冲突),用冒号分隔,比如业务名: 表名: id
1 ugc:video:1
简洁性
保证语义的前提下,控制 key 的长度,当 key 较多时,内存占用也不容忽视,例如:
1 user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid}
不要包含特殊字符
反例:包含空格、换行、单双引号以及其他转义字符
2、value 设计
拒绝 bigkey
防止网卡流量、慢查询,string 类型控制在 10KB 以内,hash、list、set、zset 元素个数不要超过 5000。
反例:一个包含 200 万个元素的 list。
非字符串的 bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除,同时要注意防止 bigkey 过期时间自动删除问题 (例如一个 200 万的 zset 设置 1 小时过期,会触发 del 操作,造成阻塞,而且该操作不会不出现在慢查询中 (latency 可查)),查找方法和删除方法
选择适合的数据类型
例如:实体类型 (要合理控制和使用数据结构内存编码优化配置, 例如 ziplist,但也要注意节省内存和性能之间的平衡)
反例:
1 set user:1:name tom 2 set user:1:age 19 3 set user:1:favor football
正例:
1 hmset user:1 name tom age 19 favor football
控制 key 的生命周期
redis 不是垃圾桶,建议使用 expire 设置过期时间 (条件允许可以打散过期时间,防止集中过期),不过期的数据重点关注 idletime。
二、说明文档
1、【写】存放key,并设置存活时间 value为字符串
1 public void set(String key, String obj, long liveSeconds) { 2 redisTemplate.opsForValue().set(key, obj, liveSeconds, TimeUnit.SECONDS); 3 }View Code
2、【写】存放key,设置存活时间 value为泛型对象
1 public void set(String key, T value, long liveSeconds) { 2 String saveObjectString = JSON.toJSONString(value); 3 set(key, saveObjectString, liveSeconds); 4 }View Code
3、【写】存放key value为字符串
1 public void set(String key, String obj) { 2 redisTemplate.opsForValue().set(key, obj); 3 }View Code
4、【读】获取key,返参为字符串
1 public String get(String key) { 2 Object result = redisTemplate.opsForValue().get(key); 3 if (result == null) { 4 return null; 5 } 6 if (result instanceof String) { 7 return (String) redisTemplate.opsForValue().get(key); 8 } 9 return JSON.toJSONString(result); 10 }View Code
5、【读】获取key,返参为泛型对象
1 public <T> Object getObject(final String key, final Class<T> clazz) { 2 String result = get(key); 3 if (StringUtils.isBlank(result)) { 4 return null; 5 } 6 return JSON.parseObject(result, clazz, Feature.OrderedField); 7 }View Code
6、【读】获取key,返参为泛型对象的集合
1 public <T> List<T> getArray(String key, Class<T> clazz) { 2 String result = get(key); 3 return result != null ? JSON.parseArray(result, clazz) : null; 4 }View Code
7、【写】删除key的数据
1 public void delete(String key) { 2 redisTemplate.delete(key); 3 }View Code
8、【写】对指定key进行尝试加锁(在指定时间内获取到锁返回true,获取不到返回false)
1 public boolean tryLock(String redisKey, Object redisValue, Long lockMilliSecond) { 2 if (lockMilliSecond == null) { 3 lockMilliSecond = 1000L;// 默认1s 4 } 5 synchronized (redisKey.intern()) { 6 if (redisTemplate.execute((RedisCallback<Boolean>) redisConnection -> { 7 //定义序列化方式 8 Jackson2JsonRedisSerializer<Object> serializer = (Jackson2JsonRedisSerializer<Object>) redisTemplate.getDefaultSerializer(); 9 byte[] value = serializer.serialize(redisValue.toString()); 10 return redisConnection.setNX(redisKey.getBytes(), value); 11 })) { 12 //设置超时时间,释放内存 13 redisTemplate.expire(redisKey, lockMilliSecond, TimeUnit.MILLISECONDS); 14 return true; 15 } else { 16 return false; 17 } 18 } 19 }View Code
9、【写】对指定key进行加锁,设置默认值
1 public boolean tryLock(String redisKey, Long lockMilliSecond) { 2 return tryLock(redisKey, redisKey, lockMilliSecond); 3 }View Code
10、【写】获取指定key的锁,在指定时间范围内
1 public boolean getRedisLock(String redisKey, Object redisValue, Long lockMilliSecond) throws Exception { 2 3 synchronized (redisKey.intern()) { 4 5 // 系统当前时间,毫秒 6 7 long nowTime = System.currentTimeMillis(); 8 9 while (System.currentTimeMillis() - nowTime < lockMilliSecond + 10) { 10 11 if (tryLock(redisKey, redisValue, lockMilliSecond)) { 12 13 return true; 14 15 } 16 17 // 每次请求等待一段时间 18 19 Thread.sleep(10); 20 21 } 22 23 return false; 24 25 } 26 27 }View Code
11、【写】释放锁,删除指定key的数据
1 public void releaseLock(String key) { 2 3 redisTemplate.delete(key); 4 5 }View Code
12、【读】判断key是否存在
1 public Boolean hasKey(String redisKey,String hashKey){ 2 3 return redisTemplate.opsForHash().hasKey(redisKey,hashKey); 4 5 }View Code
13、【写】往List头部中追加值-单个
1 public Long leftPush(String redisKey,Object value){ 2 3 return redisTemplate.opsForList().leftPush(redisKey,value); 4 5 }View Code
14、【写】往List中头追加值-集合(注意集合类型)
1 public Long leftPush(String redisKey,Object value){ 2 3 return redisTemplate.opsForList().leftPushAll(redisKey,value); 4 5 }View Code
15、【写】往List尾部中追加值-单个
1 public Long rightPush(String redisKey,Object value){ 2 3 return redisTemplate.opsForList().rightPush(redisKey,value); 4 5 }View Code
16、【写】往List尾部中追加值-集合(注意集合类型)
1 public Long rightPushAll(String redisKey,Object value){ 2 3 return redisTemplate.opsForList().rightPushAll(redisKey,value); 4 5 }View Code
17、【读】获取List中的头部数据
1 public Object leftPop(String redisKey){ 2 3 return redisTemplate.opsForList().leftPop(redisKey); 4 5 }View Code
18、【读】获取List中的尾部数据
1 public Object rightPop(String redisKey){ 2 3 return redisTemplate.opsForList().rightPop(redisKey); 4 5 }View Code
19、【写】设置key过期时间
1 public Boolean expire(String redisKey,long liveTime,TimeUnit timeUnit){ 2 3 return this.redisTemplate.expire(redisKey,liveTime,timeUnit); 4 5 }View Code
20、【写】修剪现有列表,使其只包含指定的指定范围的元素,起始和停止都是基于0的索引:
1 public List<Object> lrange(String key, long start, long end){ 2 3 return redisTemplate.opsForList().range(key,start,end); 4 5 }View Code
21、【写】设置key +1
1 public long incr(String key){ 2 3 return redisTemplate.opsForValue().increment(key,1); 4 5 }View Code
22、【写】设置key -1
1 public long decr(String key){ 2 3 return redisTemplate.opsForValue().increment(key, -1); 4 5 }View Code
23、【写】设置kry过期时间
1 public void expireAt(String key,long unixTime){ 2 3 redisTemplate.expireAt(key,new Date(unixTime)); 4 5 }View Code 标签:Code,return,String,redis,redisKey,文档,key,工具,public From: https://www.cnblogs.com/guoguochong/p/16930376.html