redis 代码--hash/迭代

地震数据可视化必备:5分钟读懂SEGY道头字段全解析(含坐标定位指南) 本文深入解析了SEGY文件格式中道头坐标字段的提取与可视化方法。针对地震数据处理中的常见痛点,详细介绍了sx/sy、gx/gy等关键坐标字段的二进制解析、比例因子应用、单位转换及常见问题解决方案,并提供了实用的Python代码示例,帮助开发者实现从SEGY文件到三维空间可视化的完整流程。 阅读详情
ypedef struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
    } v;
    struct dictEntry *next;
} dictEntry;

typedef struct dictType {
    unsigned int (*hashFunction)(const void *key);
    void *(*keyDup)(void *privdata, const void *key);
    void *(*valDup)(void *privdata, const void *obj);
    int (*keyCompare)(void *privdata, const void *key1, const void *key2);
    void (*keyDestructor)(void *privdata, void *key);
    void (*valDestructor)(void *privdata, void *obj);
} dictType;

/* This is our hash table structure. Every dictionary has two of this as we
 * implement incremental rehashing, for the old to the new table. */
typedef struct dictht {
    dictEntry **table;
    unsigned long size;//桶个数
    unsigned long sizemask;//桶掩码。 size-1
    unsigned long used;//table中元素总个数
} dictht;

typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];//ht[0]是供正常使用过的。 ht[1]是供rehash用的。 rehash完之后会将ht[0] = ht[1] && reset(ht[1])
    int rehashidx; /* rehashing not in progress if rehashidx == -1 */
    int iterators; /* number of iterators currently running 只有iterator->safe==1时才会自增或者自减,普通的iterator不会影响该值*/
} dict;



核心函数:

rehashidx 是-1时表示没有在rehash中。 否则rehashidx就是正在rehash 的桶下标。

dictExpand:扩大hashtable的大小; 这里指桶的大小、 而不是指能够存放的总大小。

dictRehash(dict *d, int n):逐个桶的rehash。n仅表示本次函数调用期望处理的有效桶个数。返回0表示整个hash完。

_dictKeyIndex:查找。分别在ht[0]与ht[1]中查找该key,找到则返回-1; 未找到时若在rehash则返回在ht[1]中的桶下标,否则返回ht[0]中的下标。

key的桶下标计算方式是: dictHashKey(key) & (size - 1)。 其中size总是2倍的方式扩大。 此种计算方式得到的桶下标必定<size。


查找:先在ht[0]中找, 未找到且在rehashing中,则继续在ht[1]中找。 返回找到的桶下标,否则返回-1.

插入:如果查找已成功, 则返回-1、不允许插入; 否则如果在rehash中,则插入到ht[1]中;否则插入到ht[0]中。 插入在桶的头部

在unsafe的迭代过程中(iterators > 0)时, 不允许继续rehash。

迭代过程中允许插入和删除。 插入的/删除的可能不会被遍历到。 但不会引起错误, 只要迭代器当前的元素没被删除即可。


删除时,先查找, 然后从链表总删掉。


typedef struct dictIterator {
    dict *d;
    int table; //d的ht的索引。 0或者1
    int index; //d->ht[table]的桶下标
    int safe;  //为1时, 会影响到d->iterators
    dictEntry *entry, *nextEntry;
    long long fingerprint; /* unsafe iterator fingerprint for misuse detection */
} dictIterator;
当未设置safe时, 就必须保证fingerprint在release时相同, 就是说d未被增删元素、未被rehash
dictEntry *dictNext(dictIterator *iter)
{
    while (1) {
        if (iter->entry == NULL) {
            dictht *ht = &iter->d->ht[iter->table];
            if (iter->index == -1 && iter->table == 0) {////刚被初始化、第一次调用时
                if (iter->safe)
                    iter->d->iterators++;
                else
                    iter->fingerprint = dictFingerprint(iter->d);
            }
            iter->index++;//该bucket的entry为null,因此继续到下一个bucket。
            if (iter->index >= (signed) ht->size) {//桶下标溢出, 则到ht[1]中从bucket 0开始
                if (dictIsRehashing(iter->d) && iter->table == 0) {
                    iter->table++;
                    iter->index = 0;
                    ht = &iter->d->ht[1];
                } else {
                    break;
                }
            }
            iter->entry = ht->table[iter->index];
        } else {
            iter->entry = iter->nextEntry;
        }
        if (iter->entry) {
            /* We need to save the 'next' here, the iterator user
             * may delete the entry we are returning. */
            iter->nextEntry = iter->entry->next;
            return iter->entry;
        }
    }
    return NULL;
}




