编写 Redis 脚本令缓存性能更上一层楼(令 redis 脚本)
Redis(REmote DIctionary Server)是一种开源的、支持主从复制、支持多种数据类型的 Key-Value 存储,常被用作数据库 Cache 以提升性能。本文旨在介绍如何利用 Redis 脚本大幅提升缓存性能。
### 编写 Redis 脚本
Redis 拥有完整的脚本功能,支持两种脚本语言:Lua 和 Redis 自家的 EVAL 命令。下面介绍如何编写 Lua 脚本,提升 Redis 缓存性能:
“`lua
local cached_user_id = redis.call(‘get’, ‘user_online’)
if not cached_user_id then
local user_id = redis.call(‘get’, ‘user_id’)
if user_id then
redis.call(‘set’, ‘user_online’, user_id, ‘EX’, 24*60*60)
cached_user_id = user_id
end
end
return cached_user_id
上面的代码逻辑很简单,它先检查 user_online 键是否在缓存中,如果没有,则检查 user_id 这个 Key 。若晚都存在,就会设置 key user_online 并设置一个 24 小时的过期时间, 使其始终有效。
### 使用 EVALSHA 后的性能提升
在上文介绍的缓存中,经常会使用 Redis 的 EVAL 命令去执行 Lua 脚本,但是也存在一些问题,每次执行都会让 Redis 对脚本进行重复性的编译。而 EVALSHA 命令就可以帮助我们解决这个问题,它用来执行已经编译过的 Lua 脚本,从而大幅提升缓存性能。
使用 EVALSHA 时,需要先用 EVAL 将脚本编译,得到一个 SHA1 校验和,如:
```lua> eval "return 'Hallo world'" 0
"9d06b8759cf68b7a3922acd20bac2c86206aef1f"
上面这一行代码会将 EVAL 的结果赋值给 9d06b8759cf68b7a3922acd20bac2c86206aef1