redis知识

1、什么是redis

Redis是一个开源的基于内存的数据结构存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。与传统的关系型数据库相比,Redis具有速度快、可扩展性强、数据处理能力强等优势,适用于需要高性能、高并发、高可用的场景,如缓存、消息队列、计数器、实时排行榜等。同时,Redis还支持事务、Lua脚本、持久化、复制、集群等功能,使其在企业级应用中得到广泛应用。

2、五种基本类型

redis提供五种数据类型:string,hash,list,set及zset(sorted set)。

string(字符串)

string是最简单的类型,一个key对应一个value,可以存储任何类型的数据,包括二进制数据,最大长度为 512MB。

常用场景

  • 缓存功能:存储经常使用的数据,比如用户信息、文章内容等。
  • 计数器:例如统计访问量等。
  • 会话存储:例如,在网站上存储用户登录状态信息。

hash(哈希类型)

Redis中的hash是一个键值对集合。和普通的键值对不同,hash中的value可以是一个包含多个键值对的集合。hash类型非常适合于存储对象,其中每个对象都有多个属性或字段

list(链表)

在 Redis 中,list 类型是一种存储有序元素的数据结构,它支持在列表的两端插入和删除元素,因此也被称为双端队列。一个 list 可以包含最多 2 的 32 次方 - 1 个元素(4294967295),即使是在内存受限的情况下,也可以使用 list 来存储非常大的数据量。
在 Redis 中,list 类型的元素可以是字符串(string)、数字(number)和二进制数据(binary data),并且它们是按照插入顺序进行排序的。List 类型对数据的操作非常高效,可以在常数时间内完成元素的插入、删除、查找等操作。

set(集合)

Redis中的Set是一种无序、唯一的数据结构,集合中的元素不能重复,如果向集合中添加重复元素将被自动忽略。可以使用Redis提供的命令向集合中添加、删除元素,也可以对集合进行交集、并集、差集等运算。

zset(sorted set --有序集合)

Redis Zset(有序集合)是一种数据类型,它既存储了一个字符串元素集合,同时又给每个元素赋了一个分值(score),这个分值可以用来对元素进行排序。Zset的每个元素都必须是独一无二的,但是分值可以相同。

3、缓存穿透

Redis缓存穿透是指在查询缓存中不存在的数据时,请求会直接进入数据库,导致数据库压力过大。攻击者可以通过恶意构造的请求不断查询缓存中不存在的数据,从而使服务不可用。可能的原因包括:

  • 缓存中未命中的并发请求过多,导致数据库压力过大。
  • 缓存中不存在的数据在数据库中也不存在。
  • 缓存的key过期时间过短。

解决办法:

  • 对不存在的数据也进行缓存,将缓存中不存在的数据也缓存(比如将空值缓存),这样可以避免频繁查询数据库。
  • 使用布隆过滤器,在Redis中预先保存一些“可能存在的”对象标识符,在进行查询时先进行判断,如果有“可能不存在”的标识符,则直接返回空结果,否则再去数据库中查找。
  • 使用滑动窗口机制,限制同一个客户端每秒发送请求的数量。

4、缓存击穿

Redis缓存击穿是指在高并发访问下,一个缓存过期或不存在,导致大量请求直接访问数据库,造成数据库压力过大,性能急剧下降,甚至瘫痪。

解决办法

  • 使用互斥锁,只有获得锁的线程才能访问数据库,其他线程等待锁的释放。

5、缓存雪崩

Redis缓存雪崩是指在缓存中存储了大量的key,在某个特定时间点或者某个事件触发时,这些key同时失效,导致所有的请求都直接访问数据库,使得数据库瞬间变得异常繁忙,可能会发生宕机甚至雪崩的情况。

造成Redis缓存雪崩的原因可能包括:

  • Redis集群中部分节点宕机;
  • Redis配置不当,例如缓存时间设置过长等;
  • 大量的热点数据同时失效;
  • 内存不足,导致部分key被处理掉。

为了避免Redis缓存雪崩,可以采取以下措施:

  • 设置合理的缓存时间;
  • 对于热点数据,可以采用热点数据预热的方式;
  • 对Redis集群进行容错处理,避免单点故障;
  • 对数据进行分片存储,避免集中存储。

3、持久化

Redis提供了两种持久化方式:RDBAOF

1、RDB

Redis RDB持久化方式是Redis的一种备份机制,它可以将Redis在内存中的数据定期持久化到磁盘上,以避免Redis由于某些原因,例如宕机而导致的数据丢失。

