Redisカウンタ高同時応用
5028 ワード
カウンタの基本使用
/**
* redis
* @param key
* @return
*/
public Long test(String key){
//key key,delta , 。
Long increment = redisTemplate.opsForValue().increment(key, 1);
return increment;
}
メール
/**
*
* @param mobile
* @return
*/
public String sendVerifyCode(String mobile){
Long increment = redisTemplate.opsForValue().increment(mobile, 1);
if (increment == 1) {
//
redisTemplate.expire(mobile, 60, TimeUnit.SECONDS);
}
if (increment > 1) {
return " ";
}
//
return " ";
}
IPリクエスト
/**
*
* @author
* @date 2018/11/28 10:52
*/
public class BaseInterceptor extends HandlerInterceptorAdapter {
/**
*
* @param request
* @param response
* @param code
* @param msg
* @param data
*/
public void sendMsg(HttpServletRequest request, HttpServletResponse response, int code, String msg, String data) {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
//
ResponseMessage responseMessage = new ResponseMessage(code, msg, data);
String jsonObject = JSONObject.toJSONString(responseMessage);
PrintWriter out = null;
try {
out = response.getWriter();
out.append(jsonObject);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
}
}
}
@Data
public class ResponseMessage implements Serializable {
private static final long serialVersionUID = -2988364810346364595L;
/**
* 1: -1:
*/
private int code;
/**
*
*/
private String errorMsg;
/**
*
*/
private T data;
public ResponseMessage(int code, String errorMsg, T data) {
this.code = code;
this.errorMsg = errorMsg;
this.data = data;
}
public ResponseMessage(int code, String errorMsg) {
this.code = code;
this.errorMsg = errorMsg;
}
public ResponseMessage() {
}
}
/**
* IP
* @author
* @date 2018/11/28 10:55
*/
public class CounterInterceptor extends BaseInterceptor {
@Resource
private RedisTemplate redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ip = getRemoteHost(request);
String key = ip + request.getRequestURI() + request.getSession().getId();
Long increment = redisTemplate.opsForValue().increment(key, 1);
if (increment == 1) {
//
redisTemplate.expire(key, 60, TimeUnit.SECONDS);
}
// 5
if (increment > 5) {
sendMsg(request, response, -1, " ", request.getRequestURI());
return false;
}
return true;
}
/**
* IP
* @param request
* @return
*/
public String getRemoteHost(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
}
}
/**
*
* @author
* @date 2018/11/28 11:30
*/
@Configuration
@EnableTransactionManagement
public class MyWebAppConfig extends WebMvcConfigurerAdapter {
@Bean
CounterInterceptor counterInterceptor() {
return new CounterInterceptor();
}
/**
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// IP
registry.addInterceptor(counterInterceptor());
super.addInterceptors(registry);
}
}