一文搞懂内存数据库-Redis

Redis是一个高性能的键值对内存数据库,用于数据库、缓存和消息中间件。它支持多种数据类型,如字符串、散列、列表等,并提供数据持久化。Redis通过主从复制、哨兵系统实现高可用,且Twitter的Twemproxy提供了代理服务来分散写压力。集群通过槽位分片实现分布式存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。

性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。单进程单线程,是线程安全的,采用 IO 多路复用机制。丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载。主从复制,哨兵,高可用。可以用作分布式锁。可以作为消息中间件使用,支持发布订阅。

特点:

很多数据库只能处理一种数据结构
SQL数据库—表格
Memcached—键值对数据库,键值是字符串
文档数据库(MongoDB)—由JSON/BSON组成的文档

过期键功能:
为键设置一个过期时间,让它在制定的时间之后自动被删除。
复制:
主从复制。

5种数据类型

5种数据类型比较
Redis为什么这么快?
1、Redis 完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度是 O(1)。
2、数据结构简单,对数据操作也简单。
3、采用单线程,避免了不必要的上下文切换和竞争条件,不存在多线程导致的 CPU 切换,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。4、使用多路复用 IO 模型,非阻塞 IO。
扩展一下多路复用IO模型:https://www.cnblogs.com/dunitian/p/10099343.html

Redis 和 Memcache 的区别
1、存储方式上:Memcache 会把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis 有部分数据存在硬盘上,这样能保证数据的持久性。
2、数据支持类型上:Memcache 对数据类型的支持简单,只支持简单的 key-value,而 Redis 支持五种数据类型。
3、使用底层模型不同:它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、Value 的大小:Redis 可以达到 1GB,而 Memcache 只有 1MB。

Redis持久化

将数据从内存存放到能够永久存储的设备上。

持久化方式
RDB(Redis DB),二进制文件,保存全部数据。
AOF(AppendOnlyFile)默认不开启

RDB持久化:
SAVE
阻塞,直到持久化完成
BGSAVE(BackGround SAVE)
创建子进程进行保存,不阻塞
配置文件自动保存条件

缺点:全量数据保存,消耗资源

AOF持久化:
不会阻塞Redis Server
always,每写入一个命令,就调用一次fdatasync
everysec,每一秒调用一次fdatasync,将缓冲区里的命令写入到磁盘里面
no,不主动调用fdatasync,由操作系统决定何时将缓冲区里的命令写到硬盘里面

AOF重写机制
BGREWRITEAOF命令
自动触发BGREWRITEAOF命令

Redis集群

master — slave
master执行写命令,slave只能执行读命令

主从复制 Replication
在server上执行
redis-server --port 6380 --slaveof masterip masterport

在redis server里面
slaveof 192.168.1.1 6379,将服务器转换为slave
slaveof no one,将服务器重新恢复到Master,不会丢弃已同步数据

配置文件
redis-server 6380.conf

Sentine哨兵机制
监控master和slave是否正常
Sentine可以组成分布式系统(Sentine网络),共同监控

配置文件
Sentinel monitor name ip port quorum
1、监视mymaster的主服务器,服务器ip和端口,将这个主服务器下线失效,至少需要quorum个Sentinel同意,才会执行故障转移
2、Sentinel会根据master的配置自动发现master的slaves
3、Sentinel的默认端口是26379

Redis Twemproxy,Twitter开发的代理服务器

主从对写压力没有分担,使用多个节点分担,将写请求分散到不同的节点上去。

Redis集群

由多个Redis服务器组成的分布式网络服务集群
每一个Redis服务器成为节点Node,节点之间会互相通信,两两相连
Redis集群无中心节点

集群故障转移
内置了类似Redis Sentinel的节点故障检测和自动故障转移功能。

集群分片
集群将整个数据库分为16384个槽位slot,主节点平分这些槽位

Redis集群Redirect转向
由于Redis集群无中心节点,请求会发给任意主节点。
主节点只会处理自己负责槽位的命令请求,其他槽位的命令请求,该主节点会返回客户端一个转向错误。
客户端根据错误中包含的地址和端口重新向正确的负责接主节点发起命令请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值