修改POM文件,增加redis的配置,这里只需要redis的配置,不需要cache的maven配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
修改启动类,增加启动缓存的注解
//开启缓存注解
@EnableCaching
//启用feignclient
@EnableFeignClients
@EnableEurekaClient
//定时任务的注解
@EnableScheduling
@SpringBootApplication
public class CTIApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(CTIApplication.class, args);
}
}
修改redis配置
@Configuration
public class RedisConfig{
// 注入 RedisConnectionFactory
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisTemplate<String, Object> functionDomainRedisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
/**
* 重写Redis序列化方式,使用Json方式:
* 当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。
* RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。
* Spring Data JPA为我们提供了下面的Serializer:
* GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。
* 在此我们将自己配置RedisTemplate并定义Serializer。
* @param redisConnectionFactory
* @return
*/
private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setConnectionFactory(factory);
redisTemplate.afterPropertiesSet();
}
/**
* 实例化 HashOperations 对象,可以使用 Hash 类型操作
* @param redisTemplate
* @return
*/
@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForHash();
}
/**
* 实例化 ValueOperations 对象,可以使用 String 操作
* @param redisTemplate
* @return
*/
@Bean
public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForValue();
}
/**
* 实例化 ListOperations 对象,可以使用 List 操作
* @param redisTemplate
* @return
*/
@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}
/**
* 实例化 SetOperations 对象,可以使用 Set 操作
* @param redisTemplate
* @return
*/
@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}
/**
* 实例化 ZSetOperations 对象,可以使用 ZSet 操作
* @param redisTemplate
* @return
*/
@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}
}
修改rediscache配置
@Configuration
public class RedisCacheConf extends CachingConfigurerSupport{
@Bean
public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
redisCacheManager.setDefaultExpiration(30000);
return redisCacheManager;
}
@Bean
public CacheErrorHandler errorHandler() {
return new RedisCacheErrorHandler();
}
/**
* 自定义生成redis-key
*
* @return
*/
@Override
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName()).append(".");
sb.append(method.getName()).append(".");
for (Object obj : objects) {
sb.append(obj.toString());
}
System.out.println("keyGenerator=" + sb.toString());
return sb.toString();
}
};
}
@Slf4j
private static class RedisCacheErrorHandler extends SimpleCacheErrorHandler {
@Override
public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
log.error("handleCacheGetError key = {}, value = {}", key, cache);
log.error("cache get error", exception);
}
@Override
public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
log.error("handleCachePutError key = {}, value = {}", key, cache);
log.error("cache put error", exception);
}
@Override
public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
log.error("handleCacheEvictError key = {}, value = {}", key, cache);
log.error("cache evict error", exception);
}
@Override
public void handleCacheClearError(RuntimeException exception, Cache cache) {
log.error("handleCacheClearError value = {}", cache);
log.error("cache clear error", exception);
}
}
}
在service层添加注解:
@Cacheable(value="pageList")//缓存查询结果
public PageInfo<QueryCallRecords> getOutCallRecordList(ParamCallRecord paramCallRecord) {
// 销售人员
String userName = Pub_Tools.getString_TrimZeroLenAsNull(paramCallRecord.getUserName());
// 客户电话
String customerNumber = Pub_Tools.getString_TrimZeroLenAsNull(paramCallRecord.getCustomerNumber());
// 呼叫类型
String callType = Pub_Tools.getString_TrimZeroLenAsNull(paramCallRecord.getCallType());
// 结果
String status = Pub_Tools.getString_TrimZeroLenAsNull(paramCallRecord.getStatus());
// 时间段
String startTime = Pub_Tools.getString_TrimZeroLenAsNull(paramCallRecord.getStartTime());
String endTime = Pub_Tools.getString_TrimZeroLenAsNull(paramCallRecord.getEndTime());
// 页码
Integer pageNum = 1;
String pageNumStr = Pub_Tools.getString_TrimZeroLenAsNull(paramCallRecord.getPageNum());
if (pageNumStr != null) {
pageNum = Integer.parseInt(pageNumStr);
}
// 每页数量
Integer pageSize = 10;
String pageSizeStr = Pub_Tools.getString_TrimZeroLenAsNull(paramCallRecord.getPageSize());
if (pageSizeStr != null) {
pageSize = Integer.parseInt(pageSizeStr);
}
PageHelper.startPage(pageNum, pageSize, true);
List<QueryCallRecords> list = crmCallRecordsDao.findBylist(userName, customerNumber, callType, status,
startTime, endTime);
PageInfo<QueryCallRecords> pageInfo = new PageInfo<>(list);
return pageInfo;
}
第一次查询结果:
17:36:15.225 default [http-nio-7004-exec-7] INFO c.x.sato.controller.CTIController - 开始时间:1542101775225
keyGenerator=com.xuebaclass.sato.service.impl.CTIServiceImpl.getOutCallRecordList.ParamCallRecord(userName=null, customerNumber=null, callType=null, status=null, startTime=null, endTime=null, pageNum=null, pageSize=null)
keyGenerator=com.xuebaclass.sato.service.impl.CTIServiceImpl.getOutCallRecordList.ParamCallRecord(userName=null, customerNumber=null, callType=null, status=null, startTime=null, endTime=null, pageNum=null, pageSize=null)
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@615132f7] was not registered for synchronization because synchronization is not active
JDBC Connection [io.shardingsphere.core.jdbc.core.connection.MasterSlaveConnection@656eaa05] will not be managed by Spring
==> Preparing: SELECT count(0) FROM call_records r LEFT JOIN crm_call_bind cb ON r.cno = cb.cno AND cb.use_status = 1 WHERE cb.dr = 1
==> Parameters:
<== Columns: count(0)
<== Row: 146
<== Total: 1
==> Preparing: SELECT r.ID as id,r.CUSTOMER_NUMBER as customerNumber,r.CUSTOMER_PROVINCE as customerProvince,r.CUSTOMER_CITY as customerCity,r.STATUS as status,r.CALL_TYPE as callType,r.NUMBER_TRUNK as numberTrunk,r.CLIENT_NUMBER as clientNumber,cb.name as name,r.START_TIME as startTime,r.BRIDGE_TIME as bridgeTime,r.BRIDGE_DURATION as bridgeDuration,r.TOTAL_DURATION as totalDuration,r.RECORD_FILE as recordFile,r.USER_FIELD as customerId,r.SALES_ID as salesId FROM call_records r left join crm_call_bind cb ON r.cno = cb.cno and cb.use_status = 1 where cb.dr = 1 order by r.ID desc limit ?,?
==> Parameters: 0(Integer), 10(Integer)
<== Columns: id, customerNumber, customerProvince, customerCity, status, callType, numberTrunk, clientNumber, name, startTime, bridgeTime, bridgeDuration, totalDuration, recordFile, customerId, salesId
<== Row: 389745, 13252808069, 辽宁, 沈阳市, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, 2018-10-21 22:23:19, 00:00:0-26, 00:00:00, http://api.clink.cn/20181113/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, test, 4
<== Row: 389744, 13252808069, 辽宁, 沈阳市, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, 2018-10-21 22:23:19, 00:00:0-26, 00:00:00, http://api.clink.cn/20181113/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, test, 4
<== Row: 389743, 13252808069, 辽宁, 沈阳市, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, 2018-10-21 22:23:19, 00:00:0-26, 00:00:00, http://api.clink.cn/20181113/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, test, 4
<== Row: 389742, 13022455262, 辽宁, 沈阳市, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, 2018-10-21 22:23:19, 00:00:0-26, 00:00:00, http://api.clink.cn/20181113/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, test, 4
<== Row: 389741, 13022455262, 辽宁, 沈阳市, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, 2018-10-21 22:23:19, 00:00:0-26, 00:00:00, http://api.clink.cn/20181113/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, test, 4
<== Row: 389740, 13315863006, 河北, 衡水市, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, 2018-10-21 22:23:19, 00:00:0-26, 00:00:00, http://api.clink.cn/20181113/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, test, 4
<== Row: 389739, 13315863006, 河北, 衡水市, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, 2018-10-21 22:23:19, 00:00:0-26, 00:00:00, http://api.clink.cn/20181113/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, test, 4
<== Row: 389738, 13000117464, 北京, 北京, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, null, null, 00:00:00, http://api.clink.cn/20181109/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, null, 4
<== Row: 389737, 13000117464, 北京, 北京, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, null, null, 00:00:00, http://api.clink.cn/20181109/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, null, 4
<== Row: 389736, 13000117464, 北京, 北京, 双方接听 , 点击外呼, 01053579500, 01042654511, 大仙, 2018-10-21 22:22:53, null, null, 00:00:00, http://api.clink.cn/20181109/3004850-20181021222253-13315863006-01042654511-record-10.10.60.148-1540131773.187944.mp3, null, 4
<== Total: 10
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@615132f7]
17:36:15.387 default [http-nio-7004-exec-7] INFO c.x.sato.controller.CTIController - 结束时间:1542101775387
第二次查询结果:
17:37:04.522 default [http-nio-7004-exec-9] INFO c.x.sato.controller.CTIController - 开始时间:1542101824522
keyGenerator=com.xuebaclass.sato.service.impl.CTIServiceImpl.getOutCallRecordList.ParamCallRecord(userName=null, customerNumber=null, callType=null, status=null, startTime=null, endTime=null, pageNum=null, pageSize=null)
17:37:04.563 default [http-nio-7004-exec-9] INFO c.x.sato.controller.CTIController - 结束时间:1542101824563
说明缓存起了作用。
查看redis的存储结果:
点击查看value的结果
对于cache的说明,推荐一篇文章:https://www.cnblogs.com/yueshutong/p/9381540.html