package xiaozhi.common.redis; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Component; import jakarta.annotation.Resource; import xiaozhi.common.utils.ResourcesUtils; /** * Redis工具类 * Copyright (c) 人人开源 All rights reserved. * Website: https://www.renren.io */ @Component public class RedisUtils { @Resource private RedisTemplate redisTemplate; @Autowired private ResourcesUtils resourceUtils; /** * 默认过期时长为24小时,单位:秒 */ public final static long DEFAULT_EXPIRE = 60 * 60 * 24L; /** * 过期时长为1小时,单位:秒 */ public final static long HOUR_ONE_EXPIRE = (long) 60 * 60; /** * 过期时长为6小时,单位:秒 */ public final static long HOUR_SIX_EXPIRE = 60 * 60 * 6L; /** * 不设置过期时长 */ public final static long NOT_EXPIRE = -1L; public Long increment(String key, long expire) { Long increment = redisTemplate.opsForValue().increment(key, 1L); if (expire != NOT_EXPIRE) { expire(key, expire); } return increment; } public Long increment(String key) { return redisTemplate.opsForValue().increment(key, 1L); } public Long decrement(String key) { return redisTemplate.opsForValue().decrement(key, 1L); } public void set(String key, Object value, long expire) { redisTemplate.opsForValue().set(key, value); if (expire != NOT_EXPIRE) { expire(key, expire); } } public void set(String key, Object value) { set(key, value, DEFAULT_EXPIRE); } public Object get(String key, long expire) { Object value = redisTemplate.opsForValue().get(key); if (expire != NOT_EXPIRE) { expire(key, expire); } return value; } public Object get(String key) { return get(key, NOT_EXPIRE); } public void delete(String key) { redisTemplate.delete(key); } public void delete(Collection keys) { redisTemplate.delete(keys); } public Object hGet(String key, String field) { return redisTemplate.opsForHash().get(key, field); } public Map hGetAll(String key) { HashOperations hashOperations = redisTemplate.opsForHash(); return hashOperations.entries(key); } public void hMSet(String key, Map map) { hMSet(key, map, DEFAULT_EXPIRE); } public void hMSet(String key, Map map, long expire) { redisTemplate.opsForHash().putAll(key, map); if (expire != NOT_EXPIRE) { expire(key, expire); } } public void hSet(String key, String field, Object value) { hSet(key, field, value, DEFAULT_EXPIRE); } public void hSet(String key, String field, Object value, long expire) { redisTemplate.opsForHash().put(key, field, value); if (expire != NOT_EXPIRE) { expire(key, expire); } } public void expire(String key, long expire) { redisTemplate.expire(key, expire, TimeUnit.SECONDS); } public void hDel(String key, Object... fields) { redisTemplate.opsForHash().delete(key, fields); } public void leftPush(String key, Object value) { leftPush(key, value, DEFAULT_EXPIRE); } public void leftPush(String key, Object value, long expire) { redisTemplate.opsForList().leftPush(key, value); if (expire != NOT_EXPIRE) { expire(key, expire); } } public Object rightPop(String key) { return redisTemplate.opsForList().rightPop(key); } /** * 清空所有 Redis 数据库中的所有键 */ public void emptyAll() { // Lua 脚本 FLUSHALL是redis清空所有库的命令 String luaScript =resourceUtils.loadString("lua/emptyAll.lua"); // 创建 DefaultRedisScript 对象 DefaultRedisScript redisScript = new DefaultRedisScript<>(); redisScript.setScriptText(luaScript); // 设置 Lua 脚本内容 redisScript.setResultType(Void.class); // 设置返回值类型 // 执行 Lua 脚本 List keys = Collections.emptyList(); // 如果脚本不依赖 key,可以传入空列表 redisTemplate.execute(redisScript, keys); } /** * 获取在redis指定key的值,如果值为空,着设置key的默认值 * @param key redis的key * @param defaultValue 默认值 * @param expiresInSecond 过期时间 * @return 返回key的值 */ public String getKeyOrCreate(String key, String defaultValue,Long expiresInSecond) { // Lua 脚本 String luaScript = resourceUtils.loadString("lua/getKeyOrCreate.lua"); DefaultRedisScript redisScript = new DefaultRedisScript<>(); redisScript.setScriptText(luaScript); redisScript.setResultType(String.class); // 执行 Lua 脚本 List keys = Collections.singletonList(key); return redisTemplate.execute(redisScript, keys, defaultValue,expiresInSecond); } }