最近在学习如何在spring中使用redis,再次记录一下使方法,既能给其他同学踩踩坑也加深下记忆。
注意版本问题,版本兼容(比较老)会导致MethodNotFind等问题
<!--redis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- 在之前的项目中引用的jar 为,commons-pool ,需要修改为commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.1.RELEASE</version>
</dependency>
此处我是在之前的额数据库配置文件中追加下面的redis配置
generator.properties
redis.host=127.0.0.1
redis.port=6379
redis.pass=
redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true
applicationContext.xml 中增加下面的配置
<!--数据库配置,此处我把数据库和redis配置防止一个文件中,也可防在两个配置文件中,多个配置文件时需要 增加 <property name="ignoreUnresolvablePlaceholders" value="true" /> -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:generator.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxActive}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="${redis.host}"
p:port="${redis.port}"
p:password="${redis.pass}"
p:pool-config-ref="poolConfig"/>
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<-- 序列化 -->
<bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
<bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
实体类:
@Data
public class RiskPlace {
private Long id;
private String placeName;
private String placeImage
private Date createTime;
}
接口:
public interface RiskPlaceService {
//获取所有的风险地点
List<RiskPlace> selectAll();
//插入新的风险地点
int insert(RiskPlace riskPlace);
}
接口实现:
@Service
public class RiskPlaceServiceImpl implements RiskPlaceService {
@Resource
private RiskPlaceMapper riskPlaceMapper;
@Resource
protected RedisTemplate<Serializable,Serializable> redisTemplate;
//定义redis的key前缀
private String selectKeyStr = "RiskPlaceExample:";
@Override
public List<RiskPlace> selectAll() {
//注意此处使用了lambda表达式
return redisTemplate.execute((RedisCallback<List<RiskPlace>>) redisConnection -> {
//获取序列化后的key
byte[] key = redisTemplate.getStringSerializer().serialize(selectKeyStr);
//判断是否存在key,存在直接从redis中获取值,不存在则从数据库中获取,并保存到redis中
if (redisConnection.exists(key)) {
//获取序列化后的值
byte[] value = redisConnection.get(key);
//反序列化
String valueJson = redisTemplate.getStringSerializer().deserialize(value);
// JSON字符串转对象
List<RiskPlace> riskPlaceList = JSONObject.parseArray(valueJson,RiskPlace.class);
return riskPlaceList;
}else {
//从数据库中获取值
List<RiskPlace> riskPlaceList = riskPlaceMapper.selectByExample(new RiskPlaceExample());
//将值保存到redis中
redisConnection.set(key,
redisTemplate.getStringSerializer().serialize(JSONObject.toJSONString(riskPlaceList)));
return riskPlaceList;
}
});
}
@Override
public int insert(RiskPlace riskPlace) {
//将redis中的值删除,因为进行了 插入操作,所以需要更新redis的值
Set<Serializable> set = redisTemplate.keys(selectKeyStr+"*");
redisTemplate.delete(set);
return riskPlaceMapper.insertSelective(riskPlace);
}
}
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}