redis工具类-说明文档

redis工具类-说明文档

一、键值设计


 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
posted @ 2022-11-27 19:11  果果虫  阅读(108)  评论(0)    收藏  举报