Commit 32f74a41 authored by minminyan's avatar minminyan

http支持批量查询userId的手机号,返回id+phone的map

当请求数据量过大时一次只拿1000条,休息1ms,确保服务不挂
parent 46092b41
...@@ -21,6 +21,7 @@ import java.sql.Timestamp; ...@@ -21,6 +21,7 @@ import java.sql.Timestamp;
import java.text.ParseException; import java.text.ParseException;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* Created by Miraculous on 2016/12/19. * Created by Miraculous on 2016/12/19.
...@@ -69,6 +70,18 @@ public class InnerController { ...@@ -69,6 +70,18 @@ public class InnerController {
return JsonResult.buildSuccessResult("", userRet); return JsonResult.buildSuccessResult("", userRet);
} }
@RequestMapping("/user/getPhoneByUserIds")
public JsonResult findByIds(@RequestParam(value = "userIds") String userIdsString) {
LOGGER.info("批量查询用户的手机号列表, userIdsString:" + userIdsString);
if (StringUtils.isEmpty(userIdsString)) {
return JsonResult.buildErrorStateResult(null, null);
}
List<Long> userIds = JSONObject.parseObject(userIdsString, new TypeReference<List<Long>>() {
});
Map<Long, String> userIdAndPhoneMap = userService.findPhoneByIdsInDb(userIds);
return JsonResult.buildSuccessResult("", userIdAndPhoneMap);
}
@RequestMapping("/user/save") @RequestMapping("/user/save")
public JsonResult saveUser( public JsonResult saveUser(
String phoneNo, Long registeredFrom, Long createdAt, Long updatedAt, String phoneNo, Long registeredFrom, Long createdAt, Long updatedAt,
......
...@@ -3,14 +3,18 @@ package cn.quantgroup.xyqb.repository; ...@@ -3,14 +3,18 @@ package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.User; import cn.quantgroup.xyqb.entity.User;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/** /**
* Created by Miraculous on 15/7/4. * Created by Miraculous on 15/7/4.
*/ */
public interface IUserRepository extends JpaRepository<User, Long> { public interface IUserRepository extends JpaRepository<User, Long> {
User findByPhoneNo(String phoneNo); User findByPhoneNo(String phoneNo);
User findByUuid(String uuid);
User findByUuid(String uuid); List<User> findByIdIn(List<Long> ids);
User findById(Long id); User findById(Long id);
} }
package cn.quantgroup.xyqb.service.user; package cn.quantgroup.xyqb.service.user;
import cn.quantgroup.xyqb.entity.User; import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import java.util.List;
import java.util.Map;
/** /**
* Created by Miraculous on 15/7/5. * Created by Miraculous on 15/7/5.
*/ */
public interface IUserService { public interface IUserService {
User findByPhoneWithCache(String phone); User findByPhoneWithCache(String phone);
User findByUuidWithCache(String uuid);
User findByUuidWithCache(String uuid); boolean register(String phoneNo, String password, Long registerFrom, String userIp, Long channelId);
boolean register(String phoneNo, String password, Long registerFrom, String userIp, Long channelId); User registerAndReturn(String phoneNo, String password, Long registerFrom);
User registerAndReturn(String phoneNo, String password, Long registerFrom); boolean exist(String phoneNo);
boolean exist(String phoneNo); boolean resetPassword(String phoneNo, String password);
boolean resetPassword(String phoneNo, String password); User findByPhoneInDb(String phone);
User findByPhoneInDb(String phone); User findByUuidInDb(String uuid);
User findByUuidInDb(String uuid); Map<Long, String> findPhoneByIdsInDb(List<Long> userIds);
User saveUser(User user); User saveUser(User user);
User findById(Long userId); User findById(Long userId);
} }
...@@ -7,137 +7,169 @@ import cn.quantgroup.xyqb.service.sms.ISmsService; ...@@ -7,137 +7,169 @@ import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.service.user.ILkbUserService; import cn.quantgroup.xyqb.service.user.ILkbUserService;
import cn.quantgroup.xyqb.service.user.IUserService; import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.util.PasswordUtil; import cn.quantgroup.xyqb.util.PasswordUtil;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
* Created by Miraculous on 15/7/5. * Created by Miraculous on 15/7/5.
*/ */
@Service @Service
@Slf4j
public class UserServiceImpl implements IUserService { public class UserServiceImpl implements IUserService {
@Autowired @Autowired
RedisTemplate<String, String> stringRedisTemplate; RedisTemplate<String, String> stringRedisTemplate;
@Autowired @Autowired
private ILkbUserService lkbUserService; private ILkbUserService lkbUserService;
@Autowired @Autowired
private IUserRepository userRepository; private IUserRepository userRepository;
@Autowired @Autowired
private ISmsService smsService; private ISmsService smsService;
@Override @Override
public User findByPhoneInDb(String phone) { public User findByPhoneInDb(String phone) {
return userRepository.findByPhoneNo(phone); return userRepository.findByPhoneNo(phone);
} }
@Override
public User findByUuidInDb(String uuid) {
return userRepository.findByUuid(uuid);
}
@Override
public User saveUser(User user) {
return userRepository.save(user);
}
@Override
public User findById(Long userId) {
return userRepository.findById(userId);
}
@Override
public User registerAndReturn(String phoneNo, String password, Long registerFrom) {
String uuid = lkbUserService.registerApp(phoneNo, password);
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
User user = new User();
user.setEnable(true);
user.setPhoneNo(phoneNo);
user.setUpdatedAt(currentTime);
user.setCreatedAt(currentTime);
user.setUuid(uuid);
user.setPassword(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT));
user.setRegisteredFrom(registerFrom);
return userRepository.save(user);
}
@Override
@Cacheable(value = "usercache", key = "'xyqbuser' + #phone", unless = "#result == null", cacheManager = "cacheManager")
public User findByPhoneWithCache(String phone) {
return userRepository.findByPhoneNo(phone);
}
@Override @Override
@Cacheable(value = "usercache", key = "'xyqbuser' + #uuid", unless = "#result == null", cacheManager = "cacheManager") public Map<Long, String> findPhoneByIdsInDb(List<Long> userIds) {
public User findByUuidWithCache(String uuid) { if (CollectionUtils.isEmpty(userIds)) {
return userRepository.findByUuid(uuid); return Maps.newHashMap();
} }
Map<Long, String> userIdAndPhoneMap = Maps.newHashMap();
@Override int pageSize = 1000;
@Transactional(value = Transactional.TxType.REQUIRED) int idSize = userIds.size();
public boolean register(String phoneNo, String password, Long registerFrom, String userIp, Long channelId) { for (int i = 0; i < idSize; i += pageSize) {
String uuid = lkbUserService.registerApp(phoneNo, password); List<Long> subList = userIds.subList(i, Math.min(idSize, i + pageSize));
Timestamp currentTime = new Timestamp(System.currentTimeMillis()); List<User> users = userRepository.findByIdIn(subList);
users.stream().forEach(user -> {
User user = new User(); userIdAndPhoneMap.put(user.getId(), user.getPhoneNo());
user.setEnable(true); });
user.setPhoneNo(phoneNo); if (i + pageSize < idSize) {
user.setUpdatedAt(currentTime); try {
user.setCreatedAt(currentTime); Thread.sleep(1);
user.setUuid(uuid); } catch (InterruptedException e) {
user.setPassword(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT)); log.error("线程sleep失败", e);
//解决线上白条registerFrom为1的问题
if(channelId == 222L) {
user.setRegisteredFrom(channelId);
} else {
user.setRegisteredFrom(registerFrom);
} }
//user.setRegisteredFrom(registerFrom); }
user = userRepository.save(user);
smsService.sendAfterRegister(phoneNo);
return user != null;
} }
return userIdAndPhoneMap;
@Override }
public boolean exist(String phoneNo) {
return userRepository.findByPhoneNo(phoneNo) != null; @Override
public User findByUuidInDb(String uuid) {
return userRepository.findByUuid(uuid);
}
@Override
public User saveUser(User user) {
return userRepository.save(user);
}
@Override
public User findById(Long userId) {
return userRepository.findById(userId);
}
@Override
public User registerAndReturn(String phoneNo, String password, Long registerFrom) {
String uuid = lkbUserService.registerApp(phoneNo, password);
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
User user = new User();
user.setEnable(true);
user.setPhoneNo(phoneNo);
user.setUpdatedAt(currentTime);
user.setCreatedAt(currentTime);
user.setUuid(uuid);
user.setPassword(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT));
user.setRegisteredFrom(registerFrom);
return userRepository.save(user);
}
@Override
@Cacheable(value = "usercache", key = "'xyqbuser' + #phone", unless = "#result == null", cacheManager = "cacheManager")
public User findByPhoneWithCache(String phone) {
return userRepository.findByPhoneNo(phone);
}
@Override
@Cacheable(value = "usercache", key = "'xyqbuser' + #uuid", unless = "#result == null", cacheManager = "cacheManager")
public User findByUuidWithCache(String uuid) {
return userRepository.findByUuid(uuid);
}
@Override
@Transactional(value = Transactional.TxType.REQUIRED)
public boolean register(String phoneNo, String password, Long registerFrom, String userIp, Long channelId) {
String uuid = lkbUserService.registerApp(phoneNo, password);
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
User user = new User();
user.setEnable(true);
user.setPhoneNo(phoneNo);
user.setUpdatedAt(currentTime);
user.setCreatedAt(currentTime);
user.setUuid(uuid);
user.setPassword(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT));
//解决线上白条registerFrom为1的问题
if (channelId == 222L) {
user.setRegisteredFrom(channelId);
} else {
user.setRegisteredFrom(registerFrom);
} }
//user.setRegisteredFrom(registerFrom);
/**
* 修改用户密码 user = userRepository.save(user);
* @date 2017-02-15 修改用户修改密码时,更新updatedAt时间 smsService.sendAfterRegister(phoneNo);
* @param phoneNo return user != null;
* @param password }
* @return
*/ @Override
@Override public boolean exist(String phoneNo) {
@CacheEvict(value = "usercache", key = "'xyqbuser' + #phone", cacheManager = "cacheManager") return userRepository.findByPhoneNo(phoneNo) != null;
public boolean resetPassword(String phoneNo, String password) { }
User user = userRepository.findByPhoneNo(phoneNo); /**
if (user == null) { * 修改用户密码
throw new RuntimeException("用户[" + phoneNo + "]不存在"); *
} * @param phoneNo
user.setUpdatedAt(new Timestamp(System.currentTimeMillis())); * @param password
user.setPassword(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT)); * @return
user = userRepository.save(user); * @date 2017-02-15 修改用户修改密码时,更新updatedAt时间
stringRedisTemplate.expire("usercache:xyqbuser" + phoneNo, 1L, TimeUnit.MILLISECONDS); */
return StringUtils.equals(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT), user.getPassword()); @Override
@CacheEvict(value = "usercache", key = "'xyqbuser' + #phone", cacheManager = "cacheManager")
public boolean resetPassword(String phoneNo, String password) {
User user = userRepository.findByPhoneNo(phoneNo);
if (user == null) {
throw new RuntimeException("用户[" + phoneNo + "]不存在");
} }
user.setUpdatedAt(new Timestamp(System.currentTimeMillis()));
user.setPassword(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT));
user = userRepository.save(user);
stringRedisTemplate.expire("usercache:xyqbuser" + phoneNo, 1L, TimeUnit.MILLISECONDS);
return StringUtils.equals(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT), user.getPassword());
}
} }
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