NVIDIA B300 vs B200:详细解析与性能对决 详细解析 NVIDIA B300 整机)的性能,并与前代的 B200 进行对比。它不仅在核心计算能力(FP8)上实现了飞跃,更重要的是通过革命性的第二代 Transformer Engine 和第五代 NVLink 技术,彻底重塑了大规模 AI 模型训练和推理的效率与规模上限。其显存容量和带宽的巨大提升也为处理超大型模型和数据提供了坚实基础。与 B200 相比,B300 是一次全面的、代际性的性能跃升,特别适合那些需要处理最前沿、最复杂 AI 和科学计算任务的用户和组织。 阅读详情

相关推荐

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB,并例化到顶层设计,发现UART_RX管脚在进行管脚分配时没有显示出来,最后发现是CoreAPB3总线IP核配置不对导致,改为如下配置后正常。

whik1194的博客 713

redishash

redishash与一般hash不同之处在于扩容时渐进式的数据迁移,将一次很长的耗时操作平摊到了多次操作上,在单线程命令执行模式下极大的提升了吞吐量。

happytree001的博客 1642

2024顶级提示工程工具:提升效率的12个神器

LlamaIndex虽然本身不是直接的提示词编辑工具,但其整个设计都围绕着如何有效地将外部知识融入LLM的提示词。它提供了结构化的方式来管理“上下文窗口”——即哪些私有数据应该被包含在提示词中。通过优化索引结构和检索策略,可以确保提示词中包含最相关、最高质量的上下文信息,从而大幅提升LLM基于私有数据回答问题的准确性和相关性。同时,LlamaIndex允许开发者针对不同的查询类型和数据特点定制提示词模板,这使得提示词的复用和优化更加系统化。

AIGC应用创新大全的博客 1076

redis源码分析 2 迭代

redis 迭代器 字典遍历

hahackeris的专栏 279

Redis基础--Hash操作常用命令

目录 HGET HSET HSETNX HLEN HINCRBY HINCRBYFLOAT HMGET HMSET HKEYS HVALS HGETALL HEXISTS HDEL HSCAN HGET 命令语法:HGET key field 命令用途:返回哈希表键 key 中给定域 field 的值。 时间复杂度:O(1)...

pengjunlee的博客 5万+

哈希算法介绍

哈希算法 哈希函数: 在密码学中,哈希函数H是一个公开函数,用于将任意长的消息M映射为较短的、固定长度一个值H(M),作为认证符,称函数值H(M)为哈希值或哈希码或消息摘要。哈希函数的安全性要求给定数据容易计算出哈希值,但给定哈希值不能计算出数据。哈希码提供了一种错误检测能力。 使用哈希函数提供消息认证有6种基本使用方式: (1)消息与哈希码链接后用单钥加密算法加密(2)用单钥加密算法仅对哈希码加密(3)用公钥加密算法和发方的秘密钥仅加密哈希码,这种方法提供了数字签名(4)消息的哈希码值用公钥加密算

hellolde的博客 1913

redis获取hash所有数据

