点一下关注吧!!!非常感谢!!持续更新!!!
🚀 AI篇持续更新中!(长期更新)
AI炼丹日志-30-新发布【1T 万亿】参数量大模型!Kimi‑K2开源大模型解读与实践,持续打造实用AI工具指南!📐🤖
💻 Java篇正式开启!(300篇)
目前2025年07月10日更新到: Java-68 深入浅出 分布式服务 Netty实现自定义RPC 附详细代码 MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!
📊 大数据板块已完成多项干货更新(300篇):
包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈! 大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解
章节内容
上一节我们完成了:
- Redis 源码下载
- Redis 编译、安装
- Redis 配置修改
- Redis 服务启动
背景介绍
这里是三台公网云服务器,每台 2C4G,搭建一个大数据的学习环境,供我学习。
- 2C4G 编号 h121
- 2C4G 编号 h122
- 2C2G 编号 h123
通用键空间命令(Key Commands)
- EXISTS key:判断键是否存在,O(1),不存在即“冷缓存”或已过期
- DEL key1 [key2…]:删除键,O(m)(m=键数),删除大集合会锁住线程,慎用
- EXPIRE key 60 / TTL key:,设置 / 查询剩余 TTL,O(1),“写缓存时带 TTL” 基操
- TYPE key:返回值类型,O(1),动态调试、监控
- KEYS pattern:扫描匹配键,O(N),线上禁用;用 SCAN
- SCAN cursor [MATCH p*] [COUNT 1000]:游标遍历键,O(N),运维巡检、热点排查
- RENAME a b / RENAMENX a b:重命名键,O(1):原子替换热键
string 类型
常见操作
- `SET key “v” [EX 60:PX 60000] [NX,GET key / MGET k1 k2
- 获取单个 / 多个:INCR key / INCRBY key 5 / INCRBYFLOAT key 0.1,原子计数器、限流
- SETBIT key offset 1 / GETBIT / BITCOUNT:Bitmap 布隆位图,APPEND key "tail" / STRLEN key
- 日志拼接、长度统计:GETSET key new,原子读取旧值并替换;实现“分布式锁超时”常用
高频使用的场景:
- 网站 PV/UV 计数、接口 QPS 令牌桶
- 分布式唯一 ID(Lua + INCR)
- 简单缓存(带 EX)
应用场景
- key和value是字符串
- 普通的赋值
- incr 用于乐观锁(incr递增数字)
- setnx 用于分布式锁(当value不存在时赋值)
比如使用 setnx:
root@h121:/usr/redis/bin# ./redis-cli
127.0.0.1:6379> setnx name wzk # 设置值
(integer) 1
127.0.0.1:6379> setnx name wzk-2 # 值存在则无法设置
(integer) 0
127.0.0.1:6379> get name # 还是刚才的
"wzk"
127.0.0.1:6379>
执行结果如下图:
list类型
list列表可以存储有序、可重复的元素,获取头部或者尾部附近的记录是最快的。 双向链表。头尾极快,随机索引/删除成本随长度线性。主流做 消息队列、时间线。
常见操作
表1
表2
- LPUSH queue v1 v2 / RPUSH:左 / 右入队
- LPOP queue / RPOP:出队
- BLPOP queue 5:阻塞弹出;可做“消费者端拉”
- LRANGE queue 0 9:分页拉取
- LTRIM queue 0 99:维持有限长度(环形日志)
- LMOVE q1 q2 LEFT RIGHT:原子转移元素
PS:长列表 LRANGE 0 -1 会堵塞线程;改用 分页 或 Stream。
应用场景
可以作为栈或者队列使用,列表有序。 可以用做各种表:比如用户表、商品表等:
127.0.0.1:6379> lpush list 1 2 3 9 4 5 # 生成列表
(integer) 6
127.0.0.1:6379> lrange list 1 10 # 遍历列表
1) "4"
2) "9"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lpop list # 从左边取一个
"5"
127.0.0.1:6379> lpop list
"4"
127.0.0.1:6379> lpop list
"9"
127.0.0.1:6379>
set 类型
Set:无序、唯一 无序、去重,底层整数集合/哈希表自动切换。
常见操作
- SADD tag:redis u1 u2:添加成员
- SMEMBERS tag:redis:全量取出
- SISMEMBER tag:redis u1:判断成员
- SRANDMEMBER key [count] / SPOP:随机抽样 / 弹出
- SUNION / SINTER / SDIFF:并集、交集、差集(批量写到 …STORE)
- SSCAN:分批遍历
场景有:好友列表、去重集合、抽奖摇号。
应用场景
适用于不能够重复且不需要顺序的场景 比如:关注的用户列表,进行随机抽奖
127.0.0.1:6379> sadd set:1 a b c d e f g # 写入set
(integer) 7
127.0.0.1:6379> smembers set:1 # 查看set中的值
1) "c"
2) "b"
3) "d"
4) "f"
5) "a"
6) "g"
7) "e"
127.0.0.1:6379> srandmember set:1 # 随机一个set中的值
"d"
127.0.0.1:6379> srandmember set:1
"e"
127.0.0.1:6379> srandmember set:1
"b"
127.0.0.1:6379> srandmember set:1
"e"
127.0.0.1:6379> srandmember set:1
"f"
127.0.0.1:6379>
sortedset (zset)类型
SortedSet(ZSet)有序集合:元素本身是无序不重复的,每个元素关联一个分数,可按分数排序,分数可重复。 value+score。既能排名,又能按分数检索。
常见操作
表1
表2
- ZRANGE rank 0 9 WITHSCORES / ZREVRANGE:正 / 逆序排行
- ZRANGEBYSCORE rank 80 100:分数区间检索
- ZINCRBY rank 5 user1:增量更新分数
- ZREM rank user1 / ZREMRANGEBYRANK rank 0 9:删成员 / 删区间
- ZCOUNT rank 80 100:区间计数
- ZSCAN:游标遍历大排行榜
场景有:积分榜、实时热搜、延时队列(score=时间戳)。
应用场景
可以按照分数值排序,适用于各种排行榜。 比如:点击排行榜、销量排行榜、关注排行榜等等
127.0.0.1:6379> zadd hit 100 item1 20 item2 30 item3 # zset
(integer) 3
127.0.0.1:6379> zcard hit
(integer) 3
127.0.0.1:6379> zscore hit item3
"30"
127.0.0.1:6379> zrevrange hit 0 -1 # 遍历zset
1) "item1"
2) "item3"
3) "item2"
127.0.0.1:6379>
hash类型
Redis Hash 是一个 string 类型的 field 和 value 的映射表,它提供字段和字段值的映射。
适合存储 同一主键下多字段,如用户资料。单字段 ≤ 4 KB 且字段数不宜过大(万级别以上会退化)。
常见操作
- HSET u:1001 name "康康" age 27:批量写;>= 4.x HMSET 已弃用
- HGET u:1001 name / HGETALL u:1001:取字段 / 取整条
- HINCRBY u:1001 points 10:增量积分
- HEXISTS HLEN HDEL:字段存在、字段数、删字段
- HRANDFIELD key [count WITHVALUES]:随机字段抽样;做广告轮播
应用场景
对象的存储,表数据的映射
127.0.0.1:6379> hmset user01 name wzk age 18 password 123 # hash对象
OK
127.0.0.1:6379> hgetall user01 # 取出对象中的内容
1) "name"
2) "wzk"
3) "age"
4) "18"
5) "password"
6) "123"
127.0.0.1:6379> hget user01 name # 获取对象的名字
"wzk"
127.0.0.1:6379>