springboot的redis应用

230 阅读2分钟

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

上篇讲了redis在mac环境中的安装和启动配置,还没有讲到如何进行spring项目中的载入,很多同学都来要下集,现在就给大家来讲一下spring项目中的reids应用。

用的例子比较简单,但是非常的实用性,简单说就是代码你直接copy就能用了。

主要的代码都放在这一个类里面了,JedisUtil.class,其中也有main方法可以调试当前的类中的方法是否正确。


//封装的连接redis的方法
 public static void init(String address) {
        JedisUtil.address = address;

        getInstance();
    }

    /**
     * 获取ShardedJedis实例,并且配置Jedis的相关属性
     *
     * @return
     */
    private static ShardedJedis getInstance() {
        if (shardedJedisPool == null) {
            try {
                if (INSTANCE_INIT_LOCL.tryLock(2, TimeUnit.SECONDS)) {

                    try {

                        if (shardedJedisPool == null) {

                            // JedisPoolConfig
                            JedisPoolConfig config = new JedisPoolConfig();
                            config.setMaxTotal(200);
                            config.setMaxIdle(50);
                            config.setMinIdle(8);
                            config.setMaxWaitMillis(10000);         // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
                            config.setTestOnBorrow(false);           // 在获取连接的时候检查有效性, 默认false
                            config.setTestOnReturn(false);          // 调用returnObject方法时,是否进行有效检查
                            config.setTestWhileIdle(true);          // Idle时进行连接扫描
                            config.setTimeBetweenEvictionRunsMillis(30000);     // 表示idle object evitor两次扫描之间要sleep的毫秒数
                            config.setNumTestsPerEvictionRun(10);               // 表示idle object evitor每次扫描的最多的对象数
                            config.setMinEvictableIdleTimeMillis(60000);        // 表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义


                            // JedisShardInfo List
                            List<JedisShardInfo> jedisShardInfos = new LinkedList<JedisShardInfo>();

                            String[] addressArr = address.split(",");
                            for (int i = 0; i < addressArr.length; i++) {
                                JedisShardInfo jedisShardInfo = new JedisShardInfo(addressArr[i]);
                                jedisShardInfo.setPassword(password);
                                jedisShardInfos.add(jedisShardInfo);
                            }

                            shardedJedisPool = new ShardedJedisPool(config, jedisShardInfos);
                            logger.info(">>>>>>>>>>> JedisUtil.ShardedJedisPool init success.");
                        }

                    } finally {
                        INSTANCE_INIT_LOCL.unlock();
                    }
                }

            } catch (InterruptedException e) {
                logger.error(e.getMessage(), e);
            }
        }

        if (shardedJedisPool == null) {
            throw new NullPointerException(">>>>>>>>>>> JedisUtil.ShardedJedisPool is null.");
        }

        ShardedJedis shardedJedis = shardedJedisPool.getResource();
        return shardedJedis;
    }


    /**
     * 在redis中写入key和value,以及失效时间
     */
    public static String setObjectValue(String key, Object obj, int seconds) {
        String result = null;
        //创建一个ShardedJedis实例
        ShardedJedis client = getInstance();
        try {
        //在实例中写入key和value信息。
            result = client.setex(key.getBytes(), seconds, serialize(obj));
        } catch (Exception e) {
        //异常打印日志
            logger.error(e.getMessage(), e);
        } finally {
            if (client != null) {
            //关闭ShardedJedis实例
                client.close();
            }
        }
        return result;
    }
/**
*这个main方法中,写了默认的redis的Address参数,不过这个参数也可以配置在springboot的配置文件中,第二段
*有讲到如何使用配置字段的方式,读取到redis的地址和密码参数。
*/

public static void main(String[] args) {
//设置一个地址
    String RedisAddress = "redis://127.0.0.1:6379/0";
    //调用创建实例的方法
    init(xxlSsoRedisAddress);
//调用塞入键值对的方法
    setObjectValue("key", "value", 1*60*60);
    //输出value
    System.out.println(getObjectValue("key"));

}
第二种方法

将redis的连接信息配置在springboot的配置文件中,然后读取出来传入到创建的实例中。

JedisConfig.class

@Configuration
public class JedisConfig implements InitializingBean, DisposableBean {
// springboot的配置文件读取
    @Value("${redis.address}")
    private String redisAddress;

    @Value("${redis.password}")
    private String redisPassword;

    @Value("${redis.expire.minute}")
    private int redisExpireMinute;

    @Override
    public void afterPropertiesSet() throws Exception {
    //传入地址和密码
        JedisUtil.init(redisAddress,redisPassword);
    }

    @Override
    public void destroy() throws Exception {
        JedisUtil.close();
    }

}



在pom.xml文件中载入redis的包
<!-- jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>