Redis五种核心数据类型与命令示例

 更新时间:2026年01月26日 16:39:00   作者:不吃冰  
本文介绍了Redis的五种核心数据类型:String、Hash、List、Set和SortedSet,每种类型都有其独特的存储结构、应用场景和时间复杂度,同时,还提供了Java示例代码和命令示例,感兴趣的朋友跟随小编一起看看吧

一、Redis数据类型概述

Redis支持五种核心数据结构,每种结构都针对特定场景优化:

数据类型

存储结构

主要应用场景

时间复杂度

String

简单动态字符串(SDS)

缓存、计数器、分布式锁

O(1)

Hash

键值对集合

对象存储、购物车、用户属性

O(1)

List

双向链表

消息队列、最新列表、关注列表

头尾操作O(1)

Set

无序集合

标签、共同好友、随机推荐

O(1)

Sorted Set

有序集合

排行榜、延迟队列、范围查询

O(logN)

二、String(字符串类型)

核心特性

// Redis底层使用SDS(简单动态字符串)
struct sdshdr {
    unsigned int len;    // 字符串长度
    unsigned int free;   // 未使用字节数
    char buf[];         // 字节数组
};

二进制安全:可存储任何二进制数据,包括图片、序列化对象等。

常用命令

# 基本操作
SET key value        # 设置键值
GET key             # 获取值
APPEND key value    # 追加值
STRLEN key          # 获取长度
# 批量操作
MSET k1 v1 k2 v2     # 批量设置
MGET k1 k2          # 批量获取
# 数值操作
INCR key            # 自增1
INCRBY key 5        # 增加指定数值
DECR key            # 自减1
SETNX key value     # 不存在时设置(实现分布式锁基础)
# 过期时间
SETEX key 10 value  # 设置值并指定10秒过期
SET key value EX 10 # 同上
PSETEX key 1000 value # 毫秒级过期

Java示例

Jedis jedis = new Jedis("localhost");
// 基本操作
jedis.set("username", "minxr");
String name = jedis.get("username");
// 追加操作
jedis.append("username", "jintao");
// 设置过期
jedis.setex("session_token", 3600, "abc123");
// 批量操作
jedis.mset("user:1:name", "Alice", "user:1:age", "25");
List<String> values = jedis.mget("user:1:name", "user:1:age");

三、Hash(哈希类型)

适用场景

存储对象,如用户信息、商品详情。相比JSON字符串存储,可独立更新单个字段。

常用命令

# 字段操作
HSET user:1001 name "张三" age 25  # 设置字段
HGET user:1001 name              # 获取字段
HMSET user:1001 email "a@b.com" phone "13800138000"  # 批量设置
HMGET user:1001 name age         # 批量获取
HGETALL user:1001               # 获取所有字段
HDEL user:1001 email            # 删除字段
# 判断与计数
HEXISTS user:1001 name          # 检查字段是否存在
HLEN user:1001                  # 字段数量
HSETNX user:1001 name "李四"    # 字段不存在时设置
# 获取键/值
HKEYS user:1001                 # 所有字段名
HVALS user:1001                 # 所有字段值
HINCRBY user:1001 score 10      # 数值字段增加

商品信息存储示例

# 商品ID为1001的信息
HMSET items:1001 id 1001 name "iPhone" price 5999.00 stock 100
HGET items:1001 name          # 获取商品名
HINCRBY items:1001 stock -1   # 减少库存
HGETALL items:1001            # 获取完整信息

Java示例

// 存储用户信息
Map<String, String> user = new HashMap<>();
user.put("name", "Akshi");
user.put("age", "2");
user.put("sex", "Female");
jedis.hmset("user:1001", user);
// 获取操作
String name = jedis.hget("user:1001", "name");
List<String> fields = jedis.hmget("user:1001", "name", "age");
Map<String, String> allFields = jedis.hgetAll("user:1001");
// 字段操作
jedis.hincrBy("user:1001", "age", 1);  // 年龄+1
jedis.hdel("user:1001", "sex");        // 删除字段

四、List(列表类型)

数据结构

基于双向链表实现,两端操作O(1),中间操作O(n)。

常用命令

