# Redis学习

Redis学习

1、Redis是什么?

Redis(Remote Dictionary Server)是一个开源的键值对存储系统,通常被用作数据库、缓存和消息中间件。

2、Redis能够做什么?

  1. 缓存:利用Redis的高速读写性能,作为应用的数据缓存层,减少对后端数据库的压力。
  2. 会话存储:存储用户的会话信息,如登录状态等,便于在分布式环境中共享会话数据。
  3. 消息队列:使用Redis的列表数据结构实现简单的消息队列,适用于轻量级的任务调度。
  4. 分布式锁:通过Redis实现跨服务的分布式锁机制,确保多个服务实例间的操作互斥。
  5. 排行榜:利用有序集合(Sorted Set)实现高效的排行榜功能,支持按分数排序。
  6. 实时分析:处理实时数据流,进行快速的数据聚合和分析。
  7. 限流:实现请求频率限制,防止系统过载。
  8. 全局ID生成:生成全局唯一的ID,常用于分布式系统中的唯一标识符。
  9. 地理位置服务:使用Geo相关命令存储地理位置信息,支持距离计算等功能。
  10. 持久化存储:虽然Redis主要用于内存存储,但它也支持数据的持久化,可以在重启后恢复数据。

3、Redis能给我带来什么好处?

提高性能

Redis将数据存储在内存中,极大地提高了数据的读写速度,对于需要频繁访问的数据,使用Redis作为缓存层可以显著提升应用性能。

支持丰富的数据结构

提供了字符串、哈希、列表、集合、有序集合等多种数据结构,方便开发者针对不同的业务场景选择最合适的数据结构,提高开发效率。

简化开发

Redis简单易用的API和丰富的数据结构降低了开发复杂度,使开发者可以更专注于业务逻辑的实现。

持久化选项

支持RDB和AOF两种持久化方式,可以在不影响性能的情况下,确保数据的安全性和持久性。
高可用性:

通过主从复制、哨兵(Sentinel)和集群(Cluster)等功能,Redis提供了高可用性的解决方案,保障系统的稳定运行。

易于扩展

Redis集群模式允许水平扩展,随着业务的增长,可以通过添加更多的节点来增加存储容量和处理能力。

社区和支持

拥有活跃的开源社区,提供了大量的文档、教程和第三方工具,有助于快速解决问题和学习新技术。

节省成本

对于某些应用场景,使用Redis可以减少对昂贵的数据库服务器的需求,从而降低硬件和运维成本。

4、Redis如何使用?

安装Redis

  1. 安装Redis:从官网下载并安装Redis。
  2. 启动Redis服务:在Redis安装目录下,运行redis-server命令启动服务。
  3. 连接Redis:使用redis-cli命令连接到Redis服务。
  4. 使用Redis命令:使用Redis提供的命令对数据进行操作。
  5. 关闭Redis服务:使用Ctrl+C命令关闭Redis服务。

连接Redis

  1. 连接到本地 Redis 服务器
    redis-cli

  2. 连接到远程 Redis 服务器
    redis-cli -h hostname -p port -a password

编程开发

Lettuce Redis Client

  1. 添加依赖
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'io.lettuce.core:lettuce-core'
  1. 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。
  1. 创建对应的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;
    }
}
  1. 创建使用类
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. 存储结构

  1. 键值对存储:
    Redis 是一个键值对存储系统,所有的数据都以键值对的形式存储。键是字符串类型,而值可以是多种数据类型,包括字符串、哈希、列表、集合和有序集合。
  2. 字典实现:
    Redis 使用字典(dict)来实现键值对的映射关系。字典内部使用哈希表来存储数据,支持高效的查找、插入和删除操作。

2. 数据类型

  1. 字符串:最简单的数据类型,可以存储文本或二进制数据。
  2. 哈希:存储字段和值的映射关系,适合存储对象。
  3. 列表:双端链表,支持从两端高效地插入和删除元素。
  4. 集合:无序且不重复的字符串集合,支持集合运算。
  5. 有序集合:每个成员关联一个分数,按照分数排序,支持范围查询。

3. 持久化机制

  1. RDB(Redis Database Backup):
    定期将内存中的数据快照保存到磁盘上,生成一个 .rdb 文件。这种方式适合灾难恢复。
  2. AOF(Append Only File):
    记录服务器接收到的每一个写操作,并在服务器启动时重新执行这些操作来恢复数据。AOF 文件可以配置为每秒或每次写操作后追加,以平衡性能和数据安全性。

4. 网络通信

  1. 单线程模型:
    Redis 采用单线程模型处理客户端请求,避免了多线程带来的复杂性和性能开销。单线程模型通过 I/O 多路复用(epoll/kqueue)来高效处理大量并发连接。
  2. 协议解析:
    Redis 使用自定义的二进制协议,支持请求和响应的高效解析。

