Redis-Map
Redis Map 存储K-V键值对。(跟Java的Map类比)
哈希表结构:
typedef struct dictht {
dictEntry **table; //哈希表数组
unsigned long size; //哈希表大小
unsigned long sizemask; //哈希表掩码,用于计算索引值。总是等于 size - 1
unsigned long used; //该哈希表已有节点的数量
} dictht;
哈希表节点结构:
typedef struct dictEntry {
void *key; //键
union{ //值
void *val;
uint64_t u64;
int64_t s64;
} v;
struct dictEntry *next; //指向下一个哈希表节点,形成链表。
}
字典结构:
typedef struct dict {
dictType *type; //类型特定函数
void *privdata; //私有数据
dictht ht[2]; //哈希表数组,长度为2。一般情况下使用h[0],在rehash时,使用h[1]进行过渡。
int trehashidx; // rehash 索引,当rehash不在进行时,值为 -1。配合ht[2]进行rehash。
}
结构图如下:

哈希算法,如何添加一个新值:
1、计算k的hash值。
2、由是否进行rehash决定使用h[0],还是h[1](rehash时,用h[1])。
3、根据k的hash值和sizeMask计算(hash(K) & sizeMash), 得到 table中的 dictEntry[?] 的位置。
4、用链表法,解决hash冲突。
rehash : 重新哈希
1、为ht[1]分配空间。扩展的大小为 ht[0].used 的第一个大于 2n的数。修改trehashidx标识0。
2、将ht[0]的数据,重新计算得到dictEntry的位置,存入ht[1]。
3、数据完成迁移后,将ht[0],ht[1]的指针对调。修改trehashidx表示为-1。
4、哈希方式为渐进式哈希。哈希期间,会操作两个ht。(在ht[1]进行添加操作;先在ht[0]进行删除操作,再到ht[1])
Redis-Map的更多相关文章
- redis map存储的注意点
- redis发布订阅Java代码实现
Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 为了实现redis的发布订阅机制,首先要打开re ...
- redis 缓存
本篇博客只介绍 redis 作为缓存的的一些使用,以及在项目中如何把redis和spring如何集成. 1:redis的maven依赖,redis 依赖 spring-redis 依赖: < ...
- sping整合redis,以及做mybatis的第三方缓存
一.spring整合redis Redis作为一个时下非常流行的NOSQL语言,不学一下有点过意不去. 背景:学习Redis用到的框架是maven+spring+mybatis(框架如何搭建这边就不叙 ...
- redis mysql 连接池 之 golang 实现
1 mysql 连接池代码 package lib import ( "database/sql" "fmt" "strconv" &quo ...
- java:redis(java代码操作redis,实体类mapper生成器(generator))
1.redis_demo Maven ItemMapper.xml: <?xml version="1.0" encoding="UTF-8" ?> ...
- [源码分析] OpenTracing之跟踪Redis
[源码分析] OpenTracing之跟踪Redis 目录 [源码分析] OpenTracing之跟踪Redis 0x00 摘要 0x01 总体逻辑 1.1 相关概念 1.2 埋点插件 1.3 总体逻 ...
- Go 每日一库之 viper
简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...
- 7.Docker容器使用辅助工具汇总
原文地址: 点击直达 more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack- ...
随机推荐
- centos networkmanager 和 network配置冲突
1.由于NetworkManager与 network 有冲突,所以要把NetworkManager关掉
- [推荐] 网络侦查工具 NMAP 简单入门
[推荐] 网络侦查工具 NMAP 简单入门 # 前言 作为一只运维开发,总是避不开要和网络打交道的.尤其是当自身能力到达瓶颈,开始从事云计算以求突破.会有搭建多台虚拟机的需要,这时候如果在手工的查询 ...
- 使用IDEA结合MAVEN创建一个Spring Java Web项目
前言 如今的Java项目,如果还使用传统的把jar包复制到目录下这种原始的方式,对于依赖管理来说实在是灾难.对某个功能需要引入某种技术包,但是你不确定是否已存在,如果分类好的话还好找,若是杂在一堆不仅 ...
- 架构师养成记--18.NIO
有人叫new IO 我这里就叫Non-block IO 经典概念: Buffer(缓冲区):之前直接通过流,现在提供一个buffer存放数据. Channel:管道,包括ServerSocketCha ...
- 获得自己电脑的SSH公匙
关于什么是SSH请点击此"www.Baidu.com”网站了解 我这里只说怎么获取属于自己电脑的SSH公匙 本人是Win10电脑 所以相对来说简单一点 点击win ->选择设置-&g ...
- Mac 10.12安装Atom文本增强编辑工具
下载: https://atom.io/
- (转)rsync+inotify实时同步
原文:http://lxw66.blog.51cto.com/5547576/1331048 声明:rsync inotify 需要逆向思考,当只做rsync不实时同步时,我们一般是从rsync服务端 ...
- springmvc执行原理及自定义mvc框架
springmvc是spring的一部分,也是一个优秀的mvc框架,其执行原理如下: (1)浏览器提交请求经web容器(比如tomcat)转发到中央调度器dispatcherServlet. (2)中 ...
- Unity 依赖注入
关于Ioc的框架有很多,比如astle Windsor.Unity.Spring.NET.StructureMap,我们这边使用微软提供的Unity做示例,你可以使用Nuget添加Unity,也可以引 ...
- hibernate多对多单向关联
多对多单向,一个学生可以有多个老师,一个老师也可以教多个学生.老师可以找到他的学生,学生找不到教他的老师. 老师类Teacher: package com.oracle.hibernate; impo ...