一、redis基础类型
Redis 是单线程执行命令的,因此命令是原子的。
在此基础上,还提供 事务(Transaction) 、Lua 脚本 等机制,用于实现多命令的原子操作。
下面将会介绍一下,redis的一些基本操作,以及其拓展用法。
1.1 string
最基本的数据类型,可以存储文本、数字、二进制数据等。
一个 key 对应一个 value。
常用命令:
SET key value # 设置值
GET key # 获取值
INCR key # 自增(值必须是整数)
APPEND key value # 往key后面追加内容
拓展用法tips:
除此之外还有SETNX(set if not exists):
SETNX key value:当 key 不存在时设置成功(返回 1),否则失败(返回 0)。- Redis 单线程保证命令原子性,因此不会有并发修改同一键的竞争问题。
- 可用于分布式锁实现。
更安全的方式是:
SET key value NX PX ttl
含义:
NX:仅当 key 不存在时设置。PX ttl:设置过期时间(毫秒)。
相比 SETNX + EXPIRE,这种方式是单命令原子操作,避免了中途失败的风险。
1.2 List
一个双向链表结构,可以从头(left)或尾(right)插入或弹出元素。元素有顺序,可重复。
并且支持索引访问,从零开始,也支持从尾部便利(-1表示最后一个元素)
常用命令:
LPUSH key value # 从左侧插入
RPUSH key value # 从右侧插入
LPOP key # 从左侧弹出
RPOP key # 从右侧弹出
LRANGE key 0 -1 # 获取整个列表
典型用途:
- 实现队列或消息队列(
LPUSH+BRPOP) - 最近访问记录
- 日志流存储
1.3 Hash
类似于一个小型的字典(key-value集合),每个 hash 都包含多个字段和值。
适合存储对象。
常用命令:
HSET user:1001 name Tom
HSET user:1001 age 18
HGET user:1001 name
HGETALL user:1001
HSETNX hash field value # 哈希字段的“局部原子锁”
1.4 Set
无序、不重复元素集合。
自动去重,非常适合做唯一性判断。
常用命令:
SADD key value1 value2 # 添加元素
SMEMBERS key # 查看所有元素
SISMEMBER key value # 判断是否存在
SINTER key1 key2 # 求交集
SUNION key1 key2 # 求并集
SDIFF key1 key2 # 求差集
典型用途:
- 存储好友列表(可做交集运算求共同好友)
- 标签系统(一个用户属于多个标签)
- 去重统计(独立访客UV)
1.5 ZSet
类似于 Set,但每个元素会附带一个分数(score) ,Redis 会按照分数排序。 {key: {score,val},{score,val}, ...}
分数可以是权重、时间戳、积分等。
常用命令:
ZADD rank 100 Tom
ZADD rank 80 Jerry
ZRANGE rank 0 -1 WITHSCORES
ZREVRANGE rank 0 -1 WITHSCORES
ZINCRBY rank 10 Tom # Tom分数+10
典型用途:
- 排行榜(如游戏分数)
- 在线用户检测(按照时间排序)
- 延时任务(用时间戳作为score)
- 按权重或优先级取数据
二、常用的lua指令
- 执行脚本:
EVAL(直接执行)、EVALSHA(通过哈希执行预加载脚本)。 - 管理脚本缓存:
SCRIPT LOAD(预加载脚本)、SCRIPT EXISTS(检查缓存)、SCRIPT FLUSH(清空缓存)。 - 控制执行:
SCRIPT KILL(终止脚本)。
2.1 脚本缓存
1. SCRIPT LOAD
作用:SCRIPT LOAD 用于将 Lua 脚本发送到 Redis 服务器,Redis 会对脚本进行解析并计算其 SHA1 哈希值,然后将脚本缓存到内存中(不执行),预加载后只需传递哈希值(而非完整脚本),减少网络传输开销。
SCRIPT LOAD script
# 返回:"a42059b356c8757077003b854c35f4e554997"(示例哈希值)
SCRIPT LOAD "return redis.call('get', KEYS[1])"
2. SCRIPT EXISTS
作用:检查一个或多个脚本的 SHA1 哈希值是否已被 Redis 缓存。返回一个数组,表示对应的脚本是否被加载过
SCRIPT EXISTS sha1 [sha1 ...]
3.SCRIPT FLUSH
作用:清空 Redis 服务器中所有缓存的 Lua 脚本。
SCRIPT FLUSH [ASYNC|SYNC]
2.2 执行脚本
1. EVAL
EVAL script numkeys key [key ...] arg [arg ...]
# 通过 `redis.call` 调用 Redis 的 `GET` 命令,返回 `user:1001` 的值。
EVAL "return redis.call('get', KEYS[1])" 1 user:1001
-
参数说明:
script:要执行的 Lua 脚本字符串(如"return redis.call('get', KEYS[1])")。numkeys:脚本中使用的key参数的数量(必须正确指定,否则会报错)。key [key ...]:脚本中操作的 Redis 键名(在脚本中通过KEYS[1]、KEYS[2]访问,索引从 1 开始)。arg [arg ...]:脚本中使用的附加参数(在脚本中通过ARGV[1]、ARGV[2]访问,索引从 1 开始)。
2. EVALSHA
作用:EVALSHA 用于执行已通过 SCRIPT LOAD 缓存的脚本,只需传入脚本的 SHA1 哈希值,无需再次传递完整脚本内容。
依赖缓存:如果哈希值对应的脚本未被缓存(如 Redis 重启后缓存清空),会返回错误 NOSCRIPT No matching script. Please use EVAL.,此时需重新执行 SCRIPT LOAD 或直接用 EVAL。
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
2.3 控制操作
1. SCRIPT KILL
作用:终止当前正在执行的 Lua 脚本。限制:仅能终止未执行过写操作的脚本(如仅执行 GET、KEYS 等读命令的脚本)。如果脚本已执行过写操作(如 SET、DEL),则无法通过 SCRIPT KILL 终止(避免破坏原子性),此时需重启 Redis。
语法:
SCRIPT KILL