如下
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisClusterConnection;
import org.springframework.data.redis.connection.RedisClusterNode;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnection;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import redis.clients.jedis.Jedis;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Component
@Slf4j
public class RedisUtils {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
public Object get(String key){
return key == null ? null : redisTemplate.opsForValue().get(key);
}
public boolean set(String key,Object value){
try{
redisTemplate.opsForValue().set(key,value);
return true;
}catch (Exception e){
log.error("redis set value exception:{}",e);
return false;
}
}
@Autowired
private RedisConnectionFactory redisConnectionFactory;
public Set<String> scan(String key){
RedisConnection connection = redisConnectionFactory.getConnection();
MyRedisCallback myRedisCallback = new MyRedisCallback(connection, key);
Set<String> execute = redisTemplate.execute(myRedisCallback);
return execute;
}
public Set<String> scanCluster(String key){
RedisClusterConnection clusterConnection = redisConnectionFactory.getClusterConnection();
Iterable<RedisClusterNode> redisClusterNodes = clusterConnection.clusterGetNodes();
Set<String> keys =new HashSet<>();
for (RedisClusterNode redisClusterNode : redisClusterNodes) {
String host = redisClusterNode.getHost();
Integer port = redisClusterNode.getPort();
Jedis jedis = new Jedis(host,port);
JedisConnection jedisConnection = new JedisConnection(jedis);
MyRedisCallback myRedisCallback = new MyRedisCallback(jedisConnection, key);
keys.addAll(redisTemplate.execute(myRedisCallback));
jedis.close();
jedisConnection.close();
}
return keys;
}
class MyRedisCallback implements RedisCallback<Set<String>> {
private RedisConnection redisConnection;
private String matchKey;
public MyRedisCallback(RedisConnection redisConnection,String matchKey){
this.redisConnection = redisConnection;
this.matchKey = matchKey;
}
@Override
public Set<String> doInRedis(RedisConnection connection) throws DataAccessException {
Set<String> keysTmp = new HashSet<>();
Cursor<byte[]> cursor;
do {
cursor = redisConnection.scan(new ScanOptions.ScanOptionsBuilder().match("*"+matchKey+"*").count(1000).build());
while (cursor.hasNext()) {
keysTmp.add(new String(cursor.next()));
}
}while (cursor.getCursorId()!=0);
try {
if(cursor!=null)
cursor.close();
} catch (IOException e) {
e.printStackTrace();
}
return keysTmp;
}
}
public boolean setex(String key,Object value,long expire){
try{
redisTemplate.opsForValue().set(key,value,expire, TimeUnit.SECONDS);
return true;
}catch (Exception e){
log.error("redis set value and expire exception:{}",e);
return false;
}
}
public boolean expire(String key,long expire){
try{
redisTemplate.expire(key,expire,TimeUnit.SECONDS);
return true;
}catch (Exception e){
log.error("redis set key expire exception:{}",e);
return false;
}
}
public long ttl(String key){
return redisTemplate.getExpire(key);
}
public void del(String ...keys){
if(keys!=null&&keys.length>0) {
redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(keys));
}
}
public long incrBy(String key,long step){
return redisTemplate.opsForValue().increment(key,step);
}
public boolean setnx(String key,Object value){
return redisTemplate.opsForValue().setIfAbsent(key,value);
}
public boolean setnxAndExpire(String key,Object value,long expire){
return redisTemplate.opsForValue().setIfAbsent(key,value,expire,TimeUnit.SECONDS);
}
public Object getAndSet(String key,Object value){
return redisTemplate.opsForValue().getAndSet(key,value);
}
public boolean hasKey(String key){
return redisTemplate.hasKey(key);
}
public long llen(String key){
return redisTemplate.opsForList().size(key);
}
public Object lgetByIndex(String key,long index){
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
log.error("redis lgetByIndex error,key:{},index:{}exception:{}",key,index,e);
return null;
}
}
public boolean lrpush(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
log.error("redis lrpush error,key:{},value:{}exception:{}",key,value,e);
return false;
}
}
public boolean lrpush(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0)
expire(key, time);
return true;
} catch (Exception e) {
log.error("redis lrpush error,key:{},value:{},timeL{},exception:{}",key,value,time,e);
return false;
}
}
public boolean lrpush(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
log.error("redis lrpush error,key:{},value:{},exception:{}",key,value,e);
return false;
}
}
public boolean lrpush(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0)
expire(key, time);
return true;
} catch (Exception e) {
log.error("redis lrpush error,key:{},value:{},time:{},exception:{}",key,value,time,e);
return false;
}
}
public boolean lUpdateByIndex(String key, long index, Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
log.error("redis lUpdateByIndex error,key:{},index:{},value:{},exception:{}",key,index,value,e);
return false;
}
}
public long lrem(String key, long count, Object value) {
try {
Long remove = redisTemplate.opsForList().remove(key, count, value);
return remove;
} catch (Exception e) {
log.error("redis lrem error,key:{},count:{},value:{},exception:{}",key,count,value,e);
return 0;
}
}
public boolean hset(String key, String field, Object value) {
try {
redisTemplate.opsForHash().put(key, field, value);
return true;
}catch (Exception e){
log.error("redis hset eror,key:{},field:{},value:{}",key,field,value);
return false;
}
}
public boolean hset(String key, String field, Object value,long seconds) {
try {
redisTemplate.opsForHash().put(key, field, value);
expire(key,seconds);
return true;
}catch (Exception e){
log.error("redis hset and expire eror,key:{},field:{},value:{},exception:{}",key,field,value,e);
return false;
}
}
public Object hget(String key,String field){
return redisTemplate.opsForHash().get(key,field);
}
public Map<String,Object> hmget(String key, String...fields){
Map<String,Object> map = new HashMap<>();
for (String field :fields){
map.put(field,hget(key,field));
}
return map;
}
public Map<Object, Object> hmget(String key){
Map<Object, Object> entries = redisTemplate.opsForHash().entries(key);
if(CollectionUtils.isEmpty(entries))
return null;
return entries;
}
@Autowired
private JacksonUtil jacksonUtil;
public <T>T hmgetObject(String key,Class<T> tClass){
Map<Object, Object> hmget = hmget(key);
if(CollectionUtils.isEmpty(hmget)) return null;
String s = jacksonUtil.writeAsString(hmget);
return jacksonUtil.readValue(s,tClass);
}
public boolean hmset(String key,Map<Object,Object> map){
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
}catch (Exception e){
log.error("redis hmset eror,key:{},value:{},exception:{}",key,map,e);
return false;
}
}
public boolean hmset(String key,Object object){
try {
String s = jacksonUtil.writeAsString(object);
Map<String, String> map = jacksonUtil.readValueMap(s);
redisTemplate.opsForHash().putAll(key, map);
return true;
}catch (Exception e){
log.error("redis hmset eror,key:{},object:{},exception:{}",key,object,e);
return false;
}
}
public boolean hmset(String key,Map<String,Object> map,long seconds){
try {
redisTemplate.opsForHash().putAll(key, map);
expire(key,seconds);
return true;
}catch (Exception e){
log.error("redis hmset eror,key:{},value:{},expireTime,exception:{}",key,map,seconds,e);
return false;
}
}
public void hdel(String key,Object...fields){
redisTemplate.opsForHash().delete(key,fields);
}
public boolean hHashKey(String key,String field){
return redisTemplate.opsForHash().hasKey(key,field);
}
public double hincr(String key,String field,double step){
return redisTemplate.opsForHash().increment(key,field,step);
}
public long hlen(String key){
return redisTemplate.opsForHash().size(key);
}
public Set<Object> sgetAll(String key){
try {
return redisTemplate.opsForSet().members(key);
}catch (Exception e){
log.error("redis sgetAll error,key:{},exception:{}",key,e);
return null;
}
}
public boolean sexists(String key,Object value){
try {
return redisTemplate.opsForSet().isMember(key,value);
}catch (Exception e){
log.error("redis sexists error,key:{},value:{},exception:{}",key,value,e);
return false;
}
}
public long sset(String key ,Object...values){
try {
return redisTemplate.opsForSet().add(key,values);
}catch (Exception e){
log.error("redis sset error,key:{},value:{},values:{},exception:{}",key,values,e);
return 0;
}
}
public long sset(String key ,long time,Object...values){
try {
long count = redisTemplate.opsForSet().add(key,values);
expire(key,time);
return count;
}catch (Exception e){
log.error("redis sset error,key:{},value:{},values:{},exception:{}",key,values,e);
return 0;
}
}
public long sgetSize(String key){
try {
return redisTemplate.opsForSet().size(key);
}catch (Exception e){
log.error("redis sgetSize error,key:{},exception:{}",key,e);
return 0;
}
}
public long sRemove(String key, Object... values) {
try {
Long count = redisTemplate.opsForSet().remove(key, values);
return count;
} catch (Exception e) {
log.error("redis sRemove error,key:{},values:{},exception:{}",key,values,e);
return 0;
}
}
public List<Object> sRandom(String key,long count) {
try {
return redisTemplate.opsForSet().randomMembers(key,count);
} catch (Exception e) {
log.error("redis sRandom error,key:{},count:{},exception:{}",key,count,e);
return null;
}
}
public boolean zadd(String key,Object member,double score){
try {
return redisTemplate.opsForZSet().add(key,member,score);
} catch (Exception e) {
log.error("redis zadd error,key:{},value:{},score:{},exception:{}",key,member,score,e);
return false;
}
}
public Set<String> zrange(String key,int start,int end){
try {
Set<Object> range = redisTemplate.opsForZSet().
range(key, start, end);
if(range==null||range.size()==0) return null;
return range.stream().
map(o->(String)o).collect(Collectors.toSet());
} catch (Exception e) {
log.error("redis zrange error,key:{},start:{},end:{},exception:{}",
key,start,end,e);
return null;
}
}
}