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
注意点
- KEYS命令避免在生产环境使用
 - 事务不保证原子性(无回滚)
 - 管道适合批量但不相关操作
 - Lua脚本执行是原子的
 - 复杂脚本避免长时间阻塞
 
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. 可靠性保证
- 实现重试机制
 - 处理异常情况
 - 监控系统状态
 - 定期数据备份
 
注意事项
- 
缓存使用建议:
- 只缓存热点数据
 - 设置合理的过期时间
 - 实现缓存降级
 - 监控缓存命中率
 
 - 
性能考虑:
- 避免频繁序列化
 - 使用合适的数据结构
 - 控制键的大小
 - 实现批量操作
 
 - 
安全建议:
- 设置访问密码
 - 限制网络访问
 - 定期更新版本
 - 监控异常访问