Commit 7cd8dc55 authored by 杨锐's avatar 杨锐

根据md5(phoneNo,idNo)获取用户信息 待测试。

parent b73d7179
package cn.quantgroup.xyqb.controller.phonenoidno;
import cn.quantgroup.xyqb.entity.UserHashPhoneNoIdNoMapping;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/**
* 同步xyqb_user.user_detail
* <p>
* Date: 2019/12/13
* Time: 上午10:42
*
* @author: yangrui
*/
@Slf4j
@RestController
@RequestMapping("/v1/phonenoidno")
public class UserHashPhoneNoIdNoMappingController {
private static final String SYNC_DATA_PHONE_NO_ID_NO = "syncdataphonenoidno";
private static final String SYNC_DATA_PHONE_NO_ID_NO_SWITCH = "switch";
private static final String SYNC_DATA_PHONE_NO_ID_NO_LAST_ID = "last_id";
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private JdbcTemplate jdbcTemplate;
/**
* md5(phone_no,id_no)
* 本地环境模拟-Xms3G -Xmx3G,单线程同步实际时间45分钟
*
* @return
*/
@GetMapping("/sync/data")
public String syncData() {
log.info("start");
long start = System.currentTimeMillis();
long idStart = 0;
final int limit = 5000;
long count = jdbcTemplate.queryForObject("select count(id) from user_detail", Long.class);
Object state = stringRedisTemplate.opsForHash().get(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_SWITCH);
Object lastIdObj = stringRedisTemplate.opsForHash().get(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_LAST_ID);
if (lastIdObj != null) {
idStart = (long) lastIdObj;
}
if (state == null || "on".equals(state)) {
if (count > 0) {
long page = count / limit + 1;
for (int i = 0; i < page; i++) {
List<UserHashPhoneNoIdNoMapping> userHashPhoneNoIdNoMappings = Lists.newArrayList();
jdbcTemplate.query("select id, user_id, phone_no, id_no" +
" from user_detail where id > ? limit ?", new Object[]{idStart, limit}, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
UserHashPhoneNoIdNoMapping userHashPhoneNoIdNoMapping = new UserHashPhoneNoIdNoMapping();
/* 暂存 */
userHashPhoneNoIdNoMapping.setId(rs.getLong("id"));
userHashPhoneNoIdNoMapping.setUserId(rs.getLong("user_id"));
userHashPhoneNoIdNoMapping.setPhoneNoIdNoMd5(DigestUtils.md5DigestAsHex((rs.getString("phone_no") + rs.getString("id_no")).toLowerCase().getBytes()));
userHashPhoneNoIdNoMappings.add(userHashPhoneNoIdNoMapping);
}
});
// TODO: 2019/12/13 rewriteBatchedStatements=true
if (CollectionUtils.isNotEmpty(userHashPhoneNoIdNoMappings)) {
jdbcTemplate.batchUpdate("insert into user_hash_phone_no_id_no_mapping (user_id, phone_no_id_no_md5) values (?,?)", new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
UserHashPhoneNoIdNoMapping userHashPhoneNoIdNoMapping = userHashPhoneNoIdNoMappings.get(i);
ps.setLong(1, userHashPhoneNoIdNoMapping.getUserId());
ps.setString(2, userHashPhoneNoIdNoMapping.getPhoneNoIdNoMd5());
}
@Override
public int getBatchSize() {
return userHashPhoneNoIdNoMappings.size();
}
});
}
idStart = userHashPhoneNoIdNoMappings.get(userHashPhoneNoIdNoMappings.size() - 1).getId();
stringRedisTemplate.opsForHash().put(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_LAST_ID, String.valueOf(idStart));
}
}
}
log.info("done cost time = 【{}】", System.currentTimeMillis() - start);
return "SUCCESS";
}
@GetMapping("/sync/data/stop")
public String syncDataStop() {
stringRedisTemplate.opsForHash().put(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_SWITCH, "off");
return "SUCCESS";
}
@GetMapping("/sync/data/open/switch")
public String syncDataOpenSwitch() {
stringRedisTemplate.opsForHash().put(SYNC_DATA_PHONE_NO_ID_NO, SYNC_DATA_PHONE_NO_ID_NO_SWITCH, "on");
return "SUCCESS";
}
}
package cn.quantgroup.xyqb.entity;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
@Data
@Entity
@Table(name = "user_hash_phone_no_id_no_mapping")
public class UserHashPhoneNoIdNoMapping {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "phone_no_id_no_md5")
private String phoneNoIdNoMd5;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
}
package cn.quantgroup.xyqb.model;
import lombok.Getter;
/**
* Date: 2019/12/13
* Time: 上午11:22
*
* @author: yangrui
*/
@Getter
public enum FindByMd5Enum {
/**
* md5(phoneNo)
*/
PHONENO(1),
/**
* md5(idNo)
*/
IDNO(2),
/**
* md5(phoneNoidNo)
*/
PHONENOIDNO(3),;
private int type;
FindByMd5Enum(int type) {
this.type = type;
}
}
package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.UserHashPhoneNoIdNoMapping;
import org.springframework.data.jpa.repository.JpaRepository;
public interface IUserHashPhoneNoIdNoMappingRepository extends JpaRepository<UserHashPhoneNoIdNoMapping, Long> {
UserHashPhoneNoIdNoMapping findFirstByPhoneNoIdNoMd5(String phoneNoIdNoMd5);
}
......@@ -4,10 +4,13 @@ import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.entity.UserHashPhoneNoIdNoMapping;
import cn.quantgroup.xyqb.event.PhoneNoUpdateEvent;
import cn.quantgroup.xyqb.exception.DataException;
import cn.quantgroup.xyqb.model.FindByMd5Enum;
import cn.quantgroup.xyqb.model.UserInfo;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserHashPhoneNoIdNoMappingRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserService;
......@@ -28,6 +31,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.List;
......@@ -50,6 +54,9 @@ public class UserServiceImpl implements IUserService {
@Autowired
private IUserHashMappingRepository userHashMappingRepository;
@Resource
private IUserHashPhoneNoIdNoMappingRepository userHashPhoneNoIdNoMappingRepository;
@Autowired
private IUserDetailService userDetailService;
......@@ -196,10 +203,18 @@ public class UserServiceImpl implements IUserService {
md5Value = md5Value.toLowerCase();
long value = HashUtil.crc32(md5Value);
UserHashMapping userHashMapping;
if (type == 1) {
/* modify by yangrui on 2019/12/13 上午11:52 */
if (FindByMd5Enum.PHONENO.getType() == type) {
userHashMapping = userHashMappingRepository.findByPhoneNoMd5ShortAndPhoneNoMd5(value, md5Value);
} else {
} else if (FindByMd5Enum.IDNO.getType() == type) {
userHashMapping = userHashMappingRepository.findByIdNoMd5ShortAndIdNoMd5(value, md5Value);
} else {
userHashMapping = null;
UserHashPhoneNoIdNoMapping userHashPhoneNoIdNoMapping = userHashPhoneNoIdNoMappingRepository.findFirstByPhoneNoIdNoMd5(md5Value);
if (userHashPhoneNoIdNoMapping != null) {
userHashMapping = new UserHashMapping();
userHashMapping.setUserId(userHashPhoneNoIdNoMapping.getUserId());
}
}
if (userHashMapping == null) {
return null;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment