分布式缓存之Redis原理

Redis是一款高性能的Key-value数据库,支持多种数据结构,如字符串、哈希、列表、集合和有序集合。它具备数据持久化、备份、原子性操作等特点,广泛应用于缓存系统、计数器、消息队列、社交网络等场景。

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

一、介绍

    Rsdis是一个开源的使用C语言编写、开源、支持网络、可基于内存亦可持久化的日志型、高性能的Key-value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Map)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

Redis的特点:
(1)支持数据持久化,可以将内存放入数据保存到磁盘中,启动时可以再次加载使用。
(2)支持多种数据结构的存储,丰富的数据类型-Redis支持二进制案例的String、list、Hashes、set以及Ordered set 数据类型的操作。
(3)支持数据备份,即master-slave模式的数据备份
(4)所有的操作都是原子性的,同时Redis还支持几个操作全并后的原子执行。
(5)性能极高,Redis读的速度是110000次/s ,写的速度是81000次/s。

1.1redis结构

 

Redis在内存上设计了各种数据类型,让业务能够高速原子的访问这些数据结构,并且不需要关心持久存储的问题。

1.2备份模式 (Replication,达到防治单点故障及实现高可用)

1.3、容灾模式

1.4、数据类型

Redis支持物五种数据类型;

(1)String (字符串)
     Redis最基本的数据类型,一个key对应一个value,二进制安全的。
     Redis的string可以包含任何数据。比如jpg图片或者序列化对象。
     一个键最大能存储512MB
        例:给变量var赋值;  set var "123456"
            取的变量var的值 : get var
(2)hash(哈希)
     是一个键值对集合
     是一个string类型的field和value的映射表,hash特别适用于存储对象。
     ①、hset、hget (一次往哈希结构里面插入一个键值对,如果插入多个可以用hmset&&hmget)
     ②、hmset、hmget(每个hash可以存储232-1键值对。hmset用于创建对象,hgetall用于获取hash对象)
(3)list(列表)
     列表最多可存储232-1元素
     lpush 往列表的前边插入;lrange后面的数字是范围。
(4)set(集合)
     Redis的set是string类型的无序集合。
     集合是通过哈希表实现的,所以添加、删除。
     set往集合中插入元素,smembers列举出集合的元素。
     成功插入返回;错误插入返回0.
(5)zset(有序集合)
      zset和set不同的地方在于zset关联一个double类型的分数,redis通过分数对集合中的元素排序。
      zset的元素是唯一的,但是分数是可以重复的。分数为float(可正、可负、0)

1.5、Redis应用场景

(1)缓存系统:与memcache类似
(2)计数器:例如转发数、评论数,有了原子递增,可以加上计数,用getset重置、或者让其过期。
(3)消息队列系统:类似于kafka,运行文档并且快速,支持模式匹配,能够实时订阅与取消频道。
(4)社交网络:Redis可以非常好的与社交网络结合,用户和状态消息将会聚焦很多有用的信息,很多交互如实时聊天就是通过Redis来实现。
(5)过期项目处理:通过系统时间为关键字,用来保持列表能够按时间排序。
(6)实时系统:使用位图来做布隆过滤器。

二、Redis持久化

  (1)snapshotting

     快照是默认的持久化方式。这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。可以配置redis在n秒内如果超过m个key被修改就自动做快照,

     默认的快照保存配置:  

      

save 900 1 #900秒内如果超过1个key被修改,则发起快照保存。
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存。

 快照保存过程:

client也可以使用save或者bgsave命令通知redis做一次快照持久化。快照持久化是将完整数据完整写入到磁盘中,如果数据量答的话,且写操作较多的话,会引起大量的磁盘io操作,可能会严重影响性能。

快照方式是在一定间隔时间做一次,所以redis意外down掉,就会丢失一部分数据。如果应用要求不能丢失任何修改的花,可以采用aof持久化。

 

(2)Append-only file

使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中。让redis重启时重新执行文件中的命令在内存中重建整个数据库的内容。(依旧会导致部分数据丢失,【解决方法:通过配置文件告诉redis将命令写入磁盘的时机】)

方法:

appendonly yes   #启用aof持久化方式

# appendfsync always  #每次收到写命令就立刻强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用。

appendfsync everysec  #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中。
 
#appendfsync  no  #完全依赖os,性能很好,持久化没问题

 问题:持久化文件越来越大

解决方法:redis提供bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的文件。具体过程:

(3)虚拟内存

(4)diskstore

三、数据持久化对比

 RDB方式AOF方式
描述默认方式,实现方式时定时将内存的快照(snapshot)持久化到硬盘。AOF即append only file ,在写入内存数据的同时将操作命令保存到日志文件中。
优点使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证redis的高性能。保证了数据的可靠性及高安全性,保证更高的数据完整性。
缺点RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。在并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复创建时间会非常长;AOF文件比RDB文件大,且恢复速度慢。
应用场景更适合数据要求不严谨的时候使用数据完整性要求较高的场景

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值