Browse Source

缓存

tall3
zhizhi wu 4 years ago
parent
commit
da1934c8fe
  1. 13
      cloudutil/src/main/java/com/ccsens/cloudutil/annotation/CacheMd5.java
  2. 83
      cloudutil/src/main/java/com/ccsens/cloudutil/aspect/CacheMd5Aspect.java
  3. 5
      pom.xml
  4. 2
      signin/src/main/java/com/ccsens/signin/SigninApplication.java
  5. 10
      signin/src/main/java/com/ccsens/signin/api/DebugController.java
  6. 3
      signin/src/main/java/com/ccsens/signin/service/UserService.java
  7. 2
      signin/src/main/resources/application-common.yml
  8. 2
      signin/src/main/resources/application-dev.yml
  9. 3
      signin/src/main/resources/mapper_dao/SysAuthDao.xml
  10. 3
      signin/src/main/resources/mapper_dao/SysUserDao.xml
  11. 1
      signin/src/main/resources/mapper_raw/SysAuthMapper.xml
  12. 1
      signin/src/main/resources/mapper_raw/SysUserInfoMapper.xml
  13. 1
      signin/src/main/resources/mapper_raw/SysUserMapper.xml
  14. 78
      util/src/main/java/com/ccsens/util/config/RedisConfig.java
  15. 29
      util/src/main/java/com/ccsens/util/mybatis/MybatisRedisCache.java

13
cloudutil/src/main/java/com/ccsens/cloudutil/annotation/CacheMd5.java