5. 内存管理

  1. 内存回收:
    Redis 通过引用计数和周期性扫描来管理内存,自动回收不再使用的对象。
  2. 内存碎片整理:
    Redis 可以通过配置参数来控制内存碎片率,减少内存浪费。
  3. 内存限制:
    可以设置最大内存使用量,当内存使用超过限制时,Redis 会根据配置的淘汰策略(如 LRU、LFU)来释放内存。

6. 高可用性

  1. 主从模式 (Master-Slave)
    定义:主从模式是一种简单的复制机制,其中有一个主节点(Master)和一个或多个从节点(Slave)。
    数据同步:主节点负责写操作,从节点通过异步复制的方式从主节点获取数据更新。
    读写分离:读操作可以分布在从节点上,减轻主节点的压力。
    高可用性:如果主节点故障,需要手动切换到从节点,或者通过脚本自动切换。
    应用场景:适用于读多写少的场景,可以提高读取性能。
  2. 哨兵模式 (Sentinel)
    定义:哨兵模式是在主从模式的基础上增加了一个或多个哨兵(Sentinel)节点,用于监控主从节点的健康状态。
    故障转移:当主节点故障时,哨兵会自动选举一个新的从节点作为新的主节点,实现自动故障恢复。
    监控:哨兵节点不仅监控主从节点,还可以监控其他哨兵节点,确保整个系统的高可用性。
    配置复杂度:相对于主从模式,哨兵模式的配置和管理更为复杂。
    应用场景:适用于对高可用性要求较高的场景,能够自动处理主节点故障。
  3. 集群模式 (Cluster)
    定义:集群模式将数据分布在多个节点上,每个节点负责一部分数据,通过哈希槽(hash slot)来分配数据。
    数据分片:集群中的每个节点都有自己的数据分片,通过哈希槽来确定数据存储的位置。
    高可用性:每个节点都有一个或多个副本节点,当主节点故障时,副本节点会自动晋升为主节点。
    扩展性:可以通过增加节点来水平扩展集群的存储和计算能力。
    复杂度:集群模式的配置和管理最为复杂,需要考虑数据分布、故障恢复等多个方面。
    应用场景:适用于大规模分布式系统,需要高可用性和高扩展性的场景。
  4. 总结
    主从模式:简单易用,适用于读多写少的场景。
    哨兵模式:在主从模式基础上增加了自动故障恢复,适用于对高可用性要求较高的场景。
    集群模式:提供了高可用性和高扩展性,适用于大规模分布式系统。

7. 其他特性

  1. 事务支持:
    Redis 支持简单的事务处理,允许多条命令作为一个原子操作执行。
  2. 发布/订阅:
    支持消息的发布和订阅功能,适用于实时消息传递。
  3. Lua 脚本:
    可以使用 Lua 脚本来执行复杂的操作,提高灵活性和性能

6、Redis总结

概述

  1. 定义:Redis(Remote Dictionary Server)是一个开源的键值对存储系统,通常被用作数据库、缓存和消息中间件。
  2. 特点:高性能、丰富的数据结构、持久化支持、主从复制、事务支持、发布/订阅模式等。

核心特性

  1. 高性能:
    内存存储,读写速度快。
    单线程模型,避免了多线程的复杂性和性能开销。
  2. 丰富的数据结构:
    字符串(String):最基本的键值对存储。
    哈希(Hash):存储字段和值的映射关系。
    列表(List):双端链表,支持从两端高效地插入和删除元素。
    集合(Set):无序且不重复的字符串集合。
    有序集合(Sorted Set):每个成员关联一个分数,按分数排序。
  3. 持久化:
    RDB(Redis Database Backup):定期将内存中的数据快照保存到磁盘上。
    AOF(Append Only File):记录服务器接收到的每一个写操作,支持数据恢复。
  4. 高可用性:
    主从复制:实现数据冗余备份。
    哨兵系统(Sentinel):监控主从节点的健康状况,自动进行故障转移。
    集群模式(Cluster):支持数据分片和水平扩展。
  5. 其他特性:
    事务支持:允许多条命令作为一个原子操作执行。
    发布/订阅:支持消息的发布和订阅功能。
    Lua 脚本:可以使用 Lua 脚本来执行复杂的操作。\

应用场景

  1. 缓存:作为应用的数据缓存层,提高访问速度。
  2. 会话存储:存储用户的会话信息,便于在分布式环境中共享会话数据。\
  3. 消息队列:实现应用之间的异步通信。\
  4. 排行榜:利用有序集合实现高效的排行榜功能。\
  5. 实时分析:处理实时数据分析任务。\
  6. 限流:实现请求频率限制,防止系统过载。\
  7. 全局ID生成:生成全局唯一的ID。\
  8. 地理位置服务:存储地理位置信息,支持距离计算等功能。

最佳实践

  1. 性能优化:
    合理设置键的过期时间,避免内存占用过高。
    使用合适的持久化策略,平衡性能和数据安全性。
  2. 高可用性:
    配置主从复制和哨兵系统,确保数据的冗余和高可用性。
    使用集群模式进行水平扩展,提高系统吞吐量。
  3. 安全性:
    设置密码保护,限制访问权限。
    使用防火墙和安全组,限制外部访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值