【Redis源码】Redis命令INCR、DECR、INCRBY、DECRBY学习(二)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis源码】Redis命令INCR、DECR、INCRBY、DECRBY学习(二)

前言:

该篇内容为我对redis的学习记录,欢迎指正批评。文中只是放了部分调试内容,完整的可以根据流程图跟踪。

一.redis incr命令调用流程

DECR和INCR和类似只是一个是增加一个是减少。其余两个命令也大同小异;

二.源码分析

4个命令相应源码,t_string.c中:


voidincrCommand(client *c) {
   incrDecrCommand(c,1);      //incr每次增加1 命令原型:incr test1
}

voiddecrCommand(client *c) {
   incrDecrCommand(c,-1);     //incr每次减少1 命令原型:decr test1
}

voidincrbyCommand(client *c) {
   longlong incr;

   if (getLongLongFromObjectOrReply(c, c->argv[2], &incr, NULL) != C_OK) return;   //获得第二个,增加数量
   incrDecrCommand(c,incr);    //incrby每次增加输入的数 命令原型增加100:incrby test1 100
}

voiddecrbyCommand(client *c) {
   longlong incr;

   if (getLongLongFromObjectOrReply(c, c->argv[2], &incr, NULL) != C_OK) return;  //获得第二个,减少数量
   incrDecrCommand(c,-incr);   //decrby每次加少输入的数 命令原型减少100:decrby test1 100
}

incrDecrCommand函数源码 ,t_string.c中:

voidincrDecrCommand(client *c, longlong incr) {
   longlong value, oldvalue;
   robj *o, *new;

   o = lookupKeyWrite(c->db,c->argv[1]);         //查找有没有对应的键值
   if (o != NULL && checkType(c,o,OBJ_STRING)) return;      //判断类型
   if (getLongLongFromObjectOrReply(c,o,&value,NULL) != C_OK) return;  //获得键值中的数据

   oldvalue = value;
   if ((incr < 0 && oldvalue < 0 && incr < (LLONG_MIN-oldvalue)) ||
       (incr > 0 && oldvalue > 0 && incr > (LLONG_MAX-oldvalue))) {   //判断不能不能越界,超出long long范围
       addReplyError(c,"increment or decrement would overflow");
       return;
   }
   value += incr;   //与操作数相加

   /*
   判断是否大于对象共享整数,value是否在long只最小到最大之间。共享对象整数为大于10000
   */

   if (o && o->refcount == 1 && o->encoding == OBJ_ENCODING_INT &&
       (value < 0 || value >= OBJ_SHARED_INTEGERS) &&
       value >= LONG_MIN && value <= LONG_MAX)                    
   {
       new = o;
       o->ptr = (void*)((long)value);
   } else {
       new = createStringObjectFromLongLong(value); //根据数值创建一个long long的robj结构指针
       if (o) {
           dbOverwrite(c->db,c->argv[1],new);     //重写字典
       } else {
           dbAdd(c->db,c->argv[1],new);           //添加字典
       }
   }
   signalModifiedKey(c->db,c->argv[1]); //通知修改了key
   notifyKeyspaceEvent(NOTIFY_STRING,"incrby",c->argv[1],c->db->id); //发送事件通知
   server.dirty++;
   addReply(c,shared.colon);
   addReply(c,new);
   addReply(c,shared.crlf);
}


三.调试信息(看图片可能看不懂,先看流程图,根据图片再看)

下一个call断点,然后进入incrCommand

打印命令信息,以及调用栈

获得long long对象调试

增加数据部分调试

有键值是覆盖写入


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
122 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
1月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
237 3
|
13天前
|
存储 NoSQL Java
Redis命令:列表模糊删除详解
通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
26 0
|
1月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
30 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
缓存 NoSQL 测试技术
Redis如何解决频繁的命令往返造成的性能瓶颈!
Redis如何解决频繁的命令往返造成的性能瓶颈!
|
30天前
|
NoSQL Redis 数据安全/隐私保护
Redis 命令
10月更文挑战第15天
25 0
|
1月前
|
NoSQL Redis
redis学习五、错误总结,redis正常运行时后会出现一些bug 总结。
本文介绍了Redis在正常运行时可能遇到的一个错误,即无法进行磁盘持久化的问题,并提供了通过设置`stop-writes-on-bgsave-error`为`no`来解决这一问题的方案。
94 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
9天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
10天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构