Redis学习
1、Redis是什么?
Redis(Remote Dictionary Server)是一个开源的键值对存储系统,通常被用作数据库、缓存和消息中间件。
2、Redis能够做什么?
- 缓存:利用Redis的高速读写性能,作为应用的数据缓存层,减少对后端数据库的压力。
- 会话存储:存储用户的会话信息,如登录状态等,便于在分布式环境中共享会话数据。
- 消息队列:使用Redis的列表数据结构实现简单的消息队列,适用于轻量级的任务调度。
- 分布式锁:通过Redis实现跨服务的分布式锁机制,确保多个服务实例间的操作互斥。
- 排行榜:利用有序集合(Sorted Set)实现高效的排行榜功能,支持按分数排序。
- 实时分析:处理实时数据流,进行快速的数据聚合和分析。
- 限流:实现请求频率限制,防止系统过载。
- 全局ID生成:生成全局唯一的ID,常用于分布式系统中的唯一标识符。
- 地理位置服务:使用Geo相关命令存储地理位置信息,支持距离计算等功能。
- 持久化存储:虽然Redis主要用于内存存储,但它也支持数据的持久化,可以在重启后恢复数据。
3、Redis能给我带来什么好处?
提高性能
Redis将数据存储在内存中,极大地提高了数据的读写速度,对于需要频繁访问的数据,使用Redis作为缓存层可以显著提升应用性能。
支持丰富的数据结构
提供了字符串、哈希、列表、集合、有序集合等多种数据结构,方便开发者针对不同的业务场景选择最合适的数据结构,提高开发效率。
简化开发
Redis简单易用的API和丰富的数据结构降低了开发复杂度,使开发者可以更专注于业务逻辑的实现。
持久化选项
支持RDB和AOF两种持久化方式,可以在不影响性能的情况下,确保数据的安全性和持久性。
高可用性:
通过主从复制、哨兵(Sentinel)和集群(Cluster)等功能,Redis提供了高可用性的解决方案,保障系统的稳定运行。
易于扩展
Redis集群模式允许水平扩展,随着业务的增长,可以通过添加更多的节点来增加存储容量和处理能力。
社区和支持
拥有活跃的开源社区,提供了大量的文档、教程和第三方工具,有助于快速解决问题和学习新技术。
节省成本
对于某些应用场景,使用Redis可以减少对昂贵的数据库服务器的需求,从而降低硬件和运维成本。
4、Redis如何使用?
安装Redis
- 安装Redis:从官网下载并安装Redis。
- 启动Redis服务:在Redis安装目录下,运行redis-server命令启动服务。
- 连接Redis:使用redis-cli命令连接到Redis服务。
- 使用Redis命令:使用Redis提供的命令对数据进行操作。
- 关闭Redis服务:使用Ctrl+C命令关闭Redis服务。
连接Redis
-
连接到本地 Redis 服务器
redis-cli -
连接到远程 Redis 服务器
redis-cli -h hostname -p port -a password
编程开发
Lettuce Redis Client
- 添加依赖
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'io.lettuce.core:lettuce-core'
- yml配置文件
# 配置连接
spring:
redis:
host: localhost
port: 6379
password:
database: 0
timeout: 5000ms
# 配置连接池
lettuce:
pool:
max-active: 8 #最大活跃连接数,设置为 8 表示最多允许同时有 8 个活动连接。
max-wait: -1 #当没有可用连接时,等待获取连接的最大时间,单位为毫秒。设置为 -1 表示无限等待。
max-idle: 0 #最大空闲连接数,设置为 8 表示最多可以有 8 个空闲连接。
min-idle: 0 #最小空闲连接数,设置为 0 表示最小空闲连接数为 0。
- 创建对应的Bean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory factory = new LettuceConnectionFactory();
factory.setHostName("localhost");
factory.setPort(6379);
factory.setPassword("yourpassword");
factory.setDatabase(0);
factory.setTimeout(5000);
return factory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}
- 创建使用类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@Service
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
public void delete(String key) {
redisTemplate.delete(key);
}
public boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
}
基本操作
1. 设置键值对: SET key value
2. 获取键值对: Get key
3. 删除键: DEL key
4. 检查键是否存在: EXISTS key
5. 增加数字值: INCR key
6. 减少数字值: DECR key
7. 设置过期时间: EXPIRE key seconds
8. 获取过期时间: TTL key
9. 获取所有键: KEYS *
10. 清空数据库: FLUSHDB
11. 保存数据库: SAVE
12. 退出 Redis: QUIT
13. 查看 Redis 版本: INFO
14. 查看 Redis 状态: MONITOR
15. 查看 Redis 命令: COMMAND
16. 查看 Redis 命令帮助: HELP command
17. 查看 Redis 配置: CONFIG GET param
18. 查看客户端连接: CLIENT LIST
19. 慢查询日志: SLOWLOG GET
5、Redis的实现原理是什么?
1. 存储结构
- 键值对存储:
Redis 是一个键值对存储系统,所有的数据都以键值对的形式存储。键是字符串类型,而值可以是多种数据类型,包括字符串、哈希、列表、集合和有序集合。 - 字典实现:
Redis 使用字典(dict)来实现键值对的映射关系。字典内部使用哈希表来存储数据,支持高效的查找、插入和删除操作。
2. 数据类型
- 字符串:最简单的数据类型,可以存储文本或二进制数据。
- 哈希:存储字段和值的映射关系,适合存储对象。
- 列表:双端链表,支持从两端高效地插入和删除元素。
- 集合:无序且不重复的字符串集合,支持集合运算。
- 有序集合:每个成员关联一个分数,按照分数排序,支持范围查询。
3. 持久化机制
- RDB(Redis Database Backup):
定期将内存中的数据快照保存到磁盘上,生成一个 .rdb 文件。这种方式适合灾难恢复。 - AOF(Append Only File):
记录服务器接收到的每一个写操作,并在服务器启动时重新执行这些操作来恢复数据。AOF 文件可以配置为每秒或每次写操作后追加,以平衡性能和数据安全性。
4. 网络通信
- 单线程模型:
Redis 采用单线程模型处理客户端请求,避免了多线程带来的复杂性和性能开销。单线程模型通过 I/O 多路复用(epoll/kqueue)来高效处理大量并发连接。 - 协议解析:
Redis 使用自定义的二进制协议,支持请求和响应的高效解析。
5. 内存管理
- 内存回收:
Redis 通过引用计数和周期性扫描来管理内存,自动回收不再使用的对象。 - 内存碎片整理:
Redis 可以通过配置参数来控制内存碎片率,减少内存浪费。 - 内存限制:
可以设置最大内存使用量,当内存使用超过限制时,Redis 会根据配置的淘汰策略(如 LRU、LFU)来释放内存。
6. 高可用性
- 主从模式 (Master-Slave)
定义:主从模式是一种简单的复制机制,其中有一个主节点(Master)和一个或多个从节点(Slave)。
数据同步:主节点负责写操作,从节点通过异步复制的方式从主节点获取数据更新。
读写分离:读操作可以分布在从节点上,减轻主节点的压力。
高可用性:如果主节点故障,需要手动切换到从节点,或者通过脚本自动切换。
应用场景:适用于读多写少的场景,可以提高读取性能。 - 哨兵模式 (Sentinel)
定义:哨兵模式是在主从模式的基础上增加了一个或多个哨兵(Sentinel)节点,用于监控主从节点的健康状态。
故障转移:当主节点故障时,哨兵会自动选举一个新的从节点作为新的主节点,实现自动故障恢复。
监控:哨兵节点不仅监控主从节点,还可以监控其他哨兵节点,确保整个系统的高可用性。
配置复杂度:相对于主从模式,哨兵模式的配置和管理更为复杂。
应用场景:适用于对高可用性要求较高的场景,能够自动处理主节点故障。 - 集群模式 (Cluster)
定义:集群模式将数据分布在多个节点上,每个节点负责一部分数据,通过哈希槽(hash slot)来分配数据。
数据分片:集群中的每个节点都有自己的数据分片,通过哈希槽来确定数据存储的位置。
高可用性:每个节点都有一个或多个副本节点,当主节点故障时,副本节点会自动晋升为主节点。
扩展性:可以通过增加节点来水平扩展集群的存储和计算能力。
复杂度:集群模式的配置和管理最为复杂,需要考虑数据分布、故障恢复等多个方面。
应用场景:适用于大规模分布式系统,需要高可用性和高扩展性的场景。 - 总结
主从模式:简单易用,适用于读多写少的场景。
哨兵模式:在主从模式基础上增加了自动故障恢复,适用于对高可用性要求较高的场景。
集群模式:提供了高可用性和高扩展性,适用于大规模分布式系统。
7. 其他特性
- 事务支持:
Redis 支持简单的事务处理,允许多条命令作为一个原子操作执行。 - 发布/订阅:
支持消息的发布和订阅功能,适用于实时消息传递。 - Lua 脚本:
可以使用 Lua 脚本来执行复杂的操作,提高灵活性和性能
6、Redis总结
概述
- 定义:Redis(Remote Dictionary Server)是一个开源的键值对存储系统,通常被用作数据库、缓存和消息中间件。
- 特点:高性能、丰富的数据结构、持久化支持、主从复制、事务支持、发布/订阅模式等。
核心特性
- 高性能:
内存存储,读写速度快。
单线程模型,避免了多线程的复杂性和性能开销。 - 丰富的数据结构:
字符串(String):最基本的键值对存储。
哈希(Hash):存储字段和值的映射关系。
列表(List):双端链表,支持从两端高效地插入和删除元素。
集合(Set):无序且不重复的字符串集合。
有序集合(Sorted Set):每个成员关联一个分数,按分数排序。 - 持久化:
RDB(Redis Database Backup):定期将内存中的数据快照保存到磁盘上。
AOF(Append Only File):记录服务器接收到的每一个写操作,支持数据恢复。 - 高可用性:
主从复制:实现数据冗余备份。
哨兵系统(Sentinel):监控主从节点的健康状况,自动进行故障转移。
集群模式(Cluster):支持数据分片和水平扩展。 - 其他特性:
事务支持:允许多条命令作为一个原子操作执行。
发布/订阅:支持消息的发布和订阅功能。
Lua 脚本:可以使用 Lua 脚本来执行复杂的操作。\
应用场景
- 缓存:作为应用的数据缓存层,提高访问速度。
- 会话存储:存储用户的会话信息,便于在分布式环境中共享会话数据。\
- 消息队列:实现应用之间的异步通信。\
- 排行榜:利用有序集合实现高效的排行榜功能。\
- 实时分析:处理实时数据分析任务。\
- 限流:实现请求频率限制,防止系统过载。\
- 全局ID生成:生成全局唯一的ID。\
- 地理位置服务:存储地理位置信息,支持距离计算等功能。
最佳实践
- 性能优化:
合理设置键的过期时间,避免内存占用过高。
使用合适的持久化策略,平衡性能和数据安全性。 - 高可用性:
配置主从复制和哨兵系统,确保数据的冗余和高可用性。
使用集群模式进行水平扩展,提高系统吞吐量。 - 安全性:
设置密码保护,限制访问权限。
使用防火墙和安全组,限制外部访问。