Redis
简介
特点
- 持久化:可以将内存中的数据进行持久化,保存在磁盘中,下次重启时可以再次加载使用
- 数据类型丰富:除了k-v类型数据,还支持list、hash、set、zset数据类型
- 支持数据备份:master-slave模式的数据备份
优势
- 速度快:运行在内存中,单线程
- 数据类型丰富
- 原子性:保证数据的线程安全
命令
序号 | 命令及描述 |
---|---|
1 | DEL key该命令用于在 key 存在时删除 key。 |
2 | DUMP key序列化给定 key ,并返回被序列化的值。 |
3 | EXISTS key检查给定 key 是否存在。 |
4 | EXPIRE key seconds为给定 key 设置过期时间,以秒计。 |
5 | EXPIREAT key timestampEXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
6 | PEXPIRE key milliseconds设置 key 的过期时间以毫秒计。 |
7 | PEXPIREAT key milliseconds-timestamp设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
8 | KEYS pattern查找所有符合给定模式( pattern)的 key 。 |
9 | MOVE key db将当前数据库的 key 移动到给定的数据库 db 当中。 |
10 | PERSIST key移除 key 的过期时间,key 将持久保持。 |
11 | PTTL key以毫秒为单位返回 key 的剩余的过期时间。 |
12 | TTL key以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
13 | RANDOMKEY从当前数据库中随机返回一个 key 。 |
14 | RENAME key newkey修改 key 的名称 |
15 | RENAMENX key newkey仅当 newkey 不存在时,将 key 改名为 newkey 。 |
16 | SCAN cursor [MATCH pattern] [COUNT count]迭代数据库中的数据库键。 |
17 | TYPE key返回 key 所储存的值的类型 |
持久化
RDB
RDB持久化是Redis的默认持久化机制,它会将Redis在内存中的数据定期写入到硬盘上的RDB文件中。RDB文件是一个二进制文件,保存了Redis在某个时间点上的数据快照。Redis可以通过设置不同的时间间隔和条件来触发RDB持久化操作。
RDB持久化的优点是它的速度比较快,可以节省存储空间。缺点是如果Redis在持久化操作之前崩溃,那么最后一次持久化之后的数据就会丢失。
AOF
AOF持久化是一种追加式文件持久化方式,Redis会将每次写操作(例如SET、INCR等)追加到AOF文件的末尾。当Redis重启时,它会重新执行AOF文件中的所有写操作来恢复数据。AOF文件是一个文本文件,可以使用任何文本编辑器来查看和修改。
AOF持久化的优点是它可以更好地保护数据,因为AOF文件中记录了Redis执行的每个写操作,所以即使Redis在持久化操作之前崩溃,也可以通过重放AOF文件来恢复数据。缺点是AOF文件比RDB文件更大,恢复速度也更慢。
要点
过期键删除
-
惰性删除
惰性删除是指当Redis获取一个已经过期的键时,它会立即将这个键删除。这种方式的好处是减少了Redis的内存占用,因为过期键不会一直存在于内存中。但是,惰性删除会增加Redis的CPU负载,因为它需要不断地扫描过期键,并删除它们。 -
定期删除
定期删除是指Redis会每隔一段时间,对所有的过期键进行扫描并删除已经过期的键。这种方式的好处是可以减少Redis的CPU负载,因为扫描和删除是在指定的时间间隔内进行的,不会对Redis的性能造成太大影响。但是,定期删除会增加Redis的内存占用,因为过期键可能会一直存在于内存中,直到下一次定期删除操作。 -
定时删除
定时删除是指Redis会开启一个专门的线程,定时地扫描所有的过期键并删除它们。这种方式会增加Redis的CPU负载,因为需要开启一个专门的线程来执行删除操作。
主从复制
- Redis主从复制是一种将一个Redis服务器的数据同步到另一个Redis服务器的过程,其核心原理是:
1、从节点向主节点发送SYNC命令,请求同步数据。
2、主节点接收到SYNC命令后,会执行BGSAVE命令创建RDB快照文件,将RDB文件发送给从节点。
3、主节点在将RDB文件发送给从节点期间,将写命令缓存起来,待RDB文件发送完毕后,将缓存的写命令发送给从节点。
4、从节点接收到RDB文件后,将RDB文件恢复到内存中,然后从主节点接收缓存的写命令,将其执行。
5、从节点周期性地向主节点发送PING命令,检查主节点是否在线,如果主节点无响应,则从节点会将自己变为主节点,等待其他从节点连接。
回收策略
回收策略就是一种管理Redis内存使用的措施,它可以帮助Redis优化内存使用,避免内存溢出。通过设置合适的回收策略,可以在内存达到限制时,自动删除一些不必要的数据,以保证Redis的内存使用率不会超过预定的限制。这可以有效地避免Redis因内存溢出而崩溃,提高Redis的稳定性和可靠性。
-
noeviction
noeviction是Redis的默认内存回收策略,它表示当Redis的内存达到限制时,新的写操作会报错。这种策略不会删除任何已有的数据,可以保证数据的完整性,但是可能会导致写操作失败,影响应用程序的正常运行。 -
volatile-lru
volatile-lru表示当Redis的内存达到限制时,会从已经设置了过期时间的键中选择最近最少使用的键进行删除。这种策略可以尽量保留未过期的数据,并且优先删除最近最少使用的数据,以保证内存的有效利用。 -
volatile-ttl
volatile-ttl表示当Redis的内存达到限制时,会从已经设置了过期时间的键中选择剩余过期时间最短的键进行删除。这种策略可以尽量保留剩余时间较长的数据,并且可以避免某些过期时间较短的数据在被删除前一直占用内存的情况。 -
volatile-random
volatile-random表示当Redis的内存达到限制时,会从已经设置了过期时间的键中随机选择一个键进行删除。这种策略可以平均删除已过期的数据,并且可以避免一些键被频繁使用而导致被删除的情况。 -
allkeys-lru
allkeys-lru表示当Redis的内存达到限制时,会从所有键中选择最近最少使用的键进行删除。这种策略可以尽量保留数据的完整性,并且优先删除最近最少使用的数据,以保证内存的有效利用。 -
allkeys-random
allkeys-random表示当Redis的内存达到限制时,会从所有键中随机选择一个键进行删除。这种策略可以平均删除数据,并且可以避免一些键被频繁使用而导致被删除的情况。
数据类型
Redis支持多种数据结构,包括字符串(string)、哈希表(hash)、列表(list)、集合(set)、有序集合(sorted set)等。
- 字符串(string):字符串是最简单的一种数据结构,可以存储一个字符串或者二进制数据,常用于缓存、计数器等场景。
- 哈希表(hash):哈希表是一种键值对集合,其中每个键都映射到一个值。哈希表适合存储对象,例如存储用户信息。
- 列表(list):列表是一个有序的字符串列表,支持从列表两端进行元素的添加、删除和查询等操作。常用于消息队列、栈等场景。
- 集合(set):集合是一种无序的字符串集合,不允许重复元素的存在。常用于实现好友关系、点赞等功能。
- 有序集合(sorted set):有序集合是在集合的基础上增加了一个分值,可以对集合中的元素进行排序。常用于排行榜、带权重的任务队列等场景。
使用场景
-
缓存
Redis最常见的应用场景是作为缓存,用于缓存数据库查询结果、计算结果、热门数据等。由于Redis的数据都存储在内存中,读写速度非常快,可以大大提高应用程序的响应速度和性能。 -
计数器
Redis可以用来实现计数器功能,例如统计网站的访问量、文章的阅读量等。可以通过Redis提供的INCR和DECR命令来实现计数器功能,同时还可以设置过期时间,以避免计数器占用过多内存资源。 -
队列
Redis可以用来实现消息队列,例如实现异步任务处理、事件通知等功能。可以通过Redis提供的List数据结构来实现队列功能,同时还可以设置过期时间和阻塞操作,以实现高效的消息队列功能。 -
发布订阅
Redis可以用来实现发布订阅功能,例如实现聊天室、实时通知等功能。可以通过Redis提供的Pub/Sub机制来实现发布订阅功能,同时还可以设置通配符、频道模式等高级特性,以满足不同的需求。
相关问题
缓存击穿
当一个热点数据的缓存过期后,大量的请求同时涌入,此时缓存未命中,导致请求直接访问数据库,导致数据库压力骤增。这种情况称为缓存击穿。
解决:可以采用加锁或者布隆过滤器的方式,保证只有一个请求去访问数据库,其余请求等待或者直接返回缓存数据。
缓存雪崩
当多个热点数据的缓存同时失效,大量的请求同时涌入,此时缓存未命中,导致请求直接访问数据库,导致数据库压力骤增。这种情况称为缓存雪崩。
解决:设置不同的过期时间,避免同时失效,或者采用双缓存的方式,即在一个缓存失效的同时,从另一个缓存中获取数据。
缓存穿透
当请求访问一个不存在的数据时,这个请求不会被缓存,也不会被数据库命中,导致请求直接访问数据库,导致数据库压力骤增。这种情况称为缓存穿透。
解决:采用缓存空对象或者缓存穿透保护机制,即在缓存中加入空对象或者黑名单,以避免请求直接访问数据库。