package com.vincent.rsf.server.common.service; import com.vincent.rsf.common.utils.Serialize; import com.vincent.rsf.server.common.config.RedisProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.util.Date; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; /** * redis tools * Created by vincent on 2023-03-13 */ @Slf4j @Service public class RedisService { private static final String LINK = "."; protected JedisPool pool; Integer index = 0; public Boolean initialize = true; @Autowired private RedisProperties redisProperties; public JedisPool getPool() { if (null == this.pool) { JedisPoolConfig config = new JedisPoolConfig(); config.setTestOnBorrow(false); this.index = redisProperties.getIndex(); this.pool = new JedisPool(config , redisProperties.getHost() , redisProperties.getPort() , redisProperties.getTimeout() , redisProperties.getPassword() ); } return this.pool; } public Jedis getJedis(){ try{ Jedis jedis = this.getPool().getResource(); if(this.index != jedis.getDB()) { jedis.select(this.index); } return jedis; } catch (Exception e){ log.error(this.getClass().getSimpleName(), e); } return null; } private T withJedis(Function action) { Jedis jedis = this.getJedis(); if (jedis == null) { return null; } try (jedis) { return action.apply(jedis); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } return null; } private void withJedisVoid(Consumer action) { Jedis jedis = this.getJedis(); if (jedis == null) { return; } try (jedis) { action.accept(jedis); } catch (Exception e) { log.error(this.getClass().getSimpleName(), e); } } // key - object ---------------------------------------------------------------------------------------------------------- public String set(String flag, String key, Object value) { if(!this.initialize) { return null; } if(null == value) { this.delete(flag, key); return null; } return withJedis(jedis -> jedis.set((flag + LINK + key).getBytes(), Serialize.serialize(value))); } public String set(String flag, String key, Object value, Integer seconds) { if(!this.initialize) { return null; } if (null == value) { this.delete(flag, key); return null; } return withJedis(jedis -> jedis.setex((flag + LINK + key).getBytes(), seconds, Serialize.serialize(value))); } public T get(String flag, String key) { if(!this.initialize) { return null; } return withJedis(jedis -> { byte[] bytes = jedis.get((flag + LINK + key).getBytes()); if(bytes == null || bytes.length == 0 ) { return null; } return (T) Serialize.unSerialize(bytes); }); } public Long delete(String flag, String key) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.del((flag + LINK + key).getBytes())); } public Long clear(String flag) { if(!this.initialize) { return null; } this.setValue(flag, "CLEARING", "true"); return withJedis(jedis -> { Object returnValue = jedis.eval("local keys = redis.call('keys', ARGV[1]) for i=1,#keys,1000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return #keys",0,flag + LINK + "*"); return Long.parseLong(String.valueOf(returnValue)); }); } // 为已存在的key设置过期时间 - 秒 public void setExpire(String flag, String key, int seconds){ if(!this.initialize) { return; } withJedisVoid(jedis -> { jedis.expire((flag + LINK + key).getBytes(), seconds); }); } // 为已存在的key设置过期时间 - 具体到时间戳 (秒) public void setExpireAt(String flag, String key, Date toTime){ if(!this.initialize) { return; } withJedisVoid(jedis -> { jedis.expireAt((flag + LINK + key).getBytes(), toTime.getTime()/1000); }); } // 获取过期剩余时间(秒) ttl == -1 没有设置过期时间; ttl == -2 key不存在 public Long getExpire(String flag, String key) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.ttl((flag + LINK + key).getBytes())); } // key - string ---------------------------------------------------------------------------------------------------------- public String setValue(String flag, String key, String value) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.set(flag + LINK + key, value)); } public String setValue(String flag, String key, String value, Integer seconds) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.setex(flag + LINK + key, seconds , value)); } public String getValue(String flag, String key) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.get(flag + LINK + key)); } public Long deleteValue(String flag, String... key) { if(!this.initialize) { return null; } return withJedis(jedis -> { String[] keys = new String[key.length]; for(int i=0;i { Object returnValue = jedis.eval("return redis.call('del', unpack(redis.call('keys', ARGV[1])))",0,flag + LINK + "*"); return Long.parseLong(String.valueOf(returnValue)); }); } public void setValueExpire(String flag, String key,int seconds){ if(!this.initialize) { return; } withJedisVoid(jedis -> { jedis.expire((flag + LINK + key).getBytes(), seconds); }); } public void setValueExpireAt(String flag, String key,Date atTime){ if(!this.initialize) { return; } withJedisVoid(jedis -> { jedis.expireAt((flag + LINK + key).getBytes(), atTime.getTime()/1000); }); } // hash ---------------------------------------------------------------------------------------------------------- public Long setMap(String name, String key, Object value) { if(!this.initialize) { return null; } if(value == null){ deleteMap(name,key); return null; } return withJedis(jedis -> jedis.hset(name.getBytes(), key.getBytes(), Serialize.serialize(value))); } public T getMap(String name, String key) { if(!this.initialize) { return null; } return withJedis(jedis -> { byte[] bytes = jedis.hget(name.getBytes(), key.getBytes()); if (bytes == null || bytes.length == 0) { return null; } return (T) Serialize.unSerialize(bytes); }); } public Set getMapKeys(String name) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.hkeys(name)); } public Long deleteMap(String name, String... key) { if(!this.initialize) { return null; } return withJedis(jedis -> { String[] keys = new String[key.length]; System.arraycopy(key, 0, keys, 0, key.length); return jedis.hdel(name, keys); }); } public Long clearMap(String name) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.del(name)); } public void setMapExpire(String name,int seconds){ if(!this.initialize) { return; } withJedisVoid(jedis -> { jedis.expire(name.getBytes(), seconds); }); } public void setMapExpireAt(String name,Date atTime){ if(!this.initialize) { return; } withJedisVoid(jedis -> { jedis.expireAt(name.getBytes(), atTime.getTime()/1000); }); } // mq ---------------------------------------------------------------------------------------------------------- // 列表末尾添加元素 public Long push(String name, Object value) { if(!this.initialize) { return null; } if(value == null){ return null; } return withJedis(jedis -> jedis.rpush(name.getBytes(), Serialize.serialize(value))); } // 获取列表头部元素 && 删除 public T pop(String name) { if(!this.initialize){ return null; } return withJedis(jedis -> { byte[] bytes = jedis.lpop(name.getBytes()); if(bytes == null || bytes.length == 0) { return null; } return (T) Serialize.unSerialize(bytes); }); } // 删除 public Long deleteList(String name) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.del(name)); } public void setListExpire(String name, int seconds){ if(!this.initialize) { return; } withJedisVoid(jedis -> { jedis.expire(name.getBytes(), seconds); }); } public void setListExpireAt(String name, Date atTime){ if(!this.initialize) { return; } withJedisVoid(jedis -> { jedis.expireAt(name.getBytes(), atTime.getTime()/1000); }); } // count ---------------------------------------------------------------------------------------------------------- public Long incr(String key) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.incr("COUNT." + key)); } public Long decr(String key) { if(!this.initialize) { return null; } return withJedis(jedis -> jedis.decr("COUNT." + key)); } }