1. 什么是Reids?
Redis(Remote Dictionary Server)是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。
-
性能极高:Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作24。这使得Redis成为处理高并发请求的理想选择,尤其是在需要快速响应的场景中,如缓存、会话管理、排行榜等。
-
丰富的数据类型:Redis 不仅支持基本的键值存储,还提供了丰富的数据类型,包括字符串、列表、集合、哈希表、有序集合等。这些数据类型为开发者提供了灵活的数据操作能力,使得Redis可以适应各种不同的应用场景。
-
原子性操作:Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。
-
持久化:Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
-
支持发布/订阅模式:Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。这使得 Redis 可以作为消息队列和实时数据传输的平台。
-
单线程模型:尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。单线程模型也简化了并发控制的复杂性。
-
主从复制:Redis 支持主从复制,可以通过从节点来备份数据或分担读请求,提高数据的可用性和系统的伸缩性。
-
应用场景广泛:Redis 被广泛应用于各种场景,包括但不限于缓存系统、会话存储、排行榜、实时分析、地理空间数据索引等。
-
社区支持:Redis 拥有一个活跃的开发者社区,提供了大量的文档、教程和第三方库,这为开发者提供了强大的支持和丰富的资源。
-
跨平台兼容性:Redis 可以在多种操作系统上运行,包括 Linux、macOS 和 Windows,这使得它能够在不同的技术栈中灵活部署。
2. Reids通常适用于哪些场景?
- 缓存
- 实时系统: Redis最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度,例如常用的用户会话数据。
- 实时系统:Redis支持数据的快速写入和读取,非常适合用户数据的实时分析,例如,热搜榜单实时排行。
- 消息队列:利用Redis的List和Pus/Sub功能,可以实现轻量级的消息队列,适用于任务处理和异步消息系统。
- 分布式锁:Redis可以用作分布式锁,确保分布式系统中资源的安全访问,避免竞争条件。
- 计数器:Redis的原子性操作非常适合用作计数器,例如,可以使用Redis来统计访问量等。
3. Redis有哪些数据类型?
Redis常用的数据集合有五种:String,hash,list,set,zset
String(字符串):可以存储任何类型的数据,包括文本,数字和二进制数据,最大长度为512MB
使用场景:缓存存储临时数据例如会话,页面缓存 计数器用户统计访问量
常用命令: SET key value 设置键值对
GET key 获取key对应的值
INCR key 将键的值+1
DECR key 将键的值-1
Hash(哈希):键值对的集合,适合存储对象
使用场景:存储商品的各个属性,方便快速检索
常用命令:HSET key field value:设置哈希中的字段值。
HGET key field:获取哈希中指定字段的值。
HGETALL key:获取哈希中所有字段和值
List(集合):是有序的字符串集合,支持从双端推入和弹出元素,底层实现为双向链表
使用场景:消息队列用于简单的任务调度,消息传递,通过LPUSH和RPOP实现生产者消费者模式。
常用命令:LPUSH key value:从列表头部插入元素。
RPUSH key value:从列表尾部插入元素。
LPOP key:从列表头部弹出元素。
RPOP key:从列表尾部弹出元素。
LRANGE key start stop:获取列表范围内的元素。
Set:集合是无序且不重复的字符串集合,使用哈希表实现,支持快速查找和去重操作
使用场景:标签系统,唯一用户集合
常用命令:SADD key member:向集合中添加元素。
SMEMBERS key:获取集合中的所有元素。
SINTER key1 key2:获取多个集合的交集。
SUNION key1 key2:获取多个集合的并集。
Sorted Set:有序集合类似于集合,但每个元素都有一个分数(score),用于排序。底层使用跳表实现,支持快速的范围查询。
使用场景:排行榜,任务调度
常用命令:ZADD key score member:向有序集合中添加元素。
ZRANGE key start stop:按分数范围获取元素。
ZRANK key member:获取元素的排名。
4.Memcache 与 Redis 的区别都有哪些?
数据存储方式:
Memcached:数据全部存储在内存中,断电后数据会丢失,数据不能超过内存大小
Redis:支持将数据持久化到磁盘,确保数据不会因为服务器重启而丢失
数据类型支持:
Memcached:只支持简单的键值对存储
Redis:支持多种数据结构,包括字符串、哈希表、列表、集合等
性能:
Memcached:采用多线程模型,具有出色的性能和可扩展性
Redis:使用单线程模型,通过异步IO和多路复用技术实现高并发读写
持久化和高可用性:
Memcached:不支持数据持久化,重启服务器后数据会丢失
Redis:支持数据持久化和数据恢复,允许单点故障
应用场景:
Memcached:适用于缓存数据库查询结果、API调用结果等,适合多读少写、大数据量的情况
Redis:适用于对读写效率要求高、数据处理业务复杂和对安全性要求高的系统
5.Redis常用的客户端?
常见在项目中使用的客户端有以下三种:
Jedis 适用于简单的同步操作和单线程环境。
Lettuce 适用于高并发、高性能和多线程环境,尤其是需要异步和响应式编程的场景
Redisson 适用于复杂的分布式系统,提供丰富的分布式对象和服务,简化开发。
6.Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么?
缓存击穿:指某个热点数据在缓存中失效,导致大量请求直接访问数据库。此时,由于瞬间的高并发,可能导致数据库崩溃。
缓存穿透:指查询一个不存在的数据,缓存中没有相应的记录,每次请求都会去数据库查询,造成数据库负担加重。
缓存雪崩:指多个缓存数据在同一时间过期,导致大量请求同时访问数据库,从而造成数据库瞬间负载激增。
7.Redis中怎么实现分布式锁?
在 Redis 中实现分布式锁的常见方法是通过 set ex nx 命令 +lua 脚本组合使用。确保多个客户端不会获得同一个资源锁的同时,也保证了安全解锁和意外情况下锁的自动释放。