happeoo1 2015-02-08 15:33 采纳率: 0%
浏览 2519

Spymemcached incr 增长一个long型数据,报错说不是一个数值型值

版本spymemcached-2.10.1;
使用incr方法时报错。
我把一个long型数值放进memcached中:
MemClient.getInstance().increment("world-record", 1);
其中MemClient.getInstance()得到我的单例工具类,increment方法实质就是incr。

但是报错:

2015-02-08 23:26:51.595 ERROR net.spy.memcached.protocol.ascii.MutatorOperationImpl: Error: CLIENT_ERROR cannot increment or decrement non-numeric value
2015-02-08 23:26:51.596 INFO net.spy.memcached.MemcachedConnection: Reconnection due to exception handling a memcached operation on {QA sa=localhost/127.0.0.1:11211, #Rops=1, #Wops=0, #iq=0, topRop=Cmd: incr Key: world-recordd Amount: 1, topWop=null, toWrite=0, interested=1}. This may be due to an authentication failure.
OperationException: CLIENT: CLIENT_ERROR cannot increment or decrement non-numeric value
at net.spy.memcached.protocol.BaseOperationImpl.handleError(BaseOperationImpl.java:169)
at net.spy.memcached.protocol.ascii.OperationImpl.readFromBuffer(OperationImpl.java:151)
at net.spy.memcached.MemcachedConnection.handleReads(MemcachedConnection.java:628)
at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:543)
at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:322)
at net.spy.memcached.MemcachedConnection.run(MemcachedConnection.java:1047)
2015-02-08 23:26:51.597 WARN net.spy.memcached.MemcachedConnection: Closing, and reopening {QA sa=localhost/127.0.0.1:11211, #Rops=1, #Wops=0, #iq=1, topRop=Cmd: incr Key: world-recordd Amount: 1, topWop=null, toWrite=0, interested=1}, attempt 0.
2015-02-08 23:26:51.597 WARN net.spy.memcached.protocol.ascii.AsciiMemcachedNodeImpl: Discarding partially completed op: Cmd: incr Key: world-recordd Amount: 1
2015-02-08 23:26:51.599 WARN net.spy.memcached.MemcachedConnection: Could not redistribute to another node, retrying primary node for world-recordd.
2015-02-08 23:26:53.598 INFO net.spy.memcached.MemcachedConnection: Reconnecting {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=1, #iq=0, topRop=null, topWop=Cmd: add Key: world-recordd Flags: 0 Exp: 0 Data Length: 1, toWrite=0, interested=0}

2015-02-08 23:26:53.600 INFO net.spy.memcached.MemcachedConnection: Connection state changed for sun.nio.ch.SelectionKeyImpl@4edc35ba

请问这是什么原因?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 09:39
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于在使用incr操作时,传入的参数是一个long类型的数据。但是在使用incr操作时,Memcached客户端只接受整数类型的参数。因此,你尝试将一个long类型的参数传递给incr操作,导致了错误。

    为了解决这个问题,你可以考虑以下几种解决方案:

    1. 将long类型的数据转换为int或byte类型:
    long longValue = 1L; // 你的long类型数据
    int intValue = (int) longValue;
    byte[] byteArray = new byte[Long.BYTES];
    System.arraycopy(longValue.toByteArray(), 0, byteArray, 0, Long.BYTES);
    
    1. 在incr操作前,先检查参数是否为整数:
    if (param instanceof Integer || param instanceof Byte) {
        // 参数已经可以被incr操作处理
    } else {
        throw new IllegalArgumentException("Parameter must be of type Integer or Byte");
    }
    
    1. 如果你想保持原始的long类型数据,可以在incr操作后将其转换回long类型:
    long newValue = ((Integer) param).intValue();
    long oldValue = (long) key;
    newValue += oldValue;
    key.set(newValue);
    

    请注意,这三种方法都可能会影响到程序的性能和稳定性,请根据实际情况选择最合适的方法。

    评论

报告相同问题?