目前广泛使用的分布式缓存Redis和Memcached均支持对整数型Value值的增减,对应到具体命令中就是incr和decr命令。

incr/decr是原子性操作(memcached 1.2.4及以后版本加入/redis),其被广泛应用于计数器和限速器。

一、分布式缓存Redis和Memcached在这两个命令的具体语法上的不同

Redis的incr命令语法分两种:

1)incr key,即将指定主键key的value值加一;

2)incrby key increment,即将指定主键key的value值加上increment。

Redis的decr命令语法同样分为两种:

1)decr key,即将指定主键key的value值减一;

2)decrby key decrement,即将指定主键key的value值减去decrement。

Memcached的incr命令语法

1)incr key integer,即将指定主键key的value值加上给定的integer,

2)decr命令语法为decr key interger,即将指定主键key的value值减去给定的interger。

二、分布式缓存Redis和Memcached支持的整型数值的不同

Redis支持的整数型Value值的具体类型为字符串(十进制)表示的带符号64-bit整数,

Memcached支持的整数型Value值的具体类型为字符串(十进制)表示的无符号64-bit整数,

这就导致两个系统支持的整数型Value值的取值范围是不一样的。Redis支持的整数型Value值范围是-9223372036854775808~9223372036854775807,而Memcached的范围则是0~18446744073709551615。

1、key内存储的字符串被解释为十进制

    #Server

    Memcached_version: 1.2.6

# Server
redis_version:3.1.999

从上述对Memcached和Redis的实验可以看到,对incr命令保存为字符串。

2、Redis带符号64-bit整数,Memcached无符号64-bit整数

1)先为一个key max赋一个带符号64-bit整数最大值9223372036854775807;
redis 127.0.0.1:6379> set max 9223372036854775807
OK
2)将该主键的值加一,系统提示此加一动作会导致向上溢出,由此可见Redis支持的最大整数型Value值确实为9223372036854775807;
redis 127.0.0.1:6379> incr max
(error) ERR increment or decrement would overflow
3)再为一个key min赋一个带符号64-bit整数最小值-9223372036854775808;
redis 127.0.0.1:6379> set min -9223372036854775808
OK
4)将该主键的值减一,系统提示此减一操作会导致向下溢出,由此可见Redis支持的最小整数型Value值确实为-9223372036854775808;
redis 127.0.0.1:6379> decr min
(error) ERR increment or decrement would overflow

看下Memcached情况又会如何

1)先为一个key max赋一个无符号64-bit整数最大值 18446744073709551615;
set max 0 0 20
18446744073709551615
STORED
2)将该主键的值加一,系统的执行结果为0,即系统自身会自动避免向上溢出,由此可见Memcached支持的最大整数型Value值确实应该为18446744073709551615;
incr max 1
CLIENT_ERROR cannot increment or decrement non-numeric value 
 
疑问:递增1后问什么没有溢出,反而提示了 “对非数字的缓存操作才会返回的错误信息”
 
3)再为一个key min赋一个无符号64-bit整数最小值0;
set min 0 0 1
0
STORED
4)将该主键的值减一,系统的执行结果还是0,即系统自身会自动避免向下溢出,由此可见Memcached支持的最小整数型Value值确实应该为0;
decr min 1
0

三、分布式缓存Redis和Memcached,incr/decr的差异                                    

     1、Redis如果对应的key不存在,incr/decr不会失败,而会从0开始计数

          

      2、Memcached如果对应值不存在,incr/decr会失败,而不会从0开始计数

   上面的测试是基于Memcached 文本协议的做法。因为文本协议不允许incr 设置不存在的key。

        如xmemcached中,memcachedClient.incr("a",5,1),memcachedClient.incr("a",5)

incr和decr都有三个参数的方法,第一个参数指定递增的key名称,第二个参数指定递增的幅度大小,第三个参数指定当key不存在的情况下的初始值。
        两个参数的重载方法省略了第三个参数,默认指定为0。

3、incr/decr操作无法刷新过期时间

Redis,我们知道set、getset命令为键值赋值同时会消除键值的生存时间、persist命令把一个设置过过期时间的键取消过期时间设置,如果需要可以重新使用expire命令为键设置生存时间。而其他对键的操作命令(如incr、lpush、hset、zrem)都不会影响键的生存时间。

Memcached,incr/decr操作无法刷新过期时间,所以过期时间以初始化的时间为准。

因此,如果使用memcached作为长期的计数器,必须用额外的机制定时刷新item。memcached协议提供了touch方法,只刷新时间,不对值作修改。

    如果是二进制协议,则可以直接用incr命令设置初始值,过期时间。

Memcached官方协议看这里 。

