Spring + Redis 整合

xu.wang

发布于 2019.05.11 22:36 阅读 2327 评论 0

最近在学习如何在spring中使用redis,再次记录一下使方法,既能给其他同学踩踩坑也加深下记忆。

第一步: pom.xml 引入jar

注意版本问题,版本兼容(比较老)会导致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>

 

第二步: 配置Spring配置文件(applicationContext.xml)和redis配置文件

此处我是在之前的额数据库配置文件中追加下面的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"/>

 

4. 使用与测试

实体类:

@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);
}
}