redis-常用操作

30 阅读5分钟

一、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 脚本。限制:仅能终止未执行过写操作的脚本(如仅执行 GETKEYS 等读命令的脚本)。如果脚本已执行过写操作(如 SETDEL),则无法通过 SCRIPT KILL 终止(避免破坏原子性),此时需重启 Redis。

语法

SCRIPT KILL