一、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 9java示例
// 消息队列实现
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数据类型与命令内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论