《redis有哪些数据类型》

4 阅读2分钟

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. 使用注意事项

  1. 内存管理
# 设置最大内存
maxmemory 2gb
# 设置淘汰策略
maxmemory-policy allkeys-lru
  1. 过期策略
# 设置过期时间
EXPIRE key seconds
# 获取剩余时间
TTL key
  1. 持久化配置
# RDB持久化
save 900 1
save 300 10
save 60 10000

# AOF持久化
appendonly yes
appendfsync everysec
  1. 性能优化
  • 合理使用数据结构

  • 避免大key

  • 使用管道减少网络开销

  • 合理设置过期时间