Day29:Redis 缓存实战

一、今日目标

  1. 安装 Redis(Windows/Linux)
  2. 学会 StackExchange.Redis / CSRedis 二选一
  3. 封装 RedisHelper 通用帮助类(企业标准)
  4. 学会在项目中注入 + 使用缓存
  5. 背会 Redis 高频面试题

二、Redis 安装(超级简单)

Windows(开发用)

直接下载解压运行:https://github.com/tporadowski/redis/releases

复制代码
redis-server.exe  # 启动
redis-cli.exe     # 客户端

Linux(部署用)

复制代码
sudo apt install redis-server
systemctl start redis
systemctl enable redis

三、.NET 2 大 Redis 客户端(企业真实使用)

1. CSRedis(推荐,简单、稳定、支持高级功能

复制代码
Install-Package CSRedisCore

优点:

  • 轻量、API 友好
  • 支持异步、锁、哈希、列表、队列
  • 支持集群、哨兵
  • 企业使用率极高

2. StackExchange.Redis

复制代码
Install-Package StackExchange.Redis

优点:

  • 官方最主流
  • 性能强

缺点:

  • 容易超时、复杂

四、企业级 RedisHelper 完整封装(直接复制)

位置(DDD 规范)

cs 复制代码
Infrastructure/
  Commons/
    Redis/
      MyRedisHelper.cs

完整代码(CSRedis 版)

cs 复制代码
using CSRedis;

namespace Admin.NET.Infrastructure.Commons.Redis;

/// <summary>
/// Redis 帮助类(企业通用)
/// </summary>
public class MyRedisHelper
{
    private readonly CSRedisClient _redis;

    public MyRedisHelper(string connectionString)
    {
        _redis = new CSRedisClient(connectionString);
    }

    #region String
    public async Task SetAsync<T>(string key, T value, int expireMinutes = 60)
    {
        await _redis.SetAsync(key, value, expireMinutes * 60);
    }

    public async Task<T> GetAsync<T>(string key)
    {
        return await _redis.GetAsync<T>(key);
    }

    public async Task<bool> ExistsAsync(string key)
    {
        return await _redis.ExistsAsync(key);
    }

    public async Task<long> DeleteAsync(string key)
    {
        return await _redis.DelAsync(key);
    }
    #endregion

    #region Hash
    public async Task HashSetAsync<T>(string key, string field, T value)
    {
        await _redis.HSetAsync(key, field, value);
    }

    public async Task<T> HashGetAsync<T>(string key, string field)
    {
        return await _redis.HGetAsync<T>(key, field);
    }
    #endregion

    #region 过期
    public async Task ExpireAsync(string key, int expireMinutes)
    {
        await _redis.ExpireAsync(key, TimeSpan.FromMinutes(expireMinutes));
    }
    #endregion
}

五、Program.cs 注册(全局单例)

cs 复制代码
// appsettings.json 配置
"Redis": {
  "ConnectionString": "127.0.0.1:6379,password=,defaultDatabase=0"
}

// 注册 Redis
var redisConn = builder.Configuration["Redis:ConnectionString"]!;
builder.Services.AddSingleton(new MyRedisHelper(redisConn));

六、使用(Service 中注入)

cs 复制代码
private readonly MyRedisHelper _redis;

public UserService(MyRedisHelper redis)
{
    _redis = redis;
}

// 存缓存
await _redis.SetAsync("user:1", user, 30);

// 取缓存
var user = await _redis.GetAsync<User>("user:1");

七、高频面试题(必背,简历加分)

1. Redis 是什么?为什么快?

  • 内存数据库,读写速度 10w QPS
  • 单线程 + IO 多路复用
  • 内存操作比数据库快 100~1000 倍

2. Redis 缓存使用场景?

  • 接口缓存
  • 菜单 / 权限缓存
  • 登录用户信息
  • 分布式锁
  • 计数器、限流
  • 队列

3. 缓存穿透、击穿、雪崩?

穿透:查不存在的数据 → 数据库压力大

解决方案:缓存空值、布隆过滤器

击穿:热点 Key 过期 → 大量请求打库

解决方案:互斥锁、永不过期

雪崩:大量 Key 同时过期

解决方案:随机过期时间、集群、多级缓存

4. Redis 淘汰策略

volatile-lru、allkeys-lru(企业最常用)

5. 为什么用 Redis 不用内存缓存?

  • 分布式共享缓存
  • 持久化
  • 支持多种数据结构
  • 支持多服务器共享

6. Redis 持久化

RDB(快照)、AOF(日志)


八、今日练习

  1. 安装 Redis
  2. 安装 CSRedisCore
  3. 封装 RedisHelper
  4. 在 UserService / MenuService 加入缓存
  5. 测试:存、取、删除、过期
相关推荐
Quincy_Freak12 分钟前
银河麒麟aarch64如何高效做数据分析?分享一款内网离线数据分析利器
大数据·数据库·数据挖掘·数据分析·aarch64
yurenpai(27届找实习中)21 分钟前
redis_点评(25.附件店铺—把数据库里的店铺按【类型分组】,批量导入Redis 的 GEO 地理位置结构)
java·redis·缓存
香气袭人知骤暖23 分钟前
PG数据库 Docker 容器自动备份方案
数据库·docker·容器
闪电悠米1 小时前
黑马点评-优惠券秒杀-05_local_lock_cluster_problem
java·spring boot·redis·缓存
me8321 小时前
【Linux】Linux 目录命名规范溯源(Linux各个目录究竟是干嘛的)
linux·运维·数据库
土狗TuGou1 小时前
SQL内功笔记 · 第2篇:列的约束
数据库·笔记·sql
java_cj1 小时前
MySQL 执行原理深度剖析:查询成本计算与优化器内幕
数据库·后端·mysql
java_cj1 小时前
数据库范式化设计与性能优化全攻略
数据库·后端·性能优化·架构·开源
Noushiki2 小时前
MySQL索引优化实战:高效查询的黄金法则
数据库·sql·mysql
TDengine (老段)2 小时前
TDengine Commit 与 Flush 机制 — 从内存到磁盘的数据落盘全流程
大数据·数据库·物联网·架构·时序数据库·iot·tdengine