使用 Redis 获取 Hash 所有数据的完整指南 Redis 是一个高性能的键值数据库,广泛用于缓存、会话存储和消息队列等场合。Redis 提供了多种数据结构,其中 Hash 特别适合存储对象,能将多个字段和值组合在一起,形成一个字典类型。本文将详细介绍如何使用 Redis 获取 Hash 中所有数据,包括步骤、命令示...

weixin_40483283的博客 1005

Redis存储(8)Redis的C++客户端安装和使用

本文介绍了使用redis-plus-plus C++库操作Redis的完整指南。主要内容包括:1) 安装指南,详细说明Ubuntu和CentOS系统下编译安装hiredisredis-plus-plus的步骤;2) 基础使用示例,展示如何建立连接和执行基本命令;3) 各类数据结构的操作示例,包括字符串、哈希、列表、集合和有序集合的完整测试代码;4) 实用工具函数和Makefile配置。文章提供了从环境搭建到实际应用的全流程指导,特别强调了C++17特性使用和跨平台注意事项,适合需要高效Redis操作的C+

2401_87986548的博客 688

哈希表笔记(二)redis

这份代码Redis核心数据结构之一的字典(dict)实现,本质上是一个哈希表的实现。Redis的字典结构被广泛用于各种内部数据结构,包括Redis数据库本身和哈希键类型。

Jerry的博客 1595

Redis哈希表与jdk哈希表比较

Redis哈希表与jdk哈希表比较Redis哈希表// 字典 typedef struct dict { // 类型 dictType *type; // 私有数据 void *privdata; // 哈希表 // 两个表,一个是使用的表,一个是供rehash使用的表 dictht ht[2]; //rehash索引 // 默认为-1 int rehashi

1447

Redis100篇 - Redis哈希表为什么快 扩容和缩容机制详解

Redis哈希表高效的关键在于其精心设计的底层结构、渐进式rehash机制和负载因子控制。哈希表使用链地址法解决冲突,并通过SipHash算法保证均匀分布。当负载因子超过阈值时,Redis会触发渐进式扩容/缩容,分步迁移数据到新哈希表,避免服务中断。核心优化包括:快速索引计算(位运算替代取模)、双哈希表设计(实现平滑rehash)以及动态调整大小(2的幂次扩容)。这些特性共同确保了Redis哈希表在O(1)时间复杂度下的稳定性能。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Redis Hash 全解析:从入门到精通,解锁高性能对象存储的钥匙

在现代应用开发中,我们无时无刻不在与“对象”打交道——用户信息、商品详情、配置项、会话数据……如何高效、清晰地在缓存或数据库中存储这些结构化数据,是每一个开发者都需要面对的课题。你可能会想到将一个对象序列化成 JSON 字符串,然后用一个简单的 Key-Value 方式存入 Redis。这确实是一种方法,但当你只想修改对象的某一个属性(比如用户的积分)时,就不得不读取整个 JSON 字符串,反序列化成对象,修改属性,再序列化回 JSON,最后整个写回 Redis

2301_80863610的博客 7294

【基础算法】简单了解一下常见的几种散列算法?

简单了解下有哪些常见的散列函数,不涉及原理

长路漫漫的歇脚处 4810

Redis常用命令及C/C++调用Redis接口详解

文章目录一、Redis常用命令启动Redis服务端启动Redis客户端Redis常用命令详解键(Key)命令Hash 命令String 命令List 命令Set 命令Zset 命令二、C/C++调用接口连接和操作Redis数据库hiredis.h同步API连接redis数据库发送命令到redis处理redis应答清理连接资源发送多个命令参数访问Redis代码实例 一、Redis常用命令 一般Redis都是安装在linux上,分为server和client。 启动Redis服务端 在终端输入以下命令启动 Re

qq_41854911的博客 1万+

C++与Redis高效交互:通过optional与迭代器玩转String/List/Set......,打造高性能存储方案!​

