Redis 命令小记
Redis 是一个文本 / 二进制数据库(textual / binary database), 全名 Remote Dictionary Server
Redis 的优点
- 单线程, 避免线程切换和锁机制的性能损耗
- 可持久化, 支持 RDB 和 AOF 两种方式
- 支持 lua 脚本, 并支持原子操作和事务. Redis 事务是一组命令, 要么都执行, 要么全不执行, 命令在运行期间发生错误, 不会自动回滚
- Redis 支持事务, 但定义与 SQL 不同 . Redis 保证事务中的命令会按顺序执行 , 且执行期间不会被其他请求插入. 目前 Lua 脚本是更好的选择
- Redis 不支持回滚.
- 开始阶段执行错误, 就不再执行; 中间阶段, 语法正确但操作错误, Redis 会执行完所有命令, 错误的报错, 正确的照样生效 .
- 支持主从复制(Master-Slave)、高可用集群(Sentinel)
- 支持管道 (将多个命令批量一次性发送到服务器, 然后一次性返回所有结果, 优点是减少网络消耗)
开发者的哲学
| 理由 / Reason | 详细说明 / Detailed Explanation |
|---|---|
| 性能至上 (Performance) | 回滚需要维护复杂的 Undo Log ( 撤销日志 ) 和 MVCC , 这会严重拖慢内存数据库的速度 . Redis 追求极致的轻量和快 . |
| 编程错误 (Programming Error) | Redis 认为 , 运行期间的错误通常是代码写错了 ( 如把 Key 当 List 用 ) . 这种问题应该在开发环境解决 , 而不是靠数据库回滚来弥补 . |
| 原子性定义 (Atomicity) | Redis 对原子性的定义是:命令执行过程不被中断 . 只要它保证了执行顺序 and 排他性 , 它就认为自己完成了原子任务 . |
CLI 命令
安装好 redis 后, 会有如下命令: redis-cli, redis-server, redis-benchmark, redis-check-dump, redis-check-aof
- redis-cli 执行命令
# 方式 1
redis-cli -h 127.0.0.1 -p 6379
> 127.0.0.1:6379> PING
# 方式 2 (紧接命令, 默认数据 0)
redis-cli SET mykey "Hello, Redis!"
redis-cli GET mykey
- redis-server 和 shell 工具
# 启动 Redis 服务器
redis-server /path/to/redis.conf
# 测试 Redis 性能
redis-benchmark -n 10000 -c 50
# 检查 RDB 文件(Redis 数据库文件)是否有效
redis-check-dump dump.rdb
# 检查 AOF 文件(Append-Only File)是否有效 (--fix 检查并修复)
redis-check-aof --fix mydata.aof
- redis-benchmark 结果查看
> redis-benchmark -n 10000 -c 50
====== 标题 (数据结构) ======
10000 requests completed in 1.01 seconds # 发送了 10,000 个请求, 请求完成的时间 1.01 秒
50 parallel clients # 表示同时有 50 个客户端在发起请求
3 bytes payload # 表示每个请求的负载大小
keep alive: 1
99.65% <= 1 milliseconds # 表示 99.65% 的请求在 1 毫秒内完成。(大多数请求的性能)
99.92% <= 2 milliseconds # 表示 99.92% 的请求在 2 毫秒内完成。(大多数请求的性能)
100.00% <= 2 milliseconds # 表示所有请求都在 2 毫秒内完成。(所有请求的响应时间, 最后一个百分比含义不一样)
57142.86 requests per second # 表示 Redis 每秒能够处理约 57,143 个请求
更低的响应时间和高并发处理能力通常意味着 Redis 的性能良好。
基本数据类型
Redis 5 种常用数据类型,包括字符串、哈希表、列表、集合和有序集合
- 字符串: 简单数据。
- 哈希: 存储对象。
- 列表: 有序集合。
- 集合: 不重复元素集合。
- 有序集合: 具有分数的元素集合。
其他类型:
- GEO: {A: (120.3, 30.5) } (附近的商铺)
- BitMap: 010101011 (用户签到)
- HyperLogLog: 101010101 (UV统计)
- 等等
数据库清空命令
FLUSHDB:清空当前数据库的所有键FLUSHALL:清空所有数据库的所有键
说明:
- FLUSH 意味着"清空"或"冲洗",用于移除内存中的所有数据
- DROP: 可能会引起误解,认为是删除整个数据库而不仅是清空。
- DELETE ALL: 可能会被理解为逐条删除所有数据,而 FLUSHDB 则明确表示一次性清空
- TRUNCATE: 强调的是清空数据而保留结构,用于关系型数据库表
Redis 是一个键值存储内存数据库,FLUSH 更符合 Redis 的设计理念, 强调快速清空。
基本操作命令
键值检查
KEYS pattern # 查找匹配模式的键
EXISTS key # 检查键是否存在
ping # 检查服务器连接
info # 获取服务器信息
TYPE key # 获取键的数据类型
DEL key # 删除指定键
EXPIRE key 10 # 指定过期时间
TTL key # 查看过期时间
数据类型操作
字符串操作
最简单的存储类型, value 是字符串, 但根据字符串的格式不同, 可分为 string, int, float 三类, 不论是哪种, 底层都是字节数组形式存储, 只不过编码方式不同;
字符串类型的最大空间不能超过 512MB
SET key value # 设置字符串值
GET key # 获取字符串值
MSET k1 v1 k2 v2
MGET k1 k2
INCR key # 将值加1
INCRBY key 2 # 将值加指定步长
INCRBYFLOAT k 2.2 # 将值加指定步长
SETNX # 已存在不执行 not exist
SETEX key 10 value # 指定过期时间, 设置值
SET key value ex 10 # 和上条命令相等
- key 的结构
Redis 允许多个单词形成层级结构, 多个单词用 : 隔开, 格式:
namespace:project:type:id
常用的 type: string, int, float
哈希表操作
HSET key field value # 设置哈希表字段的值
HGET key field # 获取哈希表字段的值
HMSET key field1 value f2 v2 # 获取哈希表字段的值
HMGET key field1 f2 # 获取哈希表字段的值
HGETALL key # 获取哈希表所有字段和值
HKEYS key # 获取哈希表所有字段
HVALS key # 获取哈希表所有值
HINCRBY room:user:007 age -8 # 让一个hash类型的字段值自增指定的步长
(integer) 1 # 设置成功
HSETNX room:user:007 sex female # set when not exist field
(integer) 0 # 设置失败
列表操作
与 java 中的 LinkedList 功能类似, 是一个双向链表结构
可用来做: 模拟栈, 模拟队列, 构造阻塞队列 (出队采用 BLPOP 或 BRPOP)
LPUSH mylist value # 将值插入列表头部
LRANGE mylist 0 -1 # 获取列表所有元素
LPOP mylist # 移除并返回列表第一个元素
BLPOP mylist 10 # 和 LPOP 类似, 同时在没有元素时等待指定时间 (如 10s) 而不是直接返回 nil
集合操作
与 java 中的 HashSet 功能类似, 可看作 value 为 null 的 HashMap
常用来做: 关注列表, 共同好友, 是否好友 等功能
SADD myset member # 添加集合成员
SMEMBERS myset # 获取集合所有成员
SISMEMBER myset member # 判断元素是否为集合成员
有序集合操作
可排序的 set 集合, 与 java 中的 TreeSet 的功能有些类似;
每个 SortedSet 元素都带有一个 score 属性, 可基于 score 属性排序; 常用来实现排行榜功能
底层实现是一个跳表加哈西表 (SkipList + HashTable)
ZADD myzset score member # 添加成员到有序集合
ZRANGE myzset 0 -1 # 获取有序集合所有成员
ZREM myzset member # 移除有序集合成员
### Z + REV + [_] 等于逆序, 默认顺序
ZREVRANGE myzset 0 -1
高级特性
事务操作
MULTI # 开始事务
EXEC # 提交事务
DISCARD # 回滚事务
示例:
# 提交
MULTI
HSET user:1001 name "张三" age 30 email "zhangsan@example.com"
HSET user:1002 name "李四" age 28 email "lisi@example.com"
EXEC
# 回滚
MULTI
LPUSH orders:pending "订单ID:20230901 金额:299.00"
SADD users:active 1001 1002
ZADD orders:timestamps 1661980800 "2023-09-01T08:00:00"
DISCARD
发布/订阅
PUBLISH channel message # 发送消息
SUBSCRIBE channel # 订阅频道
键过期
EXPIRE key seconds # 设置键过期时间
TTL key # 获取键剩余生存时间
数据库遍历
SCAN cursor # 迭代遍历数据库中的键
SCAN 0 MATCH *key
SCAN 0 COUNT 10
提高生产 redis 性能,需要关注的 23 个 redis 命令
lpush,hgetall,rpop,keys,brpop,hscan,subscribe,xreadgroup,pexpireat,hkeys,psubscribe,xinfo,unsubscribe,wait,rpush,scan,flushdb,sscan, xgroup,publish,lpop,spop,sdiff,smembers,multi,exec,blpop,punsubscribe,configSet,configGet,BLMOVE ,hvals
# 阻塞或遍历类命令:
keys, scan, sscan, hscan, flushdb, hgetall, hkeys, hvals, smembers, brpop, blpop, BLMOVE, wait
# 列表操作命令:
lpush, rpush, lpop, rpop
# 集合操作命令:
spop, sdiff
# 发布订阅相关命令:
subscribe, psubscribe, unsubscribe, punsubscribe, publish
# Stream及消费组相关命令:
xreadgroup, xinfo, xgroup
# 事务相关命令:
multi, exec
# 配置操作命令:
configSet, configGet
# 其他:
pexpireat
小应用
Redis 的主要应用场景有: 缓存 (数据查询、短链接、新闻内容、商品内容等)、分布式会话 (Session)、聊天室的在线好友列表、任务队列 (秒杀、抢购、12306等)、应用排行榜、访问统计、数据过期处理(能精确到毫秒)
1. 短信登录
# 生成6位随机验证码并存储(手机号作为key)300秒
SETEX login:sms:13812345678 300 "123456"
# 获取验证码
GET login:sms:13812345678 # 返回 "123456"(若未过期)或 nil(已过期)
# 验证成功后删除(防止重复使用)
DEL login:sms:13812345678
# 存储Token(token id为键)
SETEX user:token:8abxjex 3600 "abcdef123456"
# 使用Hash存储用户信息(无过期时间)
HSET login:user:token:8abxjex name "Alice" age 25 email "alice@example.com"
# 获取用户全部信息
HGETALL login:user:token:8abxjex
# 返回:
# 1) "name"
# 2) "Alice"
# 3) "age"
# 4) "25"
# 5) "email"
# 6) "alice@example.com"

4772

被折叠的 条评论
为什么被折叠?



