这是我参与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>