先装好Redis,用docker起一个最省事:
docker run -d --name redis -p 6379:6379 redis:7-alpine
连进去:`redis-cli` 或者 `docker exec -it redis redis-cli`。
String – 最基础,存啥都行
SET/GET 是核心。value最大512MB,存JSON、序列化对象、计数器都行。
SET user:1 "zhangsan"
GET user:1
SET login_count 0
INCR login_count // 1
INCRBY login_count 5 // 6
注意:`SET` 会覆盖已有key,想只在key不存在时设值用 `SETNX`,做分布式锁必备。
SETNX lock:order 1 // 返回1表示成功获取锁
DEL lock:order // 用完释放
过期时间直接加在SET里,不用单独EXPIRE:
SET code:123456 "verify" EX 300 // 5分钟过期
List – 消息队列、最新消息列表
底层是链表,头尾操作O(1),按索引查O(n)。适合做简单队列。
LPUSH logs "error: timeout" // 左插
RPUSH logs "info: startup" // 右插
LPOP logs // 从左弹出
LRANGE logs 0 -1 // 看所有元素
做固定长度的最新消息列表,用 LTRIM 裁剪:
LPUSH recent_posts "post1"
LPUSH recent_posts "post2"
LTRIM recent_posts 0 9 // 只保留最近10条
BLPOP/BRPOP 阻塞弹出,实现生产者-消费者模式。队列空时阻塞等待,避免轮询。
BLPOP task_queue 0 // 0表示一直等
Hash – 存对象,比String省内存
存用户信息、商品详情,比把整个对象序列化成String更灵活,可以单独更新某个字段。
HSET user:1001 name "张三" age 28 city "北京"
HGET user:1001 name
HGETALL user:1001
HINCRBY user:1001 age 1 // 年龄+1
注意:HGETALL 在字段多时慎用,数据量大建议用 HSCAN 分批取。单个Hash字段数建议不超过1000,太多考虑拆成多个key。
Set – 去重、交集、并集
无序、元素唯一。做标签系统、共同好友、抽奖去重。
SADD tags:article:1 "redis" "database" "nosql"
SMEMBERS tags:article:1
SISMEMBER tags:article:1 "redis" // 检查是否存在
计算共同关注:
SADD follow:userA "userB" "userC"
SADD follow:userB "userA" "userC"
SINTER follow:userA follow:userB // 返回userC
抽奖场景,用 SPOP 随机弹出:
SADD lottery "player1" "player2" ... "player100"
SPOP lottery 3 // 随机抽3个,移除
SRANDMEMBER 只取不删,适合预览。
Sorted Set – 排行榜、延时队列
每个元素带一个score,按score排序。zset底层是跳表,插入和查询都是O(logN)。
ZADD leaderboard 100 "user1" 85 "user2" 200 "user3"
ZRANGE leaderboard 0 -1 WITHSCORES // 按分数从小到大
ZREVRANGE leaderboard 0 -1 WITHSCORES // 从大到小,排行榜用这个
ZINCRBY leaderboard 10 "user1" // user1加10分
分页查排行榜:
ZREVRANGE leaderboard 0 9 WITHSCORES // 前10名
ZREVRANK leaderboard "user1" // 查user1排名,从0开始
延时队列:score存时间戳,轮询ZRANGEBYSCORE取到期的任务。
ZADD delay_queue 1699000000 "task1"
ZRANGEBYSCORE delay_queue -inf 1699000001 // 取已到期的
ZREM delay_queue "task1" // 处理完删除
注意:ZRANGEBYSCORE 在大数据量时性能问题,建议加LIMIT分批。
实际场景组合用
用户登录session:Hash存用户信息,String存token,Set存在线用户ID。
SET token:abc123 user:1001 EX 3600
HSET session:user:1001 last_ip "192.168.1.1" login_time "2024-01-01"
SADD online_users "user:1001"
限流:用String计数+过期,或者用Sorted Set做滑动窗口。
INCR api:limit:user:1001
EXPIRE api:limit:user:1001 60 // 每分钟一次
如果服务器部署在雨云,记得开持久化。雨云的Redis实例稳定性不错,我跑过单节点QPS 2w+没出过问题,性价比比自建高,不用操心备份和内存监控。
几个坑注意
– KEYS 命令别在生产用,数据量大直接卡死。用 SCAN 代替。
– FLUSHALL 会删所有库,除非你确定要清库。
– 单个key的value别超过10MB,虽然上限512MB,但大key会导致网络延迟和持久化阻塞。
– 线上不要用 MONITOR,它会吃掉大量CPU。
记不住命令?记住这几个最常用的:SET/GET、HSET/HGET、LPUSH/LPOP、SADD/SMEMBERS、ZADD/ZRANGE。其他用到再查。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容