添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
使用:
package com.demo.weather.service.Impl;
import com.demo.weather.service.WeatherDataService;
import com.demo.weather.vo.WeatherResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Service
public class WeatherDataServiceImpl implements WeatherDataService {
@Autowired
private RestTemplate restTemplate; //工具类使用
@Autowired
private StringRedisTemplate stringRedisTemplate;
private static final long TIME_OUT=1800L; //1800秒
private final static Logger logger = LoggerFactory.getLogger(WeatherDataServiceImpl.class);
private static final String WEATHER_URI="http://wthrcdn.etouch.cn/weather_mini?";
@Override
public WeatherResponse getDataByCityID(String cityID) {
String uri=WEATHER_URI+"citykey="+cityID;
return this.doGetWeather(uri);
}
@Override
public WeatherResponse getDataByCityName(String cityName) {
String uri=WEATHER_URI+"city="+cityName;
return this.doGetWeather(uri);
}
private WeatherResponse doGetWeather(String uri){
String key=uri; //redius当中存uri
String strBody=null;
WeatherResponse resp=null;
ObjectMapper mapper=new ObjectMapper();
ValueOperations<String,String> ops=stringRedisTemplate.opsForValue(); //redius操作对象,固定操作。
if(stringRedisTemplate.hasKey(key)){ //redis中是否存在key
logger.info("Redis has data");
strBody=ops.get(key);
}else {
logger.info("Redis don't has data");
ResponseEntity<String> respString=restTemplate.getForEntity(uri,String.class);
if(respString.getStatusCodeValue()==200){
strBody=respString.getBody();
}
ops.set(key,strBody,TIME_OUT,TimeUnit.SECONDS); //如果不存在,则设置进去。key:uri:键,strBody:请求接口返回的不是json的字符串,TIME_OUT过期时间,TimeUnit.SECONDS:设置成秒
}
try {
resp=mapper.readValue(strBody,WeatherResponse.class);
}catch (IOException e){
logger.error("Error!",e);
}
return resp;
}
}
@Autowired
private RestTemplate restTemplate; //工具类使用
@Autowired
private StringRedisTemplate stringRedisTemplate;
private static final long TIME_OUT=1800L; //1800秒
private final static Logger logger = LoggerFactory.getLogger(WeatherDataServiceImpl.class);
private static final String WEATHER_URI="http://wthrcdn.etouch.cn/weather_mini?";
@Override
public WeatherResponse getDataByCityID(String cityID) {
String uri=WEATHER_URI+"citykey="+cityID;
return this.doGetWeather(uri);
}
@Override
public WeatherResponse getDataByCityName(String cityName) {
String uri=WEATHER_URI+"city="+cityName;
return this.doGetWeather(uri);
}
private WeatherResponse doGetWeather(String uri){
String key=uri; //redius当中存uri
String strBody=null;
WeatherResponse resp=null;
ObjectMapper mapper=new ObjectMapper();
ValueOperations<String,String> ops=stringRedisTemplate.opsForValue(); //redius操作对象,固定操作。
if(stringRedisTemplate.hasKey(key)){ //redis中是否存在key
logger.info("Redis has data");
strBody=ops.get(key);
}else {
logger.info("Redis don't has data");
ResponseEntity<String> respString=restTemplate.getForEntity(uri,String.class);
if(respString.getStatusCodeValue()==200){
strBody=respString.getBody();
}
ops.set(key,strBody,TIME_OUT,TimeUnit.SECONDS); //如果不存在,则设置进去。key:uri:键,strBody:请求接口返回的不是json的字符串,TIME_OUT过期时间,TimeUnit.SECONDS:设置成秒
}
try {
resp=mapper.readValue(strBody,WeatherResponse.class);
}catch (IOException e){
logger.error("Error!",e);
}
return resp;
}
}