欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > Redis

Redis

2025/4/23 16:25:21 来源:https://blog.csdn.net/2302_80365404/article/details/142303725  浏览:    关键词:Redis

一、redis介绍

        redis是一个数据结构存储系统。它是由C语言编写的,开源的,并且支持网络交互,支持多种语言。可以被用作数据库,缓存或消息中间件。

redis作为数据库使用是特殊的,它有以下特点:
        1.redis中数据的存储模式时键值对形式
        2.redis中数据存储于内存中,虽然是存储在内存中,但是却支持数据持久化到磁盘中长期保存,不似一般的缓存一样会被定期清理。
        3.redis拥有极高的性能,读的速度约十一万次每秒,写的速度约八万一千次每秒。
        4.redis的所有操作是原子性的。并且几个操作语句合并后的redis也是原子性的。
        5.Redis分布式集群化扩展性极高,即master-slave(主-从)模式

二、redis的线程模型

        redis在6.0之前是单线程模型,在redis服务端只有一个线程处理,既要处理用户的链接,也要执行客户端发送的命令。而在redis6.0后是采用多线程模型,处理用户链接和客户端的命令都用专门的模型来执行,但是执行客户端命令的线程只有一个,因此是线程安全的。

为什么单线程的redis执行速度却很快?

1.redis的操作都是在内存中的
2.redis底层是一个哈希表,可以通过键快速定位数据位置
3.单线程模型下无需再多个线程上下文之间进行切换,节省了切换的开销时间

三、redis的持久化

redis可以将数据持久化保存在硬盘上。
1.RDB(Redis Database)
        RDB模式是redis默认的持久化规则,RDB模式其实就是定时拍照片,可以自己设置规则,每隔一段时间对所有数据,拍一张快照,(也可以手动save保存)保存到文件中,默认是在dump.rdb中,可以在conf文件中设置。
如:save9001 :表示900秒钟内至少1个键被更改则进行快照。
       save 300 10 :表示300秒内至少10个键被更改则进行快照。
       save 60 10000 :表示60秒内至少10000个键被更改则进行快照。

2.AOF(Append Only File)
        AOF模式就是像写流水账一样,每次操作都会记录在日志中,不断向日志中追加文件,需要恢复时,执行日志中记录的操作即可。

        AOF和RDB都不能完全保证数据的完整性,如RDB,假如没到快照时间,但是此时发生断电、宕机等情况,会导致本次数据丢失,但是上次数据还在。而AOF由于其是日志记录模式,每次最多损失本次操作的数据。综合来看,RDB在恢复数据时速度比AOF快,但是一旦出现变故,损失的数据会略多于AOF。

四、Redis事务

        redis事务的目的是将所有命令打包成一个整体,不允许其他命令闯入。但是redis的事务是不能回滚的,一旦出现异常或者停止操作,已经执行过的操作仍然作数,因此redis事务不能保证操作的原子性。

五、Key过期策略

1.惰性删除
        惰性删除策略是为键值维护一个状态,假如有一个键值对{"name": "张三"},该键值对已经过期,不会立即删除,而是会在下次使用前判断其是否过期,如果已经过期则会立即删除他,并返回空值给用户。
        惰性删除的好处是不需要定时对键值对进行监控,但是因为要维护键值对的状态,需要浪费更多的空间。

2.定期删除
       
定期删除会定期对redis中的键值对进行扫描,如果有已经过期的键值对,则会立即进行删除。
        定期删除的好处是不会浪费空间,但是需要定期对键值对进行扫描,浪费了更多的资源。

六、redis和mysql之间如何保证数据的一致性

1.先更新数据库再更新redis
        先更新数据库再更新redis,在实际开发中,一旦遇到高并发问题可能会导致数据有误,使得redis和数据库中的数据不一致。例如:线程A和线程B同时对数据库中的数据进行更新,线程A先更新数据库,而线程B后更新数据库,一旦情况特殊,出现了线程B先更新redis 的情况,线程A后更新redis,就会导致数据库中的数据时线程B的数据,但是redis 中的数据是线程A的数据。

2.先删除redis中的数据再更新数据库
        先删除redis中的数据,再更新数据库。这种方法在高并发的情况下也会出问题。如线程A要更新数据库,先删除了缓存,还未更新数据库,但是线程B此时读取数据,发现缓存中没有数据,于是读取了数据库中的老数据,然后线程B更新了redis中的数据为老数据。此时线程A将数据库更新完成,导致数据库中数据是新的,redis中仍是老数据。

3.延迟双删
        延迟双删即是在2的基础上,更新完数据库后,再次删除redis中的数据,防止错误的缓存出现。

七、redis缓存问题

1.缓存穿透
        缓存穿透就是查询一个不存在的数据,如果每次都查询一个不存在的数据,然后再去数据库中查询,就是白白浪费时间,还不如一开始就去数据库查。

解决方案:
        1.将缓存穿透的键值设置为null,表示这个数据不存在。
        2.使用布隆过滤器
        3.对参数进行校验,不合法参数进行拦截. 例如 id=-1, 数据库中压根就没有这样的值,先进行验证

2.缓存击穿
        缓存击穿可以理解为热点数据过期导致数据库崩溃,如某个热点缓存即将过期,但是这会又有很多线程来对其进行读取,恰好该缓存过期,导致大量请求涌向数据库,使得数据库崩溃。

解决方案:
        1.为缓存设置较长的过期时间,减少缓存击穿的次数
        2.为数据库查询操作上锁,防止数据库被击穿

3.缓存雪崩
        缓存雪崩是由于大量缓存在短期内同时过期,而此时又正好有很多线程来进行数据读取,导致数据库被大量访问,从而导致数据库瘫痪。

解决方案:
        1.随机设置key的过期时间,避免大量缓存同时失效。
        2.使用定时任务在缓存即将过期之前更新过期时间。
        3.集群,部署多台redis,一台redis宕机,其他redis还可以接着用

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词