Skip to content

组件讲解-如何对Redis进行高效封装

前言

现在的项目基本都会使用redis,在Springboot中使用提供的RedisTemplate或者StringRedisTemplate,但使用感觉还是有些问题,比如在使用中还是需要自己来做对象的转换工作,还有对key键的管理,当键逐渐多了后是非常的麻烦,这有一个,那里有一个,当后续修改时候,要一个个去搜索,效率非常的低下,如果想找这个缓存是谁来设计的,还需要去看代码的提交者,更是麻烦。

针对上述的痛点能不能解决下呢?比如,把对象的转换工作也做好,使用是只要指定 **对象类型 **就可以了,以及将 key 做好统一的管理,并要求加上 **键的含义、键值的含义、作者 **等信息。

对于key的管理也要注意,必须要求用户在指定的类中存放,如果不用代码强制约束的话,总会有人偷懒的

所以为了解决这些问题,设计出对redis操作的封装组件,使用起来更加的方便和管理

介绍

依赖

xml
<dependency>
    <groupId>com.example</groupId>
    <artifactId>damai-redis-framework</artifactId>
    <version>${revision}</version>
</dependency>

特点

  • 针对SpringbootStringRedisTemplate,做了再次封装,使用了json格式存放。
  • 键值对的操作StringHashSetZSetList提供了封装支持。
  • 在使用过程中,存放直接存放对象类型即可,拿取只需指定class类型。
  • key进行了统一的管理约定,用户不能随意在代码中指定key值。
  • 在使用中以接口的形式对外提供api操作,目前实现只有redis一种。

使用

直接使用Spring的注入即可

java
@Autowired
private RedisCache redisCache;

key的约定说明

提供的api中,key的类型为RedisKeyBuild,需要使用提供的方法来转换

  • 将key存放在RedisKeyManage枚举中
java
public enum RedisKeyManage {
    Key("key","键值测试","value为TestCacheDto类型","k"),
    Key2("key:%s","键值占位测试","value为TestCacheDto类型","k"),
}
  • 使用RedisKeyBuild.createRedisKey方法传入RedisKeyManage类型来构建出RedisKeyBuild,此方法支持String.format占用符的使用
java
public final class RedisKeyBuild {
    /**
     * 实际使用的key
     * */
    private final String relKey;

    private RedisKeyBuild(String relKey) {
        this.relKey = relKey;
    }

    /**
     * 构建真实的key
     * @param redisKeyManage key的枚举
     * @param args 占位符的值
     * */
    public static RedisKeyBuild createRedisKey(RedisKeyManage redisKeyManage, Object... args){
        String redisRelKey = String.format(redisKeyManage.getKey(),args);
        return new RedisKeyBuild(SpringUtil.getPrefixDistinctionName() + "-" + redisRelKey);
    }

    public String getRelKey() {
        return relKey;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        RedisKeyBuild that = (RedisKeyBuild) o;
        return relKey.equals(that.relKey);
    }

    @Override
    public int hashCode() {
        return Objects.hash(relKey);
    }
}

特点

  • 封装的api中传入的key的类型为RedisKeyBuildRedisKeyBuild的构造方法进行了私有化,用户就不用自己进行构建RedisKeyBuild
  • RedisKeyBuild提供了公共的静态方法createRedisKey,参数为redisKeyManage,和具体的值
  • 通过这种约束,用户只能调用RedisKeyBuild.createRedisKey,实现了对redis键的统一管理

完整使用示例

java
/**
 * @program: redis-tool
 * @description: 缓存 key管理
 * @author: 星哥
 * @create: 2023-1-6
 **/
public enum RedisKeyEnum {
    Key("key","键值测试","value为TestCacheDto类型","lk"),
    Key2("key:%s","键值占位测试","value为TestCacheDto类型","lk"),
    CHANNEL_DATA("channel_data:%s","channel_data的key","channel_data的value","k"),
}
java
@Autowired
private RedisCache redisCache;

private GetChannelDataVo getChannelDataByRedis(String code){
    return redisCache.get(RedisKeyBuild.createRedisKey(RedisKeyManage.CHANNEL_DATA,code),GetChannelDataVo.class);
}

提供的api

提供的api非常丰富,可在com.damai.redis.RedisCache查看api说明,在com.damai.redis.RedisCacheImpl查看具体的是实现,这里就不再贴出代码

更新: 2025-10-13 11:53:29
原文: https://www.yuque.com/u22210564/ykdrdh/wbgcyd7hi0dvrzs6

Java 后端面试知识库