Redis (Remote Dictionary Server) 是一个开源的内存数据库
Redis 支持五种基本数据类型和几种特殊数据类型
1. 基本数据类型
1.1 String(字符串)
# 设置值
SET key value
# 获取值
GET key
# 递增
INCR key
# 设置过期时间
SETEX key seconds value
# 应用场景:
# - 缓存
# - 计数器
# - 分布式锁
1.2 Hash(哈希)
# 设置单个字段
HSET key field value
# 设置多个字段
HMSET key field1 value1 field2 value2
# 获取字段值
HGET key field
# 获取所有字段和值
HGETALL key
# 应用场景:
# - 用户信息存储
# - 商品详情
# - 购物车
1.3 List(列表)
# 左侧插入
LPUSH key value1 value2
# 右侧插入
RPUSH key value1 value2
# 获取范围内元素
LRANGE key start stop
# 左侧弹出
LPOP key
# 应用场景:
# - 消息队列
# - 最新动态
# - 评论列表
1.4 Set(集合)
# 添加成员
SADD key member1 member2
# 获取所有成员
SMEMBERS key
# 判断是否存在
SISMEMBER key member
# 获取交集
SINTER key1 key2
# 应用场景:
# - 好友关系
# - 标签系统
# - 去重
1.5 Sorted Set(有序集合)
# 添加成员和分数
ZADD key score1 member1 score2 member2
# 获取范围内成员
ZRANGE key start stop
# 获取分数
ZSCORE key member
# 获取排名
ZRANK key member
# 应用场景:
# - 排行榜
# - 优先级队列
# - 延时任务
2. 特殊数据类型
2.1 Bitmap(位图)
# 设置位
SETBIT key offset value
# 获取位
GETBIT key offset
# 统计1的个数
BITCOUNT key
# 应用场景:
# - 用户签到
# - 在线状态
# - 布隆过滤器
2.2 HyperLogLog
# 添加元素
PFADD key element1 element2
# 获取基数估算值
PFCOUNT key
# 合并
PFMERGE destkey sourcekey1 sourcekey2
# 应用场景:
# - UV统计
# - 访问量统计
2.3 Geo(地理位置)
# 添加位置
GEOADD key longitude latitude member
# 计算距离
GEODIST key member1 member2 [unit]
# 获取坐标
GEOPOS key member
# 应用场景:
# - 附近的人
# - 外卖配送
# - 车辆调度
3. 实际应用示例
3.1 缓存实现
class RedisCache {
async get(key) {
const value = await redis.get(key);
return JSON.parse(value);
}
async set(key, value, expires) {
const stringValue = JSON.stringify(value);
if (expires) {
await redis.setex(key, expires, stringValue);
} else {
await redis.set(key, stringValue);
}
}
}
3.2 分布式锁
class RedisLock {
async acquire(key, timeout) {
const result = await redis.set(
`lock:${key}`,
process.pid,
'NX',
'EX',
timeout
);
return result === 'OK';
}
async release(key) {
await redis.del(`lock:${key}`);
}
}
3.3 排行榜实现
class Leaderboard {
async addScore(userId, score) {
await redis.zadd('leaderboard', score, userId);
}
async getTopN(n) {
return await redis.zrevrange('leaderboard', 0, n - 1, 'WITHSCORES');
}
async getRank(userId) {
return await redis.zrevrank('leaderboard', userId);
}
}
3.4 消息队列
class MessageQueue {
async publish(message) {
await redis.lpush('queue', JSON.stringify(message));
}
async consume() {
const message = await redis.rpop('queue');
return message ? JSON.parse(message) : null;
}
}
4. 使用注意事项
- 内存管理
# 设置最大内存
maxmemory 2gb
# 设置淘汰策略
maxmemory-policy allkeys-lru
- 过期策略
# 设置过期时间
EXPIRE key seconds
# 获取剩余时间
TTL key
- 持久化配置
# RDB持久化
save 900 1
save 300 10
save 60 10000
# AOF持久化
appendonly yes
appendfsync everysec
- 性能优化
-
合理使用数据结构
-
避免大key
-
使用管道减少网络开销
-
合理设置过期时间