使用redis时遇到的问题

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);
    }

猜你喜欢

转载自hw1287789687.iteye.com/blog/2248875
今日推荐