# 增加元素
LPUSH list:1 a b c    # 左侧插入
RPUSH list:1 d e f    # 右侧插入
LINSERT list:1 BEFORE b x  # 指定位置插入
# 弹出元素
LPOP list:1          # 左侧弹出
RPOP list:1          # 右侧弹出
RPOPLPUSH list:1 list:2  # 原子移动
# 查询操作
LRANGE list:1 0 2     # 获取片段(包含两端)
LINDEX list:1 2       # 获取指定索引元素
LLEN list:1          # 列表长度
# 删除操作
LREM list:1 2 "a"    # 删除前2个"a"
LTRIM list:1 0 3     # 只保留0-3索引元素
LSET list:1 0 "new"  # 设置指定索引值

商品评论系统示例

# 商品1001的评论列表
LPUSH items:comment:1001 '{"id":1,"content":"商品不错","time":1630295077289}'
LPUSH items:comment:1001 '{"id":2,"content":"物流很快","time":1630295077290}'
# 获取最新10条评论
LRANGE items:comment:1001 0 9

Java示例

// 消息队列实现
jedis.lpush("messages", "Hello");
jedis.lpush("messages", "World");
jedis.rpush("messages", "!");
// 获取所有消息
List<String> messages = jedis.lrange("messages", 0, -1);
// 阻塞式弹出(实现任务队列)
String task = jedis.brpop(5, "task_queue");  // 最多等待5秒
// 最新动态列表
jedis.lpush("news:latest", "新闻1", "新闻2", "新闻3");
jedis.ltrim("news:latest", 0, 9);  // 只保留最新10条

五、Set(集合类型)

特性

无序、唯一元素,基于哈希表实现,操作O(1)。

常用命令

# 基本操作
SADD tags java redis python  # 添加元素
SMEMBERS tags               # 获取所有元素
SREM tags python           # 删除元素
SISMEMBER tags java        # 判断是否存在
# 集合运算
SINTER set1 set2           # 交集
SUNION set1 set2           # 并集
SDIFF set1 set2            # 差集(set1有set2无)
SCARD tags                 # 元素个数
SPOP tags                  # 随机弹出一个
SRANDMEMBER tags 2         # 随机获取2个(不删除)

社交应用示例

# 用户标签
SADD user:1001:tags 音乐 电影 编程
SADD user:1002:tags 电影 游戏 摄影
# 共同兴趣
SINTER user:1001:tags user:1002:tags
# 返回: 电影
# 推荐标签(你有我无的)
SDIFF user:1002:tags user:1001:tags
# 返回: 游戏 摄影

六、Sorted Set(有序集合)

特性

元素唯一,每个元素关联一个分数(score),按分数排序。

常用命令

# 添加元素
ZADD rank 95 "张三" 89 "李四" 78 "王五"
ZADD rank 97 "李四"  # 更新分数
# 查询操作
ZRANGE rank 0 2              # 升序前3名
ZREVRANGE rank 0 2           # 降序前3名
ZRANGE rank 0 2 WITHSCORES   # 带分数
ZSCORE rank "张三"          # 获取分数
ZRANK rank "张三"           # 升序排名
ZREVRANK rank "张三"        # 降序排名
# 分数范围操作
ZRANGEBYSCORE rank 90 100   # 90-100分
ZCOUNT rank 80 90           # 80-90分人数
ZINCRBY rank 5 "张三"        # 增加5分
# 删除操作
ZREM rank "王五"            # 删除元素
ZREMRANGEBYRANK rank 0 2    # 删除排名0-2
ZREMRANGEBYSCORE rank 0 60  # 删除0-60分
ZCARD rank                  # 元素总数

排行榜实现

# 游戏积分榜
ZADD game:rank 1500 "玩家A" 1200 "玩家B" 1800 "玩家C"
# 获取前十名
ZREVRANGE game:rank 0 9 WITHSCORES
# 增加积分
ZINCRBY game:rank 100 "玩家B"
# 查询我的排名(从0开始)
ZREVRANK game:rank "玩家A"
# 查询分数段人数
ZCOUNT game:rank 1000 2000

Java示例

// 黑客排名(按出生年份)
jedis.zadd("hackers", 1940, "Alan Kay");
jedis.zadd("hackers", 1953, "Richard Stallman");
// 按分数升序获取
Set<String> asc = jedis.zrange("hackers", 0, -1);
// 按分数降序获取
Set<String> desc = jedis.zrevrange("hackers", 0, -1);
// 分数范围查询
Set<String> range = jedis.zrangeByScore("hackers", 1950, 1970);

七、键管理命令

常用键操作