@ -0,0 +1,13 @@
package com.ccsens.cloudutil.annotation;
import java.lang.annotation.*;
/**
* @author
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CacheMd5 {
}

83
cloudutil/src/main/java/com/ccsens/cloudutil/aspect/CacheMd5Aspect.java

@ -0,0 +1,83 @@
package com.ccsens.cache_test.aspect;
import com.alibaba.fastjson.JSONObject;
import com.ccsens.cache_test.bean.dto.CacheTest;
import com.ccsens.cache_test.bean.vo.CacheTestVo;
import com.ccsens.cache_test.util.JsonResponse;
import com.ccsens.cache_test.util.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class CacheMd5Aspect {
@Pointcut("@annotation(com.ccsens.cloudutil.annotation.CacheMd5)")
public void cacheMd5(){
}
//
// @After("cacheMd5()")
// public void cacheMd5TestAspect(JoinPoint joinPoint) throws JsonProcessingException {
// Object[] args = joinPoint.getArgs();
//// Object proceed = joinPoint.(args);
// Signature signature = joinPoint.getSignature();
// String kind = joinPoint.getKind();
// SourceLocation sourceLocation = joinPoint.getSourceLocation();
// JoinPoint.StaticPart staticPart = joinPoint.getStaticPart();
// Object target = joinPoint.getTarget();
// Object aThis = joinPoint.getThis();
// System.out.println(joinPoint);
//
// System.out.println("============================================---");
// }
@Around("cacheMd5()")
public Object cacheMd5TestAspect1(ProceedingJoinPoint joinPoint) throws Throwable {
long s = System.currentTimeMillis();
//拿到入参
Object[] args = joinPoint.getArgs();
CacheTest cacheTest = args == null || args.length < 1 ? null : (CacheTest)args[0];
//获取入参的md5值
String inMd5 = cacheTest == null ? null : cacheTest.getMd5();
//获取返回值
JsonResponse<Object> proceed = (JsonResponse<Object>) joinPoint.proceed(args);
//入参没有md5直接返回
if(inMd5 == null){
log.info("cache---入参md5为空");
long e = System.currentTimeMillis();
log.info("切面时间:{}",e-s);
return proceed;
}
//异常直接返回
if(proceed.getCode() != 200){
log.info("cache---接口异常");
long e = System.currentTimeMillis();
log.info("切面时间:{}",e-s);
return proceed;
}
//获取返回数据
if(proceed.getData() == null){
log.info("cache---返回数据为空");
long e = System.currentTimeMillis();
log.info("切面时间:{}",e-s);
return proceed;
}
//将date转成json并加密
String outMd5 = Md5Util.stringTo(JSONObject.toJSONString(proceed.getData()));
log.info("md5:{}",outMd5);
if(inMd5.equalsIgnoreCase(outMd5)){
log.info("md5相同则返回空");
proceed.setData(null);
}
long e = System.currentTimeMillis();
log.info("切面时间:{}",e-s);
return proceed;
}
}

5
pom.xml

@ -55,6 +55,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring 缓存-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--多redis配置-->
<dependency>
<groupId>redis.clients</groupId>

2
signin/src/main/java/com/ccsens/signin/SigninApplication.java

@ -4,6 +4,7 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableAsync;
@ -15,6 +16,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@EnableCircuitBreaker
@EnableFeignClients(basePackages = "com.ccsens.cloudutil.feign")
@SpringBootApplication(scanBasePackages = "com.ccsens")
//@EnableCaching
public class SigninApplication {
public static void main(String[] args) {

10
signin/src/main/java/com/ccsens/signin/api/DebugController.java

@ -1,10 +1,13 @@
package com.ccsens.wisdomcar.api;
import com.ccsens.util.JsonResponse;
import com.ccsens.util.WebConstant;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@ -20,8 +23,11 @@ public class DebugController {
@ApiOperation(value = "/测试",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value="",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"})
public JsonResponse debug(HttpServletRequest request) throws Exception {
@RequestMapping(value="",produces = {"application/json;charset=UTF-8"})
// @CachePut(cacheNames = "signin",key = "#clientType+'-'+#identifyType+'-'+#identifier+'-'+#credential")
// @CacheEvict(cacheNames = "signin",key = "#clientType+'-'+#identifyType+'-'+#identifier+'-'+#credential")
public JsonResponse debug(WebConstant.CLIENT_TYPE clientType, WebConstant.IDENTIFY_TYPE identifyType,
String identifier, String credential) throws Exception {
return JsonResponse.newInstance().ok("测试");
}

3
signin/src/main/java/com/ccsens/signin/service/UserService.java

@ -26,6 +26,7 @@ import com.ccsens.util.wx.WxGzhUtil;
import com.ccsens.util.wx.WxXcxUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@ -71,6 +72,8 @@ public class UserService implements IUserService {
/**
* 登录
*/
// @Cacheable(cacheNames = "signin", key = "#clientType+'-'+#identifyType+'-'+#identifier+'-'+#credential")
// @Cacheable(cacheNames = "signin", key = "login")
@Override
public UserVo.UserSign signin(WebConstant.CLIENT_TYPE clientType, WebConstant.IDENTIFY_TYPE identifyType,
String identifier, String credential, String clientIp, String redirect) throws Exception {

2
signin/src/main/resources/application-common.yml

@ -9,7 +9,7 @@ logging:
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath*:mapper_*/*.xml
type-aliases-package: com.ccsens.ht.bean
type-aliases-package: com.ccsens.signin.bean
server:
tomcat:
uri-encoding: UTF-8

2
signin/src/main/resources/application-dev.yml

@ -11,7 +11,7 @@ spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
rabbitmq:
host: 192.168.4.113
host: 192.168.0.99
password: 111111
port: 5672
username: admin

3
signin/src/main/resources/mapper_dao/SysAuthDao.xml

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.tall.persist.dao.SysAuthDao">
<mapper namespace="com.ccsens.signin.persist.dao.SysAuthDao">
<cache type="com.ccsens.util.mybatis.MybatisRedisCache"/>
<cache-ref namespace="com.ccsens.signin.persist.mapper.SysAuthMapper"/>
<select id="queryOauth2WX" resultType="com.ccsens.signin.bean.vo.UserVo$Oauth2WX">
select identifier as openid, user_id as userId

3
signin/src/main/resources/mapper_dao/SysUserDao.xml

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.tall.persist.dao.SysUserDao">
<mapper namespace="com.ccsens.signin.persist.dao.SysUserDao">
<cache type="com.ccsens.util.mybatis.MybatisRedisCache"/>
<resultMap id="getTokenBeanByUserId" type="com.ccsens.signin.bean.vo.UserVo$TokenBean">
<id column="id" property="id"/>
<result column="account" property="account"/>

1
signin/src/main/resources/mapper_raw/SysAuthMapper.xml

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.signin.persist.mapper.SysAuthMapper">
<cache type="com.ccsens.util.mybatis.MybatisRedisCache"/>
<resultMap id="BaseResultMap" type="com.ccsens.signin.bean.po.SysAuth">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_id" jdbcType="BIGINT" property="userId" />

1
signin/src/main/resources/mapper_raw/SysUserInfoMapper.xml

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.signin.persist.mapper.SysUserInfoMapper">
<cache type="com.ccsens.util.mybatis.MybatisRedisCache"/>
<resultMap id="BaseResultMap" type="com.ccsens.signin.bean.po.SysUserInfo">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="user_id" jdbcType="BIGINT" property="userId" />

1
signin/src/main/resources/mapper_raw/SysUserMapper.xml

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ccsens.signin.persist.mapper.SysUserMapper">
<cache type="com.ccsens.util.mybatis.MybatisRedisCache"/>
<resultMap id="BaseResultMap" type="com.ccsens.signin.bean.po.SysUser">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="grade_id" jdbcType="BIGINT" property="gradeId" />

78
util/src/main/java/com/ccsens/util/config/RedisConfig.java

@ -6,18 +6,43 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
import java.time.Duration;
/**
* @author 23778
*/
@Configuration
public class RedisConfig {
@Value("${mybatisCache.host:}")
private String hostName;
@Value("${mybatisCache.password:}")
private String password;
@Value("${mybatisCache.port:}")
private int port;
@Value("${mybatisCache.database:}")
private int database;
@Value("${mybatisCache.timeout:}")
private int timeout;
@Value("${mybatisCache.jedis.pool.max-active:}")
private int maxActive;
@Value("${mybatisCache.jedis.pool.max-idle:}")
private int maxIdle;
@Value("${mybatisCache.jedis.pool.min-idle:}")
private int minIdle;
@Value("${mybatisCache.jedis.pool.max-wait:}")
private long maxWait;
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
@ -43,31 +68,15 @@ public class RedisConfig {
@Bean("mybatisCache")
@SuppressWarnings("all")
public RedisTemplate<String, Object> mybatisCacheRedisTemplate(
@Value("${mybatisCache.host:}") String hostName,
@Value("${mybatisCache.password:}") String password,
@Value("${mybatisCache.port:}") int port,
@Value("${mybatisCache.database:}") int database,
@Value("${mybatisCache.timeout:}") int timeout,
@Value("${mybatisCache.jedis.pool.max-active:}") int maxActive,
@Value("${mybatisCache.jedis.pool.max-idle:}") int maxIdle,
@Value("${mybatisCache.jedis.pool.min-idle:}") int minIdle,
@Value("${mybatisCache.jedis.pool.max-wait:}") long maxWait
) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
RedisConnectionFactory factory = this.getRedisConnectionFactory(
hostName, password, port, database, timeout, maxActive, maxIdle, minIdle, maxWait);
public RedisTemplate<Object, Object> mybatisCacheRedisTemplate() {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
RedisConnectionFactory factory = this.getRedisConnectionFactory();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
@ -76,9 +85,11 @@ public class RedisConfig {
return template;
}
private RedisConnectionFactory getRedisConnectionFactory(String hostName,
String password, int port, int database, int timeout, int maxActive, int maxIdle, int minIdle,
long maxWait) { // 是负责建立Factory的连接工厂类
/**
* 负责建立Factory的连接工厂类
* @return
*/
private RedisConnectionFactory getRedisConnectionFactory() {
JedisConnectionFactory jedisFactory = new JedisConnectionFactory();
jedisFactory.setHostName(hostName);
@ -94,9 +105,30 @@ public class RedisConfig {
poolConfig.setMaxWaitMillis(maxWait);
jedisFactory.setPoolConfig(poolConfig);
jedisFactory.afterPropertiesSet(); // 初始化连接池配置
// 初始化连接池配置
jedisFactory.afterPropertiesSet();
return jedisFactory;
}
@Bean
public RedisCacheManager redisCacheManager() {
RedisConnectionFactory factory = getRedisConnectionFactory();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.entryTtl(Duration.ofSeconds(300));
RedisCacheManager redisCacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.transactionAware()
.build();
return redisCacheManager;
}
}

29
util/src/main/java/com/ccsens/util/mybatis/MybatisRedisCache.java

@ -1,12 +1,11 @@
package com.ccsens.util.mybatis;
import com.ccsens.util.SpringContextUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.cache.Cache;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@ -20,10 +19,9 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MybatisRedisCache implements Cache {
private final String id;
@Resource(name="mybatisCache")
private RedisTemplate redisTemplate;
/** redis过期时间 单位:s */
private static final long EXPIRE_TIME_IN_MINUTES = 30;
private static final long EXPIRE_TIME_IN_MINUTES = 300;
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
@ -42,22 +40,35 @@ public class MybatisRedisCache implements Cache {
@Override
public void putObject(Object key, Object value) {
if (key == null) {
return ;
}
RedisTemplate<Object, Object> redisTemplate = getRedisTemplate();
redisTemplate.opsForValue().set(key, value, EXPIRE_TIME_IN_MINUTES, TimeUnit.SECONDS);
}
@Override
public Object getObject(Object key) {
if (key == null) {
return null;
}
RedisTemplate<Object, Object> redisTemplate = getRedisTemplate();
return redisTemplate.opsForValue().get(key);
}
@Override
public Object removeObject(Object key) {
if (key == null) {
return false;
}
RedisTemplate<Object, Object> redisTemplate = getRedisTemplate();
return redisTemplate.delete(key);
}
@Override
public void clear() {
redisTemplate.execute((RedisCallback) connection -> {
RedisTemplate<Object, Object> redisTemplate = getRedisTemplate();
redisTemplate.execute((RedisCallback<Object>) connection -> {
//将数据库清空
connection.flushDb();
return null;
@ -73,4 +84,12 @@ public class MybatisRedisCache implements Cache {
public ReadWriteLock getReadWriteLock() {
return readWriteLock;
}
private RedisTemplate<Object, Object> getRedisTemplate() {
if (redisTemplate == null) {
redisTemplate = SpringContextUtils.getBean("mybatisCache", RedisTemplate.class);
}
return redisTemplate;
}
}

Loading…
Cancel
Save