|
服务器技术:java:redisclient [2020/07/08 18:23] chenjinlian 创建 |
服务器技术:java:redisclient [2020/07/08 18:23] (当前版本) chenjinlian 创建 |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | <p><br/>import java.io.IOException;<br/>import java.util.List;<br/>import java.util.UUID;<br/><br/>import org.slf4j.Logger;<br/>import org.slf4j.LoggerFactory;<br/>import org.springframework.beans.factory.annotation.Autowired;<br/>import org.springframework.beans.factory.annotation.Qualifier;<br/>import org.springframework.beans.factory.annotation.Value;<br/>import org.springframework.stereotype.Component;<br/><br/>import com.fasterxml.jackson.core.JsonProcessingException;<br/>import com.fasterxml.jackson.databind.ObjectMapper;<br/><br/>import redis.clients.jedis.Jedis;<br/>import redis.clients.jedis.JedisSentinelPool;<br/><br/>@Component<br/>public class RedisClient {<br/><br/>    @Autowired<br/>    @Qualifier("jedisSentinelPool")<br/>    private JedisSentinelPool jedisSentinelPool;<br/><br/>    @Value("${redis.key.prefix}")<br/>    private String prefix;<br/><br/>    Logger logger = LoggerFactory.getLogger(RedisClient.class);<br/><br/>    private ObjectMapper objectMapper = new ObjectMapper();<br/><br/>    /**<br/>   * 从Redis缓存获取数据<br/>   * <br/>   * @param redisKey<br/>   * @return<br/>   */<br/>    public Object getObjFromRedis(String redisKey) {<br/>        redisKey = prefix + redisKey;<br/>        Jedis jedis = getJedisResource();<br/>        String jsonStr = null;<br/>        try {<br/>            jsonStr = jedis.get(redisKey);<br/>       } finally {<br/>            if (jedis != null) {<br/>                if (null != jedis)<br/>                    jedis.close();<br/>            }<br/>        }<br/><br/>        if (jsonStr != null) {<br/>            try {<br/>                return objectMapper.readValue(jsonStr, Object.class);<br/>           } catch (IOException e) {<br/>                logger.error("反序列化失败", e);<br/>            }<br/><br/>        }<br/><br/>        return null;<br/>    }<br/><br/>    public <T> T getObjFromRedis(String redisKey, Class<T> clazz) {<br/>        redisKey = prefix + redisKey;<br/>        Jedis jedis = getJedisResource();<br/>        String jsonStr = null;<br/>        try {<br/>            jsonStr = jedis.get(redisKey);<br/>       } finally {<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        if (jsonStr != null) {<br/>            try {<br/>                return objectMapper.readValue(jsonStr, clazz);<br/>           } catch (IOException e) {<br/>                logger.error("反序列化失败", e);<br/>            }<br/>        }<br/><br/>        return null;<br/>    }<br/><br/>    public Long incr(String redisKey) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        Jedis jedis = getJedisResource();<br/>        Long num = null;<br/>        try {<br/>            num = jedis.incr(redisKey);<br/>       } finally {<br/>            // 归还资源<br/>            // jedisPool.returnResource(jedis);<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return num;<br/><br/>    }<br/><br/>    public Long incrBy(String redisKey, int offset) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        Jedis jedis = getJedisResource();<br/>        Long num = null;<br/>        try {<br/>            num = jedis.incrBy(redisKey, offset);<br/>       } finally {<br/>            // 归还资源<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return num;<br/><br/>    }<br/><br/>    public Long decrBy(String redisKey, int offset) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        Jedis jedis = getJedisResource();<br/>        Long num = null;<br/>        try {<br/>            num = jedis.decrBy(redisKey, offset);<br/>       } finally {<br/>            // 归还资源<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return num;<br/><br/>    }<br/><br/>    public Long decr(String redisKey) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        Jedis jedis = getJedisResource();<br/>        Long num = 0L;<br/>        try {<br/>            num = jedis.decr(redisKey);<br/>       } finally {<br/>            // 归还资源<br/>            if(null != jedis)<br/>            jedis.close();<br/>        }<br/><br/>        return num;<br/><br/>    }<br/><br/>    public Jedis getJedisResource() {<br/>        Jedis jedis = null;<br/>        try {<br/>            jedis = jedisSentinelPool.getResource();<br/>            if (jedis != null) {<br/>                return jedis;<br/>            }<br/>       } catch (Exception e) {<br/>            logger.warn("=============Redis Resource Is Not alived====================", e);<br/>            if (jedis != null) {<br/>                // jedisPool.returnBrokenResource(jedis);<br/>                jedis.close();<br/>            }<br/>        }<br/><br/>        return null;<br/>    }<br/><br/>    public String set(String redisKey, String value) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        Jedis jedis = getJedisResource();<br/>        String ret = null;<br/>        try {<br/>            ret = jedis.set(redisKey, value);<br/>       } finally {<br/>            // 归还资源<br/>            // jedisPool.returnResource(jedis);<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return ret;<br/><br/>    }<br/><br/>    public String set(String redisKey, String value, int seconds) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        Jedis jedis = getJedisResource();<br/>        String ret = null;<br/>        try {<br/>            ret = jedis.setex(redisKey, seconds, value);<br/>       } finally {<br/>            // 归还资源<br/>            // jedisPool.returnResource(jedis);<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return ret;<br/><br/>    }<br/><br/>    public Long delete(String redisKey) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        Jedis jedis = getJedisResource();<br/>        Long ret = null;<br/>        try {<br/>            ret = jedis.del(redisKey);<br/>       } finally {<br/>            // 归还资源<br/>            // jedisPool.returnResource(jedis);<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return ret;<br/><br/>    }<br/><br/>    public String set(String redisKey, Long value) {<br/><br/>        return this.set(redisKey, String.valueOf(value));<br/>    }<br/><br/>    public synchronized Long getLong(String redisKey) {<br/>        Long l = null;<br/>        String str = this.get(redisKey);<br/>        if (str != null) {<br/>           l = Long.valueOf(str);<br/>        }<br/>        return l;<br/>    }<br/><br/>    public String get(String redisKey) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        Jedis jedis = getJedisResource();<br/>        String str = null;<br/>        try {<br/>            str = jedis.get(redisKey);<br/>       } finally {<br/>            // 归还资源<br/>            // jedisPool.returnResource(jedis);<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return str;<br/><br/>    }<br/><br/>    /**<br/>   * 一次获取多个<br/>   * <br/>   * @param redisKey<br/>   * @return<br/>   */<br/>    public List<String> mget(String[] redisKey) {<br/><br/>        // redisKey = prefix + redisKey;<br/>        if (redisKey != null) {<br/>            for (int i = 0; i < redisKey.length; i++) {<br/>                redisKey[i] = prefix + redisKey[i];<br/>            }<br/>        }<br/><br/>        Jedis jedis = getJedisResource();<br/>        List<String> str = null;<br/>        try {<br/>            str = jedis.mget(redisKey);<br/>       } finally {<br/><br/>            // 归还资源<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return str;<br/><br/>    }<br/><br/>    public String saveObjToRedis(String redisKey, Object obj, int seconds) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        String value;<br/>        try {<br/>            value = objectMapper.writeValueAsString(obj);<br/>       } catch (JsonProcessingException e) {<br/>            logger.error("json序列化失败", e);<br/>            return "FAIL";<br/>        }<br/><br/>        Jedis jedis = getJedisResource();<br/>        String code = null;<br/>        try {<br/>            code = jedis.setex(redisKey, seconds, value);<br/>       } finally {<br/>            // 归还资源<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return code;<br/>    }<br/><br/>    /**<br/>   * 保存数据到Redis<br/>   * <br/>   * @param redisKey @throws<br/>   */<br/>    public String saveObjToRedis(String redisKey, Object obj) {<br/><br/>        redisKey = prefix + redisKey;<br/><br/>        String value;<br/>        try {<br/>            value = objectMapper.writeValueAsString(obj);<br/>       } catch (JsonProcessingException e) {<br/>            logger.error("json序列化失败", e);<br/>            return "FAIL";<br/>        }<br/><br/>        Jedis jedis = getJedisResource();<br/>        String code = null;<br/>        try {<br/>            code = jedis.set(redisKey, value);<br/>       } finally {<br/>            // 归还资源<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return code;<br/>    }<br/><br/>    public String lock(String lockKey, int seconds) {<br/><br/>        String redisKey = prefix + lockKey;<br/><br/>        String lockedValue = UUID.randomUUID().toString();<br/>        Jedis jedis = getJedisResource();<br/>        try {<br/>            Long result = jedis.setnx(redisKey, lockedValue);<br/><br/>            // 加锁失败<br/>            if (result <= 0) {<br/><br/>                return lockedValue;<br/>            }<br/>            if (result > 0 && seconds > 0) {<br/>                jedis.expire(redisKey, seconds);<br/><br/>            }<br/>            // 归还资源<br/>            // jedisPool.returnResource(jedis);<br/>       } finally {<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return lockedValue;<br/><br/>    }<br/><br/>    public Long unlock(String lockKey, String lockedValue) {<br/><br/>        String redisKey = prefix + lockKey;<br/><br/>        Jedis jedis = getJedisResource();<br/><br/>        try {<br/>            String target = jedis.get(redisKey);<br/><br/>            if (target != null && target.equals(lockedValue)) {<br/>                return jedis.del(redisKey);<br/>            }<br/>       } finally {<br/>            // 归还资源<br/>            // jedisPool.returnResource(jedis);<br/>            if (null != jedis)<br/>                jedis.close();<br/>        }<br/><br/>        return -1l;<br/>    }<br/><br/>    @Override<br/>    protected void finalize() throws Throwable {<br/><br/>        jedisSentinelPool.destroy();<br/>        super.finalize();<br/><br/>    }<br/>}</p> | ||