# 键查询
KEYS user:*           # 匹配user:开头的键
EXISTS key           # 键是否存在
TYPE key             # 键的数据类型
DEL key1 key2       # 删除键
UNLINK key          # 非阻塞删除(Redis 4.0+)
# 重命名
RENAME old new      # 重命名
RENAMENX old new    # 新名不存在时才重命名
# 过期时间
EXPIRE key 60       # 60秒后过期
TTL key             # 查看剩余时间(秒)
PTTL key            # 剩余毫秒数
PERSIST key         # 移除过期时间
EXPIREAT key 1630345600  # 指定时间戳过期

批量操作示例

# 批量设置带过期
MSET k1 v1 k2 v2
EXPIRE k1 3600
EXPIRE k2 3600
# 扫描所有键(代替KEYS,不阻塞)
SCAN 0 MATCH user:* COUNT 10

八、服务器管理命令

# 连接测试
PING          # 返回PONG表示正常
ECHO "hello"  # 回显字符串
# 数据库操作
SELECT 1      # 切换到1号库(0-15)
DBSIZE        # 当前库键数量
FLUSHDB       # 清空当前库
FLUSHALL      # 清空所有库
# 服务器信息
INFO          # 详细服务器信息
INFO memory   # 内存信息
INFO stats    # 统计信息
CLIENT LIST   # 客户端列表
TIME          # 服务器时间
# 持久化
SAVE          # 同步保存(阻塞)
BGSAVE        # 后台保存
LASTSAVE     # 上次保存时间

到此这篇关于Redis五种核心数据类型与命令示例的文章就介绍到这了,更多相关Redis数据类型与命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • K8S部署Redis(单机、集群)的超详细步骤

    K8S部署Redis(单机、集群)的超详细步骤

    redis是一款基于BSD协议,开源的非关系型数据库(nosql数据库)这篇文章主要给大家介绍了关于K8S部署Redis(单机、集群)的超详细步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Redis主从复制作用及搭建过程

    Redis主从复制作用及搭建过程

    Redis 的主从复制是实现数据备份、读写分离和水平扩展的核心机制之一,通过主从复制,一个主节点(Master)可以将数据同步到多个从节点(Slave),从节点还可以级联创建自己的从节点,从而形成树状结构,本文给大家介绍Redis主从复制的相关知识,感兴趣的朋友一起看看吧
    2025-06-06
  • Redis中过期键删除的三种方法

    Redis中过期键删除的三种方法

    Redis中可以设置键的过期时间,并且通过取出过期字典(expires dict)中键的过期时间和当前时间比较来判断是否过期,那么一个过期的键是怎么被删除的呢?本文给大家总结了三种方法,选了其中两种给大家详细的介绍一下,需要的朋友可以参考下
    2024-05-05
  • redis适合场景八点总结

    redis适合场景八点总结

    在本篇文章中我们给大家整理了关于redis适合什么场景的8点知识点内容,需要的朋友们参考下。
    2019-06-06
  • 简单聊一聊redis过期时间的问题

    简单聊一聊redis过期时间的问题

    在使用redis的过期时间时不由想到设置了过期时间,下面这篇文章主要给大家介绍了关于redis过期时间问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • 在redhat6.4安装redis集群【教程】

    在redhat6.4安装redis集群【教程】

    这篇文章主要介绍了在redhat6.4安装redis集群【教程】,需要的朋友可以参考下
    2016-05-05
  • 利用redis实现分布式锁,快速解决高并发时的线程安全问题

    利用redis实现分布式锁,快速解决高并发时的线程安全问题

    这篇文章主要介绍了利用redis实现分布式锁,快速解决高并发时的线程安全问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 深入理解 Redis Template及4种序列化方式

    深入理解 Redis Template及4种序列化方式

    这篇文章主要介绍了深入理解 Redis Template及4种序列化方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 使用Redis获取数据转json,解决动态泛型传参的问题

    使用Redis获取数据转json,解决动态泛型传参的问题

    这篇文章主要介绍了使用Redis获取数据转json,解决动态泛型传参的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 利用Redis实现爬虫URL去重与队列管理的实战指南

    利用Redis实现爬虫URL去重与队列管理的实战指南

    传统爬虫开发中,URL去重和任务队列管理是两大难题,本文将以实战为导向,拆解Redis在爬虫中的两大核心应用场景:URL去重与任务队列管理,用代码片段和场景化案例说明实现逻辑,最后附上常见问题解决方案,需要的朋友可以参考下
    2025-11-11

最新评论