1,redis 报异常
redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
- @Test
- public void test_faildTime(){
- String identify="13718486139";
- int failedTime=WapController.getFailedCount(identify);
- System.out.println(failedTime);
- }
- /***
- * 获取失败次数<br>
- * 限制IP
- * @param httpSession
- * @param request
- * @param response
- * @return
- */
- public static int getFailedCount(String identify) {
- int count = 0;
- String retryString = RedisHelper.getInstance().getKeyCache(identify, "failCount");
- if(!StringUtil.isNullOrEmpty(retryString)) {
- count = new Integer(retryString).intValue();
- }
- System.out.println("getFailedCount\tcount:"+count);
- return count;
- }
原因:jedis.hget(id, k)的第一个参数(id)是"13718486139"
奇怪的是换成"23718486139"就好了,真是诡异
2,保存时设置超时时间
调用的是Jedis类中的:
- /**
- * Set the string value as value of the key. The string can't be longer than 1073741824 bytes (1
- * GB).
- * @param key
- * @param value
- * @param nxxx NX|XX, NX -- Only set the key if it does not already exist. XX -- Only set the key
- * if it already exist.
- * @param expx EX|PX, expire time units: EX = seconds; PX = milliseconds
- * @param time expire time in the units of {@param #expx}
- * @return Status code reply
- */
- public String set(final String key, final String value, final String nxxx, final String expx,
- final long time) {
- checkIsInMulti();
- client.set(key, value, nxxx, expx, time);
- return client.getStatusCodeReply();
- }
封装之后:
- /***
- * Only set the key if it does not already exist
- *
- * @param k
- * @param v
- * @param time : second
- */
- public void saveExpxKeyCache(String k, String v, long time) {
- saveExpxKeyCache(k, v, "NX", time);
- }
- /***
- * @param k
- * @param v
- * @param nxxx : NX|XX, NX -- Only set the key if it does not already exist. XX -- Only set the key
- * if it already exist.
- * @param time : second
- */
- public void saveExpxKeyCache(String k, String v, String nxxx, long time) {
- Jedis jedis = Const.pool.getResource();
- try {
- jedis.set(k, v, nxxx, "EX"/*seconds*/, time);
- } catch (Exception e) {
- e.printStackTrace();
- logger.error("saveKeyCache", e);
- Const.pool.returnBrokenResource(jedis);
- jedis = null;
- } finally {
- if (jedis != null) {
- Const.pool.returnResource(jedis);
- }
- }
- }
3,应用
登录或者发送短信验证码,连续失败三次则弹出图形验证码
如何记录失败次数呢?
- /***
- * 获取失败次数<br>
- * 限制登录名(手机号或邮箱)
- * @param httpSession
- * @param request
- * @param response
- * @return
- */
- public static int getFailedCount(String identify) {
- int count = 0;
- String retryString = RedisHelper.getInstance().getKeyCache(identify, "failCount");
- if(!StringUtil.isNullOrEmpty(retryString)) {
- count = new Integer(retryString).intValue();
- }
- System.out.println("getFailedCount\tcount:"+count);
- return count;
- }
- /***
- * 增加失败次数
- * @param httpSession
- * @param request
- * @param response
- */
- public static void increaseFailedCount(String identify) {
- String retryString = RedisHelper.getInstance().getKeyCache(identify, "failCount");
- int count=0;
- if(!StringUtil.isNullOrEmpty(retryString)) {
- count = new Integer(retryString).intValue();
- }
- count++;
- System.out.println("increaseFailedCount\tcount:"+count);
- RedisHelper.getInstance().saveKeyCache(identify, "failCount", String.valueOf(count));
- }
- /***
- * 清空失败次数
- * @param httpSession
- * @param request
- * @param response
- */
- public static void clearFailedCount(String identify) {
- RedisHelper.getInstance().clearKeyCache(identify, "failCount");
- }
优化为:
- /***
- * 获取失败次数<br>
- * 限制登录名(手机号或邮箱)
- * @param httpSession
- * @param request
- * @param response
- * @return
- */
- public static int getFailedCount(String identify) {
- int count = 0;
- String retryString = RedisHelper.getInstance().getCache("failCount"+identify);
- if(!StringUtil.isNullOrEmpty(retryString)) {
- count = new Integer(retryString).intValue();
- }
- System.out.println("getFailedCount\tcount:"+count);
- return count;
- }
- /***
- * 增加失败次数
- * @param httpSession
- * @param request
- * @param response
- */
- public static void increaseFailedCount(String identify) {
- String retryString = RedisHelper.getInstance().getCache("failCount"+identify);
- int count=0;
- if(!StringUtil.isNullOrEmpty(retryString)) {
- count = new Integer(retryString).intValue();
- }
- count++;
- System.out.println("increaseFailedCount\tcount:"+count);
- RedisHelper.getInstance().saveCache("failCount"+identify, String.valueOf(count));
- }
- /***
- * 清空失败次数
- * @param httpSession
- * @param request
- * @param response
- */
- public static void clearFailedCount(String identify) {
- RedisHelper.getInstance().clearCache("failCount"+identify);
- }