redis存储原理和数据模型

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: redis存储原理和数据模型

redis是不是单线程,单线程是指什么?

       通过redis-server redis-conf启动redis服务,启动后的redis-server是主线程,bio_close_file线程用来关闭大文件,redis是内存数据库,当我们需要将内存数据刷新到磁盘中,redis中有种方式是fork一个进程并在子进程中进行持久化,持久化工程中会产生rdb的文件,rdb文件中存储着内存中的数据,如果rdb是个大文件,就会涉及关闭大文件的问题;bio_aof_fsync也是刷盘线程,write把文件数据写到缓冲区,fsync把缓冲区的数据刷新到磁盘中,第一种aof也是一种持久化的方式,它是在进程当中直接进行刷盘,第二种aof是fork产生一个进程并在子进程中进行持久化;io_thd_*是开启的多个线程帮我们处理读写io的操作;jemalloc_bg_thd线程分配和管理内存及内存池;可以看到redis并不是单线程,我们说的单线程是指命令处理是单线程,所有数据结构的操作都是在单线程redis-server中处理的;

为什么redis要单线程处理命令?

       单线程的局限是,不能有耗时操作,对于redis而言会影响响应性能;

       io密集型,有磁盘io和网络io,磁盘io在fork的子进程中进行持久化,或aof异步刷盘;

       网络io,有多个和redis建立的连接并且连接中发送了大量的数据,需要往redis中读大量数据,redis中记录日志,如果只有一个线程去处理就会有很大的负担成为耗时的操作;

       cpu密集型,如果kv中的v数据结构非常大,处理不高效,就可能带来cpu密集;

       不采用多线程的原因,一个是kv中的v数据结构较多,加锁复杂,锁的粒度不好控制,一个是频繁的上下文切换会抵消多线程的优势;

redis源码实现

       在redis中通过宏定义区分字符串的编码方式;

       散列表中会有很多的kv,不同的value可能是不同的类型,redisDB中dict是用于存储db中所有数据;expires说明key过期情况;blocking_keys说明阻塞连接;ready_keys说明key的变动情况;重点是dict数据结构;

       所有的数据存储的ht[2]中,就是散列表的意思;

       table是指针数组,size是数组的长度,因为数组长度必须是2^n,sizemask是数组长度减一,通过hash(key)&sizemaskZ优化,used说明实际存储的元素个数;

       rehash的规律,经过rehash后,ht[0]中0位置的数据要么在ht[1]中0位置,要么在ht[1]中4位置;

       redis中有个scan去遍历所有的kv确保不重复不遗漏,上面rehash可能因为正在进行扩容而出现重复;如果size是4的话,那么先遍历0,然后遍历2,再遍历1,最后遍历3;size等于8的时候则是树中第二层遍历规则;采用高位进位加法的遍历顺序,rehash后的槽位在遍历顺序上是相邻的;遍历目标是不重复,不遗漏;会出现一种重复的情况,在scan过程当中,发生两次缩容的时候,会发生数据重复;如果项目中用到scan命令,在server端自己去重;

redis中rehash源码

redis中的跳表

redis中io多线程相关函数与实现

redis中io多线程,redis.conf中说明了线程数为4,其中有一个为主线程;io thread本质上只开了三个线程;io多线程的总前提是要有多个并发连接,一条连接不会使用io多线程;

如果只有一条连接的情况下,stopThreadedIOIfNeeded会把多线程关闭掉;

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6天前
|
缓存 NoSQL Apache
【Redis】布隆过滤器原理与应用
【Redis】布隆过滤器原理与应用
12 1
|
1天前
|
监控 NoSQL 算法
深入剖析Redis哨兵模式的原理和应用
Redis的哨兵模式是实现高可用性和自动故障转移的机制,当主服务器故障时,哨兵能自动检测并进行故障转移,确保服务连续和稳定性。哨兵模式通过监控主从服务器状态、自动故障转移、防止数据不一致,提高容错能力和负载均衡,降低运维成本,实现高可用性。哨兵通过检测主观下线和客观下线状态,以及选举Leader Sentinel来协调故障转移。Raft算法在其中用于领导者选举和状态一致性。哨兵模式通过综合考虑多种因素选举新主服务器并执行故障转移,保障集群稳定运行。
12 0
深入剖析Redis哨兵模式的原理和应用
|
5天前
|
NoSQL Redis
Redis入门到通关之Redis主从数据同步原理
Redis入门到通关之Redis主从数据同步原理
15 0
|
5天前
|
存储 NoSQL Redis
Redis入门到通关之Redission原理
Redis入门到通关之Redission原理
12 0
|
5天前
|
缓存 NoSQL 算法
【redis】布隆过滤器(Bloom Filter)原理解析与应用
【redis】布隆过滤器(Bloom Filter)原理解析与应用
12 1
|
8天前
|
运维 监控 NoSQL
|
20天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
20天前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
54 12
|
20天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
327 0
|
29天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
275 2