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. 可靠性保证
- 实现重试机制
- 处理异常情况
- 监控系统状态
- 定期数据备份
注意事项
-
缓存使用建议:
- 只缓存热点数据
- 设置合理的过期时间
- 实现缓存降级
- 监控缓存命中率
-
性能考虑:
- 避免频繁序列化
- 使用合适的数据结构
- 控制键的大小
- 实现批量操作
-
安全建议:
- 设置访问密码
- 限制网络访问
- 定期更新版本
- 监控异常访问