分布式缓存之Redis

Redis的数据结构,这些结构的使用场景

  • String

    • 简单的kv存储
  • hash

    • 存储对象,一个key有多个值
  • list

    • 列表型数据、消息队列等
  • set

    • 无序集合、去重,交集、并集等,比如查看共同好友,在社交关系方面、数据排重等可以使用
  • sroted set

    • 有序集合,去重,做榜单

Redis处理请求快的原因

  • redis是单线程,为什么这么快?

    • 基于内存,绝大部分请求是纯粹的内存操作,CPU不是Redis的瓶颈
    • 避免了不必要的CPU上下文切换和其他竞争条件,比如锁操作等
    • 底层是使用多路I/O复用模型,非阻塞IO
    • Redis6 后支持多线程,但是默认不开启

Redis的持久化方式

  • redis有哪些持久化方式,以及他们的区别

    • 支持AOF和RDB持久化

    • AOF

      • 以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录
      • 支持秒级持久化、兼容性好,对于相同数量的数据集而言,AOF文件通常要大于RDB文件,所以恢复比RDB慢
    • RDB

      • 在指定的时间间隔内将内存中的数据集快照写入磁盘,可以指定时间归档数据,但不能做到实时持久化
      • 文件紧凑,体积小,对于灾难恢复而言,RDB是非常不错的选择,相比于AOF机制,如果数据集很大,RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
### 使用方法 #### 基本操作 在 Python 中使用 Redis 实现分布式缓存,可借助 Redis 官方的 Python 客户端 `redis-py`。以下是简单示例: ```python import redis # 连接到 Redis 服务器 r = redis.Redis(host='localhost', port=6379, db=0) # 设置缓存数据 r.set('user:1', 'John Doe') # 获取缓存数据 user = r.get('user:1') print(user.decode('utf-8')) ``` #### Spring Boot 整合 Redis 在 Spring Boot 项目里,可通过 Spring Data Redis 来使用 Redis 实现分布式缓存。首先,在 `pom.xml` 中添加依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 接着,在 `application.properties` 中配置 Redis 连接信息: ```properties spring.redis.host=localhost spring.redis.port=6379 ``` 最后,在服务类中使用 `@Cacheable`、`@CachePut`、`@CacheEvict` 等注解来实现缓存操作: ```java import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class UserService { @Cacheable(value = "users", key = "#id") public String getUserById(Long id) { // 模拟从数据库中获取用户信息 return "User: " + id; } } ``` ### 优势 - **高性能**:Redis 基于内存存储数据,读写速度极快,能显著提升系统的响应速度。 - **丰富的数据类型**:Redis 支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,可满足不同业务场景的需求。 - **持久化机制**:Redis 提供了 RDB 和 AOF 两种持久化方式,能在服务器重启时恢复数据,保证数据的安全性和可靠性。 - **分布式特性**:Redis 支持主从复制、哨兵和分片集群等分布式架构,可实现高并发读、高可用和水平扩展。 ### 问题解决方案 #### 缓存穿透 - **缓存空对象**:当查询结果为空时,将空对象也缓存起来,并设置较短的过期时间,避免后续相同的无效请求继续访问数据库[^1]。 - **布隆过滤器**:在请求到达缓存之前,先通过布隆过滤器判断请求的数据是否可能存在。若不存在,则直接返回,避免对缓存和数据库的无效访问[^1]。 #### 缓存雪崩 - **设置随机过期时间**:为不同的缓存数据设置随机的过期时间,避免大量缓存数据在同一时间过期,导致数据库压力过大。 - **使用多级缓存**:采用本地缓存分布式缓存相结合的方式,当分布式缓存失效时,可先从本地缓存获取数据,减轻数据库的压力。 #### 缓存击穿 - **互斥锁方案**:当某个热点数据的缓存过期时,只允许一个线程去查询数据库并更新缓存,其他线程等待缓存更新完成后再获取数据[^1]。 - **逻辑过期方案**:为缓存数据设置逻辑过期时间,当缓存数据过期时,不立即删除,而是在访问时判断是否过期。若过期,则异步更新缓存数据,同时返回旧数据,保证系统的高可用性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值