`

使用redis时遇到的问题

    博客分类:
  • Java
阅读更多

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

 

 

0
2
分享到:
评论

相关推荐

    redis安装遇到的问题——linux centos7.5

    但是,在 Linux Centos7.5 环境中安装 Redis 时可能会遇到一些问题,这篇文章将针对这些问题进行解决。 一、无法编译没有 GCC 在安装 Redis 时,可能会遇到编译错误,错误信息为: make[1]: [persist-settings] ...

    Redis新手学习使用介绍

    在学习过程中,你可能会遇到一些常见问题,比如数据持久化、主从复制和哨兵系统。数据持久化可以防止重启时数据丢失,Redis提供了RDB快照和AOF日志两种方式。主从复制确保了数据的高可用性,当主节点故障时,可以从...

    redis container 问题梳理

    在实际使用中,Redis容器可能会遇到多种问题,以下将对这些问题进行深入的探讨和分析。 首先,我们需要了解Redis的基础架构。Redis基于C语言编写,通过TCP协议提供服务,其数据持久化策略包括RDB(快照)和AOF...

    redis碰到的问题.doc

    在使用 Redis 过程中,可能会遇到各种问题,比如本文件中提到的 `RedisCommandExecutionException`。这个问题通常与 Redis 的数据持久化功能有关,特别是当 RDB 快照保存时遇到错误。 1.1 ...

    Redis实战中文版

    本书深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了...第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。

    美团redis实践

    关于Redis集群的实践,美团遇到的几个主要问题包括master和slave节点部署在同一台机器上、单机多实例部署、以及使用redis-trib.rb工具创建集群和添加slave节点时的问题。在创建集群过程中,需要考虑网络、节点配置和...

    redis免安装文件有32 和 64 位的不用安装可以直接使用redis缓存服务

    2. **BUGS**:包含了已知的错误和问题列表,用户可以通过这个文件了解可能遇到的问题及其解决方案。 3. **CONTRIBUTING**:贡献指南,对于想要参与Redis开发的程序员来说,这个文件会指导他们如何提交代码和贡献到...

    关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案

    在尝试使用Jedis客户端通过网络连接Linux服务器上的Redis时,可能会遇到一个常见的错误提示:“DENIED Redis is running in protected mode”。这个问题通常出现在Linux环境下,当Redis服务启动时默认开启了一个安全...

    Redis实战 中文完整版

    第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。 综上所述, 本书将是一本对于学习和使用 Redis 来说不可多得的参考...

    c#操作redis驱动ServiceStack.Redis,V3.9版本,免费不限制次数免破解

    - ServiceStack.Redis在遇到错误时会抛出特定的异常,如`RedisException`,需要在代码中捕获并处理。 - 应监控Redis服务器的健康状态,避免因服务器问题导致的应用程序异常。 7. **与其他技术的集成**: - ...

    db redis Redis实战

    第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。 综上所述, 本书将是一本对于学习和使用 Redis 来说不可多得的参考...

    Redis实战(中文) PDF

    第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。 综上所述, 本书将是一本对于学习和使用 Redis 来说不可多得的参考...

    Redis实战-带目录完整版.pdf

    Redis实战pdf,带完整版的结果目录,carlson 著,黄健宏 译;本书一共由三个部分组成。...第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言...

    Redis实战.azw3

    第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。 综上所述, 本书将是一本对于学习和使用 Redis 来说不可多得的参考...

    redis实战

    第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。, 综上所述, 本书将是一本对于学习和使用 Redis 来说不可多得的参考...

    redis32位安装包

    Redis拥有活跃的社区和详尽的官方文档,遇到问题时,可以查阅文档或在线寻求帮助。Redis的GitHub仓库也有许多实用的示例和教程。 以上就是关于"redis32位安装包"的相关知识点,希望对你在Windows环境下安装和使用...

    《Redis实战》翻译:黄健宏

    本书深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了...第三部分对Redis用户经常会遇到的一些问题进行了介绍,讲解了降低Redis内存占用的方法、扩展Redis性能的方法以及使用Lua语言进行脚本编程的方法。

    Redis5.0 Windows64

    - `EventLog.dll`:可能用于在Windows系统上集成事件日志服务,方便监控和调试Redis运行时的问题。 4. **pdb文件**: - `redis-check-rdb.pdb`和`redis-server.pdb`:这些是程序数据库文件,包含了调试信息。当...

    RedisRepository 分享和纠错

    作者在尝试使用LuaScript.Prepare()后加载执行Lua脚本时遇到了问题,而直接使用ScriptEvaluateAsync()方法执行Lua脚本则没有问题。这可能是由于脚本缓存或准备阶段的某些细节处理不当所致。在Redis中,Lua脚本可以...

    Redis_redis_

    它的全称是Remote Dictionary Server,由Salvatore Sanfilippo创建,最初是为了解决他在开发Lisp机器上的一个Web应用时遇到的性能问题。Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,且所有的...

Global site tag (gtag.js) - Google Analytics