本文详细介绍了C++通过redis-plus-plus操作Redis的完整流程,涵盖String、List、Set、Hash、Zset等数据类型的常用命令(如set/get、mset/mget、sadd/spop、hset/hget、zadd/zrange等),结合std::optional、迭代器等C++特性解析参数传递、返回值处理及无效值管理,并提供完整测试代码,助力开发者快速掌握Redis C++客户端开发。

羑悻的博客. 4848

Redis源码分析(三)---dict哈希结构

 昨天分析完adlist的Redis代码,今天马上马不停蹄的继续学习Redis代码中的哈希部分的结构学习,不过在这里他不叫什么hashMap,而是叫dict,而且是一种全新设计的一种哈希结构,他只是通过几个简单的结构体,再搭配上一些比较常见的哈希算法,就实现了类似高级语言中HashMap的作用了。也让我见识了一些哈希算法的实现,比如dbj hash的算法实现,俗称times33,算法,就是不停的*...

xumaojun的专栏 729

跋山涉水 —— 深入 Redis 字典遍历

Redis 字典的遍历过程逻辑比较复杂,互联网上对这一块的分析讲解非常少。我也花了不少时间对源码的细节进行了整理,将我个人对字典遍历逻辑的理解呈现给各位读者。也许读者们对字典的遍历过程有比我更好的理解,还请不吝指教。

javagty6778的博客 211

redis常用迭代方法zscan,sscan,hscan,scan

redisClient.sscan和redisClient.zscan都是Redis的命令,用于扫描集合或有序集合中的元素。 区别在于: sscan用于扫描集合中的元素,集合是无序的,所以sscan返回的元素也是无序的。 zscan用于扫描有序集合中的元素,有序集合是按照分数(score)排序的,所以zscan返回的元素是按照分数排序的。 另外,sscan和zscan都支持分批次扫描,可以通过指定游标(cursor)和扫描数量(count)来控制每次扫描的元素数量。这样可以避免一次性扫描大量元素导致的性能

qq_36400213的博客 1424

Hash函数理解

哈希函数(Hash)  又称为 散列函数、散列算法、杂凑函数等  是一种单向密码体制:从明文到密文的不可逆映射  可将任意长度的输入变换为固定长度的输出  生成消息的“数据指纹”(也称消息摘要或散列值), 在数据完整性认证和数字签名等领域有广泛的应用 分类:  改动检测码MDC(Manipulation Detection Code)  不带密钥哈希函数,检测消息有无篡改

幸福诗歌的博客 8542

python下的redis使用(字符串、hash、增量迭代)

安装 使用 操作模式 连接池 字符串操作 Hash操作 量式迭代 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集...

全干工程师 1241

redis 哈希(Hash)

1、概述 Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 - 1 键值对(40多亿)。 2、常见命令 HDEL key field [field ...]:删除一个或多个Hash的field HEXISTS key field:判断field是否存在于hash中 HGET key field: 获取hash中field的值 HGETALL key:从hash中读取全部的

azh89125的博客 3872

redis缓存穿透,缓存击穿,缓存雪崩解决方案

请大家了解下redisson,在之前讲过的分布式锁和下面讲的布隆过滤器还有读写锁都需要使用到redisson.

liuhanyu9481的博客 284

基于 SOMEIP 协议的 CANoe 软件仿真

基于 SOMEIP 协议的 CANoe 软件仿真,内容很使用。

基于Matlab驱动CAN接口设备进行通信(源码+说明文档).rar

1、资源内容:基于Matlab驱动CAN接口设备进行通信(源码+说明文档).rar2、适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业或毕业设计,作为“参考资料”使用。3、解压说明:本资源需要电脑端使用WinRAR、7zip等解压工具进行解压,没有解压工具的自行百度下载即可。4、免责声明:本资源作为“参考资料”而不是“定制需求”不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。由于作者大厂工作较忙,不提供答疑服务,如不存在资源缺失问题概不负责,谢谢理解。

上一篇: ProtoBuf中的编码
下一篇: redis代码 事务
aalbertini
博客等级 码龄19年 56粉丝 254原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值