RDB持久化方式基于快照的方式,可以将Redis在某个时间点的数据保存到磁盘上,这个过程是采用fork来完成的。在RDB持久化机制中,Redis会周期性的将内存中的数据生成快照(Snapshot),并持久化到磁盘上。

实现步骤:

  1. Redis利用fork函数创建子进程,将父进程的数据完全复制一份到子进程的内存空间中。

  2. 子进程将内存中的数据写到临时文件中,当数据写完后,对原来的RDB文件进行原子性的替换。

由于将数据写入磁盘是一个比较费时的操作,所以默认情况下,Redis不会一直采用RDB持久化方式,而是采用定时或者相关事件触发的方式进行持久化操作。可以通过配置文件来设置RDB持久化的触发方式和时间间隔。例如,通过设置save 900 1表示在900秒之后,如果至少有1个key发生变化就会执行RDB持久化操作。

2、AOF

Redis的AOF持久化方式即是将Redis的操作日志以文本格式写入到磁盘上,以保证数据的持久化。AOF持久化方式主要包括以下几个步骤:

  1. 将Redis的操作命令以追加的方式写入到AOF文件中。

  2. 当AOF文件的大小达到一定阈值时,Redis会自动将其进行重写,以减小AOF文件的大小。

  3. 当Redis重新启动时,会从AOF文件中读取操作日志,以恢复Redis的数据。

可以通过Redis配置文件中的aof选项来设置AOF持久化的相关参数,如AOF文件名、重写条件、重写规则等。同时,可以通过命令行指令对AOF进行手动重写操作。

AOF默认是关闭,如需开启需要修改配置文件来启用

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

AOF的同步策略

  • always:每次有写操作都立即同步到磁盘,最安全但性能最低。
  • everysec:默认值,每秒同步一次,折衷方案,在大多数情况下足够可靠。
  • no:让操作系统自行决定何时同步,性能最高但风险也最大。

三种策略可通过修改redis的配置文件进行修改

# 默认使用everysec
appendfsync everysec

RDB适用于数据量较大但更新频率较低的场景,而AOF适用于对数据一致性要求较高的场景。同时,RDB的恢复速度比AOF更快,因为RDB文件通常比AOF文件更小。因此,在实际应用中,需要根据具体的场景选择合适的持久化方式。

4、redis的数据过期策略

Redis的数据过期策略有两种:定时过期和惰性过期

  • 定时过期:设置一个过期时间,在key过期时自动删除。采用定时器方式来检查key是否过期,有过期的key就会被清除。
  • 惰性过期:仅在访问某个key时检查该key是否过期,如果过期则删除。这种方式会在每次访问key时进行过期检查,对系统资源消耗较少,但可能会出现数据过期但一直未被访问的情况。

redis一般将 定时过期和惰性过期配合进行使用

5、数据淘汰策略

Redis 提供了多种数据淘汰策略,以确保在内存达到最大限制时能够自动删除部分键值对。这些策略用于选择哪些数据应该被优先删除,以便为新的数据腾出空间。
以下是 Redis 的几种数据淘汰策略:

  • volatile-lru: 当内存达到最大限制时,从设置了过期时间的键中选择最近最少使用的(LRU)键进行删除。 仅适用于有过期时间的键。

  • allkeys-lru: 当内存达到最大限制时,从所有键中选择最近最少使用的(LRU)键进行删除。 不区分是否有过期时间。

  • volatile-random: 当内存达到最大限制时,随机从设置了过期时间的键中选择一个进行删除。 仅适用于有过期时间的键。

  • allkeys-random: 当内存达到最大限制时,随机从所有键中选择一个进行删除。 不区分是否有过期时间。

  • volatile-ttl: 当内存达到最大限制时,从设置了过期时间的键中选择即将过期的键进行删除。 仅适用于有过期时间的键。

  • noeviction: 当内存达到最大限制时,禁止执行可能导致数据淘汰的操作,并返回错误信息。 此策略可能会导致新写入操作失败。

  • volatile-lfu(较新的版本支持): 当内存达到最大限制时,从设置了过期时间的键中选择访问频率最低的键进行删除。

  • allkeys-lfu(较新的版本支持): 当内存达到最大限制时,从所有键中选择访问频率最低的键进行删除。

可以通过修改 Redis 配置文件中的 maxmemory-policy 参数来指定使用哪种数据淘汰策略。

#默认是noeviction
 maxmemory-policy noeviction
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值