您的位置:首页 > 数据库 > Redis

Java高性能高并发实战之Redis封装类设计

2020-05-07 04:21 1261 查看

文章目录

  • 后记
  • 前言

    在我们的日常学习与项目中很多的地方也都是会使用到Redis,使用它做一个缓存的处理。我们都馋着他的性能和高效性,这节就来分装一个Redis来进行日常的使用。

    正文

    基础配置与封装

    首先对于Redis的使用我们先要进行一个类似于MySql数据库的配置,在配置文件中写下如下的配置信息。

    redis.host=localhost # 连接地址
    redis.port=6379     #连接端口
    redis.timeout=3   # 超时时间 
    redis.password=123456# 密码
    redis.poolMaxTotal=10
    redis.poolMaxIdle=10
    redis.poolMaxWait=3

    完成了配置文件的编写以后,因为我们想要将Redis封装成为一个可用类,所以需要将配置文件中的配置一一读取出来,就使用到了

    @ConfigurationProperties(prefix="redis")
    表示读取到配置文件中以redis开头的配置信息。使用到
    @Component
    注解表示将此对象实例化Spring容器中,这样就可以
    @Autowired
    注解进行注入,。代码如下,同时生成get 和 set方法:

    @Component
    @ConfigurationProperties(prefix="redis")
    public class RedisConfig {
    private String host;
    private int port;
    private int timeout;//秒
    private String password;
    private int poolMaxTotal;
    private int poolMaxIdle;
    private int poolMaxWait;//秒
    public String getHost() {
    return host;
    }
    public void setHost(String host) {
    this.host = host;
    }
    public int getPort() {
    return port;
    }
    public void setPort(int port) {
    this.port = port;
    }
    public int getTimeout() {
    return timeout;
    }
    public void setTimeout(int timeout) {
    this.timeout = timeout;
    }
    public String getPassword() {
    return password;
    }
    public void setPassword(String password) {
    this.password = password;
    }
    public int getPoolMaxTotal() {
    return poolMaxTotal;
    }
    public void setPoolMaxTotal(int poolMaxTotal) {
    this.poolMaxTotal = poolMaxTotal;
    }
    public int getPoolMaxIdle() {
    return poolMaxIdle;
    }
    public void setPoolMaxIdle(int poolMaxIdle) {
    this.poolMaxIdle = poolMaxIdle;
    }
    public int getPoolMaxWait() {
    return poolMaxWait;
    }
    public void setPoolMaxWait(int poolMaxWait) {
    this.poolMaxWait = poolMaxWait;
    }
    }

    前面完成了对于基础的配置,我们也对Redis的基础配置进行了一个封装的处理,下面就可以开始将自己的配置注入到Bean中进行调用,使用到了

    JedisPoolConfig
    ,我们设置返回的对象为JedisPool,设置一个Jedis的工厂类,将自己之前封装好的内容注入到
    JedisPoolConfig
    中,使用Bean注解即可。

    @Service
    public class RedisPoolFactory {
    
    @Autowired
    RedisConfig redisConfig;
    
    @Bean
    public JedisPool JedisPoolFactory() {
    JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxIdle(redisConfig.getPoolMaxIdle());
    poolConfig.setMaxTotal(redisConfig.getPoolMaxTotal());
    poolConfig.setMaxWaitMillis(redisConfig.getPoolMaxWait() * 1000);
    JedisPool jp = new JedisPool(poolConfig, redisConfig.getHost(), redisConfig.getPort(),
    redisConfig.getTimeout()*1000, redisConfig.getPassword(), 0);
    return jp;
    }
    
    }

    完成了基础的分装以后就可以在RedisService中使用

    @Autowired
    JedisPool jedisPool;

    进行调用。

    设置前缀防止键值的重复

    在完成了以上的配置以后,我们就可以随意使用set与get进行测试处理,但是我们需要思考一个问题就是若是在多人开发的大项目中,对于Redis的需求是比较大的,在不同的部门中若是你定义了一个key为R1,但是对于另外一个部门的同时也定义了一个key为R1,这个时候就会出现覆盖的问题,所以我们需要进行思考,为给定的key值加上一个前缀,这个前缀是各个部门的部门名称。

    getPrefix()
    来获取到传入的类的底层简称,这样就可以对于每一个部门都设置上不同的自己类的前缀

    public String getPrefix() {
    String className = getClass().getSimpleName();
    return className+":" + prefix;
    }

    这个时候以上的配置都已经完成,现在我们来看一下对于Set的代码:

    * */
    public <T> T get(KeyPrefix prefix, String key,  Class<T> clazz) {
    Jedis jedis = null;
    try {
    jedis =  jedisPool.getResource();
    //生成真正的key 前缀为自己部门的类的底层名称。
    String realKey  = prefix.getPrefix() + key;
    String  str = jedis.get(realKey);
    T t =  stringToBean(str, clazz);
    // 将String类型转换为T类型。
    return t;
    }finally {
    returnToPool(jedis);
    }
    }
    private <T> T stringToBean(String str, Class<T> clazz) {
    if(str == null || str.length() <= 0 || clazz == null) {
    return null;
    }
    if(clazz == int.class || clazz == Integer.class) {
    return (T)Integer.valueOf(str);
    }else if(clazz == String.class) {
    return (T)str;
    }else if(clazz == long.class || clazz == Long.class) {
    return  (T)Long.valueOf(str);
    }else {
    return JSON.toJavaObject(JSON.parseObject(str), clazz);
    }
    }
    
    private void returnToPool(Jedis jedis) {
    if(jedis != null) {
    jedis.close();
    // 关闭连接。
    }
    }

    测试

    首先进行set操作:

    然后执行get操作:

    使用RDM连接到本地的Redis数据库查看,name就是当前部门加id信息。

    后记

    对于这部分Redis的记录的源码部分已经上传到github上,后续的每部分的重点都会有具体的讲解。
    源码跳转地址:地址链接

    Maycope 原创文章 113获赞 163访问量 2万+ 关注 私信
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