Redis学习笔记16:基于spring data redis及lua脚本通过TTL查询永久有效的key

Redis做为一个缓存服务,个人觉得不应该存在有永久有效的数据,要检索一个存在很久的redis服务器中存在哪些永久有效的key,可以通过lua脚本的方式实现;

一个对springboot redis框架进行重写,支持lettuce、jedis、连接池、同时连接多个集群、多个redis数据库、开发自定义属性配置的开源SDK

xml 复制代码
<dependency>
    <groupId>io.github.mingyang66</groupId>
    <artifactId>emily-spring-boot-redis</artifactId>
    <version>4.4.0</version>
</dependency>

GitHub地址:https://github.com/mingyang66/spring-parent

一、TTL过期时间为-1的lua脚本
lua 复制代码
local success, result = pcall(function()
    -- 获取所有键
    local keys = redis.call('KEYS','*')
    -- 初始化表
    local result = {}
    for i, key in ipairs(keys) do
        -- 获取键的过期时间
        local ttl = redis.call('TTL', key)
        if ttl == -1 then
            -- 在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.
            table.insert(result, key)
        end
    end
    return result
end)

if success then
    return result
else
    return result
end

首先通过KEYS指令查询所有的键值,然后循环列表,通过TTL指令获取键值的过期时间,如果过期时间为-1,则将键值添加进列表,最后返回给客户端。

二、spring data redis实现脚本加载并执行
java 复制代码
    /**
     * @param redisTemplate redis 模板工具类
     * @return TTL为-1的键集合列表
     */
    public static List<String> ttlKeys(RedisTemplate redisTemplate) {
        if (StringUtils.isEmpty(LUA_SCRIPT_TTL_KEYS)) {
            LUA_SCRIPT_TTL_KEYS = getLuaScript("META-INF/scripts/ttl_keys.lua");
        }
        RedisScript<List> script = RedisScript.of(LUA_SCRIPT_TTL_KEYS, List.class);
        return (List<String>) redisTemplate.execute(script, SerializationUtils.stringSerializer(), SerializationUtils.stringSerializer(), null);
    }

   public static StringRedisSerializer stringSerializer() {
        return new StringRedisSerializer();
    }

通过lua脚本查询键值数据时需指定key-value的序列化方式为StringRedisSerializer,否则会采用默认的Jackson2JsonRedisSerializer序列化方式,查询结果返回给java端后会抛出序列化异常。

三、控制器
java 复制代码
    @GetMapping("ttl")
    public List<String> ttl(){
        List<String> list = LuaScriptTools.ttlKeys(redisTemplate);
        return list;
    }
相关推荐
Wang's Blog40 分钟前
Java 接入Redis: Redis简介与NoSQL定位
java·服务器·redis
程序猿乐锅44 分钟前
【黑马点评 | 第四篇】Redis缓存雪崩
java·数据库·spring boot·redis·缓存
Wang's Blog2 小时前
Java 接入Redis: 五大数据类型与存储结构选型
java·服务器·redis
Wang's Blog2 小时前
Java 接入Redis: 字符串与哈希类型操作命令
java·服务器·redis
Nano叶落19 小时前
几十万个-key-扫不过来?-bigkeys、SCAN、RDB-离线分析三步定位最该清的-Big-Key
redis
shark-chili20 小时前
关于AI辅助编程的认知
数据库·人工智能·redis·macos·缓存
heimeiyingwang21 小时前
【中台·技术篇】缓存中台建设:Redis 集群统一管理与多级缓存架构
redis·中台
晚安日记wanna1 天前
一条 SMEMBERS 干瘫 Redis 节点:单线程的真正边界在哪
redis·后端·面试
程序猿乐锅1 天前
【黑马点评 | 第二篇】Redis 缓存更新策略与商铺缓存实现
java·网络·redis·spring·mybatis
MacroZheng1 天前
Redis官方发布高颜值可视化工具,功能更是强的离谱!
java·redis·后端