参考:http://blog.sina.com.cn/s/blog_48c95a190101772i.html

由于本人经验有限,文章中难免会有错误,请浏览文章的您指正或有不同的观点共同探讨!

Redis与Memcached的incr/decr差异对比的更多相关文章

  1. 论述Redis和Memcached的差异

    原文 https://yq.aliyun.com/articles/60981?utm_campaign=wenzhang&utm_medium=article&utm_source= ...

  2. mongodb,redis,memcached,mysql对比

    1.性能都比较高,性能对我们来说应该都不是瓶颈总体来讲,TPS方面redis和memcache差不多,要大于mongodb 2.操作的便利性memcache数据结构单一redis丰富一些,数据操作方面 ...

  3. redis、memcached、mongoDB 对比与安装

    一.redis.memcached.mongoDB 对比 Memcached 和 Redis都是内存型数据库,数据保存在内存中,通过tcp直接存取,速度快,并发高.Mongodb是文档型的非关系型数据 ...

  4. Redis和Memcached对比

    Redis和Memcached对比 这两年 Redis火得可以,Redis也常常被当作 Memcached的挑战者被提到桌面上来.关于Redis与Memcached的比较更是比比皆是.然而,Redis ...

  5. Redis和Memcached对比【转】

    Redis和Memcached对比 这两年 Redis火得可以,Redis也常常被当作 Memcached的挑战者被提到桌面上来.关于Redis与Memcached的比较更是比比皆是.然而,Redis ...

  6. Redis与Memcached的实现对比

    原文链接:http://www.tuicool.com/articles/qUBNZva Memcached 与 Redis ,作为近些年最常用的缓存服务器,相信大家对它们再熟悉不过了.前两年还在学校 ...

  7. redis、memcached、mongoDB 对比

    Mongodb和Memcached不是一个范畴内的东西.Mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据.Mongodb 和 Memcached不存在谁替换谁的问题. ...

  8. Redis和Memcached的区别详解

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/119.html?1455855360 Redis的作者Salvatore ...

  9. Redis和Memcached的区别

    From: https://www.biaodianfu.com/redis-vs-memcached.html Redis的作者Salvatore Sanfilippo曾经对这两种基于内存的数据存储 ...

随机推荐

  1. C#学习笔记(补充)——扩展方法、事件

    (搬运自我在SegmentFault的博客) 一.扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 注意事项: 扩展方法 ...

  2. rspec的一些常见用法

    这里讲了如何安装rspec,安装使用rspec. 下面介绍一下rspec中常见的使用方法. 下面是一个最简单的测试用例,判断true是不是等于true,should_be是旧的用法,新用法推荐使用ex ...

  3. 嵌入式中的 *(volatile unsigned int *)0x500 解释

    C语言中*(volatile unsigned int *)0x500的解释: 如下: (unsigned int *)0x500:将地址0x500强制转化为int型指针*(unsigned int ...

  4. android保存图片的方式

    Android中保存图片的两种方式 第一种是保存到数据库: 1.保存到数据库: 2.从数据库读取: 二是以图片格式保存到本地 1. A.声明tempFile以保存到指定路径: B.保存到tempFil ...

  5. Unity3d Shortcuts

    参考:http://www.ceeger.com/Manual/ 场景视图导航  Click-drag to drag the camera around. 点击拖拽平移场景视图 Hold Alt a ...

  6. OC中实例变量可见度、setter、getter方法和自定义初始化方法

    在对类和对象有一定了解之后,我们进一步探讨实例变量的可见度等相关知识 实例变量的可见度分为三种情况:public(共有),protected(受保护的,默认),private(私有的),具体的不同和特 ...

  7. 关于ios极光推送server端注意的地方

    今天试用了极光推送API 用它是因为,大多数人说它的文档是最全的,但是用过之后,发现关于IOS的文档,还是很不够,导致走了一点弯路! 特别是服务端的代码:https://github.com/jpus ...

  8. sharepoint 浏览页面导航不正确

    问题是这样的: sharepoint网站上建立一个二级站点,然后在网站中创建几个页面.当浏览二级网站的页面的时候,顶部导航的位置总是在首页的地方,而不是我的二级站点的导航位置. 解决方法: 转到网站集 ...

  9. QtSpim实现MIPS指令的编写

    QtSpim实现MIPS指令的编写 由于各种对齐问题,cnblogs的格式难以控制,故贴图片,谅解.

  10. 硬件描述语言Verilog设计经验总结

    一.硬件描述语言Verilog 粗略地看Verilog与C语言有许多相似之处.分号用于结束每个语句,注释符也是相同的(/* ... */和// 都是熟悉的),运算符"=="也用来测 ...