当前位置: 首页 > news >正文

Redis个人总结

一、概述

1.什么是redis

redis是一个非关系型数据库,数据存储在内存中,因此操作速度非常快,通常用来存储服务器的缓存数据。

2.为什么要用redis

传统数据库查询速度因为有读取磁盘的瓶颈,因此无法支持过大流量的查询,将数据放在内存中,就可以避免磁盘的读写,以支持超大流量的查询。而redis就是这么一个缓存数据库。

3.Redis怎么样

Redis是目前最主流的缓存数据库,除了提供缓存数据的支持外,还因为其单线程、全局唯一、高速读写等特性,提供了如分布式锁等更多场景的支持。

二、Redis的数据类型

1.Redis支持的数据类型

1.String
2.Hash
3.List
4.Set
5.Sorted Set
6.位图
7.地理坐标
8.Stream
9.Bitfield

实际应用上基本都已String为主,存储一些json缓存数据。

三、持久化方法

1.RDB持久化

RDB持久化是Redis的默认持久化功能
SAVE命令 阻塞服务器,创建RDB文件
BGSAVE命令 启动子进程创建RDB文件
RDB持久化是通过时间点快照的方式持久化数据,简而言之就是只会保存执行持久化命令时间点的所有数据,执行命令后创建的数据不会保存到RDB文件中。

2.AOF持久化

与全量式RDB持久化不同,AOF提供的是增量式的持久化功能,这种持久化原理在于,服务器每次执行完写命令后,都会将以协议文本的方式将命令记录到AOF文件的末尾,服务器停机后,通过重新执行AOF文件中的命令,恢复之前的数据。
AOF的优缺点
1.AOF文件的体积比RDB文件大得多
2.AOF文件做数据恢复比RDB文件慢得多
3.进行AOF文件重写会占用大量资源,导致服务器短暂阻塞

3.RDB-AOF混合持久化

Redis4.0之后引入RDB-AOF混合持久化,
aof-use-rdb-preamble选项设置成yes后
Redis执行AOF重写操作时,首先会将当前数据库状态按RDB持久化方式将数据写入AOF文件中,至于持久化开始后的数据,则以AOF持久化的方式,将命令追加到AOF文件末尾。
换句话说,服务器生成的AOF文件将由两部分组成,开头是RDB文件格式,结尾是AOF格式的数据。

四、缓存击穿、雪崩等场景分析

1.缓存穿透

当大量并发请求去查询一个Redis不存在,且数据库中不存在的数据时,大量请求透过了Redis直接访问数据库,导致服务器宕机。

解决方案:
查询到空数据时,依然将空数据保存到Redis中,保证请求不会直接到达数据库。当该数据新增时,删除Redis空数据。保证读取Redis不发生脏读现象。

2.缓存击穿

当缓存数据有过期时间时,如果过期时间刚过,此时有大量并发请求进来查询这个数据时,虽然查完数据库后会更新缓存,但依旧会有大量请求去查询数据库。此时可能因并发过高导致服务器宕机

解决方案:
可以通过分布式锁,发现数据不在Redis,去查询数据库时加上分布式锁,保证只有一个请求去查询数据库。未获取到锁则重试Redis获取数据。大幅降低了数据库层的压力。

3.缓存雪崩

大量缓存数据设置了相同的过期时间,导致数据同时过期时,数据库请求激增,导致服务器宕机。

解决方案:
避免大量缓存数据使用相同的过期时间,通过使用随机数的方式,保证数据不在同一时间点失效。

4.缓存预热

提前将热点数据加载到Redis,降低数据库的压力,注意不要使用相同的过期时间,防止缓存雪崩。

五、Redis 内存淘汰策略

Redis内存淘汰策略是在Redis内存使用达到限制时,为了释放内存空间而采取的一系列策略。
Redis 提供 8 种数据淘汰策略

1.noeviction(默认策略)

redis默认不会淘汰数据,当内存使用达到限制时,新的写入操作会报错。

2.volatile-lru(最近最少使用)

从设置了过期时间的键中,使用 LRU(Least Recently Used,最近最少使用)算法淘汰数据。

3.volatile-ttl

从设置了过期时间的键中,优先淘汰剩余生存时间(TTL,Time To Live)较短的键。

4.volatile-random:

从设置了过期时间的键中,随机淘汰数据。

5.volatile-lfu:

从已设置过期时间的数据集中挑选最不经常使用的数据淘汰。

6.allkeys-lru:

从所有键中,使用 LRU(Least Recently Used,最近最少使用)算法淘汰数据。

7.allkeys-random:

从所有键中,随机淘汰数据

8.allkeys-lfu:

从所有键中,移除最不经常使用的 key。


http://www.mrgr.cn/news/16916.html

相关文章:

  • UDP数据报套接字编程
  • Python打发无聊时光:15.Python打开黑神话-八戒3D模型
  • 【吊打面试官系列-Redis面试题】Redis 的持久化机制是什么?各自的优缺点?
  • PCIe 复位:必须了解的PERST#
  • web渗透:XXE漏洞
  • Python中文件打开和关闭的方法
  • 【 html+css 绚丽Loading 】 000029 三元化虚阵
  • 【Java学习】多线程JUC万字超详解
  • 编程小白如何克服学习编程过程中的挫败感?
  • 布隆过滤器详解
  • 数据赋能(194)——开发:数据服务——技术方法、主要工具
  • 005.Python爬虫系列_浏览器开发者工具(详解)
  • 【C++】智能指针——auto_ptr,unique_ptr,shared_ptr
  • kaggle平台free使用GPU
  • 使用Pywin32和其他库控制Office软件进行自动化操作
  • linux 内核网络分析 -- 分配并初始化socket
  • 12 事务
  • 通义说【线性代数】什么是线性
  • YoloV8实战:使用YoloV8实现OBB框检测
  • Atlas阿特拉斯wordpress主题