源码解读 zsetAdd
2024-09-20 21:36:18
https://github.com/antirez/redis/blob/6a6471aad5e4f8d6cbab677b918b14cdee416296/src/t_zset.c
/* Update the sorted set according to its encoding. */
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *eptr; if ((eptr = zzlFind(zobj->ptr,ele,&curscore)) != NULL) {
/* NX? Return, same element already exists. */
if (nx) {
*flags |= ZADD_NOP;
return 1;
} /* Prepare the score for the increment if needed. */
if (incr) {
score += curscore;
if (isnan(score)) {
*flags |= ZADD_NAN;
return 0;
}
if (newscore) *newscore = score;
} /* Remove and re-insert when score changed. */
if (score != curscore) {
zobj->ptr = zzlDelete(zobj->ptr,eptr);
zobj->ptr = zzlInsert(zobj->ptr,ele,score);
*flags |= ZADD_UPDATED;
}
return 1;
} else if (!xx) {
/* Optimize: check if the element is too large or the list
* becomes too long *before* executing zzlInsert. */
zobj->ptr = zzlInsert(zobj->ptr,ele,score);
if (zzlLength(zobj->ptr) > server.zset_max_ziplist_entries)
zsetConvert(zobj,OBJ_ENCODING_SKIPLIST);
if (sdslen(ele) > server.zset_max_ziplist_value)
zsetConvert(zobj,OBJ_ENCODING_SKIPLIST);
if (newscore) *newscore = score;
*flags |= ZADD_ADDED;
return 1;
} else {
*flags |= ZADD_NOP;
return 1;
}
最新文章
- 如何使用Dubbo服务和集成Spring
- Linux 查看服务器开放的端口号
- Xcode Pod使用
- String类型中ToString hashCode equals compareTo等方法的经典实现
- Struts2几种传值
- PR 创建
- Android5.0之NavigationView的使用
- linux 服务器更主板后无法识别网卡处理过程
- Tomcat 服务器的端口号的修改
- c++ 文件读写(转)
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
- intellij idea 学习
- pureMVC简单示例及其原理讲解二(Model层)
- adb不是内部或外部命令
- 剑指offer-第一个只出现一次的字符
- map集合的常用方法
- verilog中signed的使用
- JS所包含的大纲内容,以及JS中数据类型、运算符的介绍
- eclipse使用和快捷键
- django 认证系统--3