跳转至
用户认证 - eMac Tech Docs

用户认证

重要提醒

为了您的权益以及学习体验,请不要外借账号!

如果您没有账号或忘记密码,请联系管理员重置密码。

请输入您的登录信息

Redis常用命令

flowchart TD
    Redis命令[Redis命令]
    Redis命令 --> 键操作
    Redis命令 --> 数据类型
    Redis命令 --> 事务
    Redis命令 --> 脚本

核心命令详解

类别 命令 作用 示例
键操作 KEYS/DEL/EXPIRE 键管理/删除/过期 DEL user:1
String SET/GET/INCR 设置/获取/自增 INCR page_views
Hash HSET/HGET/HINCRBY 设置字段/获取字段/字段自增 HINCRBY user:1 age 1
List LPUSH/RPOP/LLEN 左推/右弹/长度 LPUSH news latest_news
Set SADD/SMEMBERS/SISMEMBER 添加/获取所有/是否成员 SISMEMBER tags redis
ZSet ZADD/ZRANGE/ZSCORE 添加/范围查询/获取分值 ZRANGE rank 0 2 WITHSCORES

管道(Pipeline)示例

Pipeline p = jedis.pipelined();
p.set("key1", "value1");
p.incr("counter");
p.get("key1");
List<Object> results = p.syncAndReturnAll();

事务(Multi/Exec)示例

Transaction t = jedis.multi();
t.set("foo", "bar");
t.get("foo");
List<Object> results = t.exec();

Lua脚本示例

-- 限流脚本
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = tonumber(redis.call('GET', key) or "0")
if current + 1 > limit then
    return 0
else
    redis.call("INCR", key)
    return 1
end

注意点

  1. KEYS命令避免在生产环境使用
  2. 事务不保证原子性(无回滚)
  3. 管道适合批量但不相关操作
  4. Lua脚本执行是原子的
  5. 复杂脚本避免长时间阻塞

Redis 在 Java 项目中的应用

应用场景

1. 缓存

graph TD
    A[请求数据] --> B{Redis缓存?}
    B -->|有| C[返回缓存数据]
    B -->|无| D[查询数据库]
    D --> E[写入缓存]
    E --> F[返回数据]

2. 会话存储

graph TD
    A[用户登录] --> B[生成会话ID]
    B --> C[存储会话信息]
    C --> D[设置过期时间]
    D --> E[返回会话ID]

3. 计数器

graph TD
    A[访问请求] --> B[INCR计数器]
    B --> C{超过阈值?}
    C -->|是| D[触发限流]
    C -->|否| E[继续处理]

4. 排行榜

graph TD
    A[用户操作] --> B[更新分数]
    B --> C[更新排名]
    C --> D[获取排行榜]
    D --> E[展示结果]

性能优化

1. 缓存策略

graph TD
    subgraph 缓存策略
        p1[缓存穿透] --> s1[解决方案]
        p2[缓存击穿] --> s2[解决方案]
        p3[缓存雪崩] --> s3[解决方案]
    end

2. 数据一致性

graph TD
    A[更新数据] --> B{先更新缓存?}
    B -->|是| C[更新缓存]
    C --> D[更新数据库]
    B -->|否| E[更新数据库]
    E --> F[更新缓存]
    D --> G[处理异常]
    F --> G

实际应用案例

1. 商品缓存

@Service
public class ProductService {
    @Autowired
    private RedisTemplate redisTemplate;

    public Product getProduct(Long id) {
        // 1. 查询缓存
        Product product = (Product) redisTemplate.opsForValue().get("product:" + id);
        if (product != null) {
            return product;
        }

        // 2. 查询数据库
        product = productMapper.selectById(id);
        if (product != null) {
            // 3. 写入缓存
            redisTemplate.opsForValue().set("product:" + id, product, 1, TimeUnit.HOURS);
        }
        return product;
    }
}

2. 用户会话

@Service
public class SessionService {
    @Autowired
    private RedisTemplate redisTemplate;

    public String createSession(User user) {
        String sessionId = UUID.randomUUID().toString();
        redisTemplate.opsForValue().set(
            "session:" + sessionId,
            user,
            30,
            TimeUnit.MINUTES
        );
        return sessionId;
    }

    public User getSession(String sessionId) {
        return (User) redisTemplate.opsForValue().get("session:" + sessionId);
    }
}

3. 接口限流

@Service
public class RateLimiter {
    @Autowired
    private RedisTemplate redisTemplate;

    public boolean isAllowed(String key, int limit, int period) {
        String redisKey = "rate:" + key;
        Long count = redisTemplate.opsForValue().increment(redisKey);
        if (count == 1) {
            redisTemplate.expire(redisKey, period, TimeUnit.SECONDS);
        }
        return count <= limit;
    }
}

最佳实践

1. 缓存设计

  • 合理设置过期时间
  • 使用批量操作
  • 实现缓存预热
  • 处理缓存更新

2. 性能优化

  • 使用连接池
  • 实现本地缓存
  • 使用 Pipeline
  • 避免大键

3. 可靠性保证

  • 实现重试机制
  • 处理异常情况
  • 监控系统状态
  • 定期数据备份

注意事项

  1. 缓存使用建议:

    • 只缓存热点数据
    • 设置合理的过期时间
    • 实现缓存降级
    • 监控缓存命中率
  2. 性能考虑:

    • 避免频繁序列化
    • 使用合适的数据结构
    • 控制键的大小
    • 实现批量操作
  3. 安全建议:

    • 设置访问密码
    • 限制网络访问
    • 定期更新版本
    • 监控异常访问