前提
在使用项目使用redis的时候,刚开始用的是redisPool来管理redis,但是用了一段时间发现redis的connect_clients高居不下,经常容易因为连接数太高而报错。
原因
随即去网上百度了,原来是redispool每次来一个请求都会创立一个连接,而且不知道是不是因为我配置有问题,释放时间没有用。最后发现redisTemplate能帮我们管理redis连接,开发者只要拿来存取就好。
开始
1.maven引入redis相关包
<!-- redis缓存 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- spring-redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.4.2.RELEASE</version>
</dependency>
2.resource下新建redis/reids.properties配置文件。内容如下:
#redis地址
redis.host=127.0.0.1
#端口号
redis.port=6379
#最大连接数
redis.maxTotal=100
#最大空闲连接数
redis.maxIdle=30
#每次释放连接的最大数目
redis.numTestsPerEvictionRun=1024
#释放连接的扫描间隔(毫秒)
redis.timeBetweenEvictionRunsMillis=3000
#连接最小空闲时间
redis.minEvictableIdleTimeMillis=4000
#连接空闲多久后释放,当空闲时间>该值,且 空闲连接>最大空闲连接数 时直接释放
redis.softMinEvictableIdleTimeMillis=10000
#获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1
redis.maxWaitMillis=1500
#在获取连接的时候检查有效性,默认false
redis.testOnBorrow=true
3.applicationContext.xml文件配置redis。内容如下:
<!--redis的配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--最大空闲连接数-->
<property name="maxIdle" value="${redis.maxIdle}"/>
<!--每次释放连接的最大数目-->
<property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"/>
<!--释放连接的扫描间隔(毫秒)-->
<property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}"/>
<!--连接最小空闲时间-->
<property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"/>
<!--连接空闲多久后释放,当空闲时间>该值,且 空闲连接>最大空闲连接数 时直接释放-->
<property name="softMinEvictableIdleTimeMillis" value="${redis.softMinEvictableIdleTimeMillis}"/>
<!--获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1-->
<property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
<!--在获取连接的时候检查有效性,默认false-->
<property name="testOnBorrow" value="${redis.testOnBorrow}"/>
<!--最大连接数-->
<property name="maxTotal" value="${redis.maxTotal}"/>
</bean>
<!-- redis连接工厂 -->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"></property>
<property name="port" value="${redis.port}"></property>
<property name="password" value=""></property>
<property name="poolConfig" ref="jedisPoolConfig"></property>
</bean>
<!-- redis操作模板,这里采用尽量面向对象的模板 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<!-- 如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!!-->
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
</bean>
注意!此处要注意引入redis.properties文件,因为有多个properties文件,添加如下:
<context:property-placeholder location="classpath:/*/*.properties"/>
4.到这里,已经完成把redis整合到了spring里,接下来可以新增一个reids工具类redisUtil.内容如下:
package com.bbkj.common.redis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* @author JJ
* @version 1.0
* @description: TODO
* @date 2022/1/5 16:17
*/
@Component("redisUtil")
public class RedisUtil {
@Autowired
private StringRedisTemplate redisTemplate;
public void put(String key, String value) {
if (key == null || "".equals(key)) {
return;
}
redisTemplate.opsForHash().put(key, key, value);
}
public void set(String key, String value) {
if (key == null || "".equals(key)) {
return;
}
redisTemplate.opsForValue().set(key, value);
}
public void set(String key, String value, long timeout) {
if (key == null || "".equals(key)) {
return;
}
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
public void set(String key, String value, long timeout, String TimeType) {
if (key == null || "".equals(key)) {
return;
}
if (TimeType == "s") {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
}
if (TimeType == "h") {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.HOURS);
}
if (TimeType == "d") {
redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.DAYS);
}
}
public String get(String key) {
Object obj = redisTemplate.opsForValue().get(key);
if (obj == null) {
return null;
} else {
return String.valueOf(obj);
}
}
}
5.使用,如下:
获取redisutil:
@Autowired
private RedisUtil redisUtil;
往redis写入内容
redisUtil.set(String.valueOf(person_id), jsonObject.toString());
获取redis的内容
String info = String.valueOf(redisUtil.get(personId));
往redis写入有时效的内容
redisUtil.set("indexData", result.toString(), 1, "d");
先写到,有其他内容再补充,学无止境呀!