Java项目中使用Redis缓存案例

匿名 (未验证) 提交于 2019-12-02 21:53:52



/* service代码略*/ List<PanelDto> panels = panelService.getAllPanels();   //得到接口的名称,接口的url

第二步,根据拿到的信息生成请求参数:

getPanelInfo.java

WrapResponseModel resonseModel = new WrapResponseModel();   Map<String, String> headers = new HashMap<>();   headers.put("username", username);   headers.put("token",token);   List<String> content = new ArrayList<String>();   for(PanelDto panelDto:panel){   //发送http请求        content.add(HttpRequestUtils.get(panelDto.getUrl(), headers)); } // 返回格式   responseModel.setCode(SUCCESS_CODE);   responseModel.setData(content);

第三步,发送http请求调用接口:

HttpRequestUtils.java

public static String get(String url, Map<String, String> headers) {         RequestConfig config = RequestConfig.custom().setConnectTimeout(TIME_OUT).setConnectionRequestTimeout(TIME_OUT).setSocketTimeout(TIME_OUT).build();         String ret = null;         //创建HttpClient对象         CloseableHttpClient closeHttpClient = HttpClients.createDefault();         CloseableHttpResponse httpResponse = null;         //发送get请求         HttpGet httpGet = new HttpGet(url);         try {             // add header             if (Objects.nonNull(headers)) {                 Set<String> keys = headers.keySet();                 for (Iterator<String> i = keys.iterator(); i.hasNext(); ) {                     String key = i.next();                     httpGet.addHeader(key, headers.get(key));                 }             }              httpGet.setConfig(config);             //执行Get请求 得到Response对象             httpResponse = closeHttpClient.execute(httpGet);             //httpResponse.getStatusLine() 响应头信息             int httpResponseCode = httpResponse.getStatusLine().getStatusCode();              if (200 != httpResponseCode) {                 logger.error("http返回值异常, httpResponseCode = " + httpResponseCode);             }              //返回对象             HttpEntity httpEntity = httpResponse.getEntity();             ret = EntityUtils.toString(httpEntity, "UTF-8");         } catch (UnsupportedEncodingException e) {             logger.error(e.getMessage(), e);         } catch (ClientProtocolException e) {             logger.error(e.getMessage(), e);         } catch (IOException e) {             //logger.error(e.getMessage(), e);         } finally {             if (httpResponse != null) {                 try {                     httpResponse.close();                 } catch (IOException e) {                     logger.error(e.getMessage(), e);                 }             }             if (closeHttpClient != null) {                 try {                     closeHttpClient.close();                 } catch (IOException e) {                     logger.error(e.getMessage(), e);                 }             }         }         return ret;     }

第四步,查询数据set进redis,之后返回查询的数据:


if (!Objects.equals(redisCache, "false")) {
//redisttl过期时间
redisProxyHandler.set(redisKey, JSON.toJSONString(responseModel), REDIS_TTL); logger.error("set succeed!!!!!!!!!!!!!!!!"); }

redisHandler.java

public void set(String key, String value, int seconds) {       redisCacheProvider.set(key, value, seconds);  }

redisProvider.java

@Autowired     private JedisPool jedisPool;      public Jedis getJedis() {         Jedis jedis = this.jedisPool.getResource();         // 使用index为2的database         jedis.select(2);         return jedis;     }      public void set(String key, String value, int seconds) {         Jedis jedis = null;         try {             jedis = getJedis();             jedis.setex(key, seconds, value);             Long exp = jedis.ttl(key);             if (exp < 0) {                 throw new RuntimeException("data time out!");19             }         } catch (Throwable e) {             logger.error(e.getMessage(), e);             throw new TokenException(e.getMessage());         } finally {             if(jedis != null){jedis.close;}         }     }

第五步,请求接口的时候,先请求redis缓存,如果命中则返回命中数据,否则,将执行上面的发送http请求在拼凑数据返回的代码:

getPanelInfo.java

String panelInfo = redisProxyHandler.get(redisKey);                 Long expire = redisProxyHandler.getExpire(redisKey);                //命中才返回,否则会去发http请求                 if (Objects.nonNull(panelInfo) && (expire > 0) && expire <REDIS_TTL) {                  responseModel = JSON.parseObject(panelInfo, WrapResponseModel.class);                  return responseModel;                   }

redisHandler.java

public String get(String key)         return redisCacheProvider.get(key); }

redisProvider.java

public String get(String key) {         String value = null;         Jedis jedis = null;         try {             jedis = getJedis();             value = jedis.get(key);         } catch (Throwable e) {             logger.error(e.getMessage(), e);             throw new TokenException(e.getMessage());         } finally {             if(jedis != null){                 jedis.close();            }         }         return value;     }

applicationContext.xml


<!-- 读取配置文件信息 -->     <context:property-placeholder location="classpath:redis.properties" file-encoding="UTF-8" ignore-unresolvable="true"/>      <!-- Jedis 连接池配置 -->     <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">         <property name="maxTotal" value="${redis.pool.maxTotal}"/>         <property name="maxIdle" value="${redis.pool.maxIdle}"/>         <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>         <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>     </bean>      <bean id="jedisPool" class="redis.clients.jedis.JedisPool">         <constructor-arg ref="jedisPoolConfig"/>         <constructor-arg value="${jedis.host}" type="java.lang.String"/>         <constructor-arg type="int" value="${jedis.port}"/>     </bean>

redis.properties

# 控制一个pool可分配多少个jedis实例
redis.pool.maxTotal=1000
# 控制一个pool最多有多少个状态为idle(空闲)的jedis实例
redis.pool.maxIdle=200
# 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException
redis.pool.maxWaitMillis=2000
#在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的
redis.pool.testOnBorrow=true
# redis 单机
# 单机 host
jedis.host=127.0.0.1
# 单机 port
jedis.port=6379

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!