| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614 | package org.jeecg.common.util;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import java.util.concurrent.TimeUnit;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.*;import org.springframework.stereotype.Component;import org.springframework.util.CollectionUtils;/** * redis 工具类 * @Author Scott * */@Componentpublic class RedisUtil {	@Autowired	private RedisTemplate<String, Object> redisTemplate;	@Autowired	private StringRedisTemplate stringRedisTemplate;	/**	 * 指定缓存失效时间	 * 	 * @param key  键	 * @param time 时间(秒)	 * @return	 */	public boolean expire(String key, long time) {		try {			if (time > 0) {				redisTemplate.expire(key, time, TimeUnit.SECONDS);			}			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 根据key 获取过期时间	 * 	 * @param key 键 不能为null	 * @return 时间(秒) 返回0代表为永久有效	 */	public long getExpire(String key) {		return redisTemplate.getExpire(key, TimeUnit.SECONDS);	}	/**	 * 判断key是否存在	 * 	 * @param key 键	 * @return true 存在 false不存在	 */	public boolean hasKey(String key) {		try {			return redisTemplate.hasKey(key);		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 删除缓存	 * 	 * @param key 可以传一个值 或多个	 */	@SuppressWarnings("unchecked")	public void del(String... key) {		if (key != null && key.length > 0) {			if (key.length == 1) {				redisTemplate.delete(key[0]);			} else {				redisTemplate.delete(CollectionUtils.arrayToList(key));			}		}	}	// ============================String=============================	/**	 * 普通缓存获取	 * 	 * @param key 键	 * @return 值	 */	public Object get(String key) {		return key == null ? null : redisTemplate.opsForValue().get(key);	}	/**	 * 普通缓存放入	 * 	 * @param key   键	 * @param value 值	 * @return true成功 false失败	 */	public boolean set(String key, Object value) {		try {			redisTemplate.opsForValue().set(key, value);			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 普通缓存放入并设置时间	 * 	 * @param key   键	 * @param value 值	 * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期	 * @return true成功 false 失败	 */	public boolean set(String key, Object value, long time) {		try {			if (time > 0) {				redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);			} else {				set(key, value);			}			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 递增	 * 	 * @param key 键	 * @param by  要增加几(大于0)	 * @return	 */	public long incr(String key, long delta) {		if (delta < 0) {			throw new RuntimeException("递增因子必须大于0");		}		return redisTemplate.opsForValue().increment(key, delta);	}	/**	 * 递减	 * 	 * @param key 键	 * @param by  要减少几(小于0)	 * @return	 */	public long decr(String key, long delta) {		if (delta < 0) {			throw new RuntimeException("递减因子必须大于0");		}		return redisTemplate.opsForValue().increment(key, -delta);	}	// ================================Map=================================	/**	 * HashGet	 * 	 * @param key  键 不能为null	 * @param item 项 不能为null	 * @return 值	 */	public Object hget(String key, String item) {		return redisTemplate.opsForHash().get(key, item);	}	/**	 * 获取hashKey对应的所有键值	 * 	 * @param key 键	 * @return 对应的多个键值	 */	public Map<Object, Object> hmget(String key) {		return redisTemplate.opsForHash().entries(key);	}	/**	 * HashSet	 * 	 * @param key 键	 * @param map 对应多个键值	 * @return true 成功 false 失败	 */	public boolean hmset(String key, Map<String, Object> map) {		try {			redisTemplate.opsForHash().putAll(key, map);			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * HashSet 并设置时间	 * 	 * @param key  键	 * @param map  对应多个键值	 * @param time 时间(秒)	 * @return true成功 false失败	 */	public boolean hmset(String key, Map<String, Object> map, long time) {		try {			redisTemplate.opsForHash().putAll(key, map);			if (time > 0) {				expire(key, time);			}			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 向一张hash表中放入数据,如果不存在将创建	 * 	 * @param key   键	 * @param item  项	 * @param value 值	 * @return true 成功 false失败	 */	public boolean hset(String key, String item, Object value) {		try {			redisTemplate.opsForHash().put(key, item, value);			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 向一张hash表中放入数据,如果不存在将创建	 * 	 * @param key   键	 * @param item  项	 * @param value 值	 * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间	 * @return true 成功 false失败	 */	public boolean hset(String key, String item, Object value, long time) {		try {			redisTemplate.opsForHash().put(key, item, value);			if (time > 0) {				expire(key, time);			}			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 删除hash表中的值	 * 	 * @param key  键 不能为null	 * @param item 项 可以使多个 不能为null	 */	public void hdel(String key, Object... item) {		redisTemplate.opsForHash().delete(key, item);	}	/**	 * 判断hash表中是否有该项的值	 * 	 * @param key  键 不能为null	 * @param item 项 不能为null	 * @return true 存在 false不存在	 */	public boolean hHasKey(String key, String item) {		return redisTemplate.opsForHash().hasKey(key, item);	}	/**	 * hash递增 如果不存在,就会创建一个 并把新增后的值返回	 * 	 * @param key  键	 * @param item 项	 * @param by   要增加几(大于0)	 * @return	 */	public double hincr(String key, String item, double by) {		return redisTemplate.opsForHash().increment(key, item, by);	}	/**	 * hash递减	 * 	 * @param key  键	 * @param item 项	 * @param by   要减少记(小于0)	 * @return	 */	public double hdecr(String key, String item, double by) {		return redisTemplate.opsForHash().increment(key, item, -by);	}	// ============================set=============================	/**	 * 根据key获取Set中的所有值	 * 	 * @param key 键	 * @return	 */	public Set<Object> sGet(String key) {		try {			return redisTemplate.opsForSet().members(key);		} catch (Exception e) {			e.printStackTrace();			return null;		}	}	/**	 * 根据value从一个set中查询,是否存在	 * 	 * @param key   键	 * @param value 值	 * @return true 存在 false不存在	 */	public boolean sHasKey(String key, Object value) {		try {			return redisTemplate.opsForSet().isMember(key, value);		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 将数据放入set缓存	 * 	 * @param key    键	 * @param values 值 可以是多个	 * @return 成功个数	 */	public long sSet(String key, Object... values) {		try {			return redisTemplate.opsForSet().add(key, values);		} catch (Exception e) {			e.printStackTrace();			return 0;		}	}	/**	 * 将set数据放入缓存	 * 	 * @param key    键	 * @param time   时间(秒)	 * @param values 值 可以是多个	 * @return 成功个数	 */	public long sSetAndTime(String key, long time, Object... values) {		try {			Long count = redisTemplate.opsForSet().add(key, values);			if (time > 0) {				expire(key, time);			}			return count;		} catch (Exception e) {			e.printStackTrace();			return 0;		}	}	/**	 * 获取set缓存的长度	 * 	 * @param key 键	 * @return	 */	public long sGetSetSize(String key) {		try {			return redisTemplate.opsForSet().size(key);		} catch (Exception e) {			e.printStackTrace();			return 0;		}	}	/**	 * 移除值为value的	 * 	 * @param key    键	 * @param values 值 可以是多个	 * @return 移除的个数	 */	public long setRemove(String key, Object... values) {		try {			Long count = redisTemplate.opsForSet().remove(key, values);			return count;		} catch (Exception e) {			e.printStackTrace();			return 0;		}	}	// ===============================list=================================	/**	 * 获取list缓存的内容	 * 	 * @param key   键	 * @param start 开始	 * @param end   结束 0 到 -1代表所有值	 * @return	 */	public List<Object> lGet(String key, long start, long end) {		try {			return redisTemplate.opsForList().range(key, start, end);		} catch (Exception e) {			e.printStackTrace();			return null;		}	}	/**	 * 获取list缓存的长度	 * 	 * @param key 键	 * @return	 */	public long lGetListSize(String key) {		try {			return redisTemplate.opsForList().size(key);		} catch (Exception e) {			e.printStackTrace();			return 0;		}	}	/**	 * 通过索引 获取list中的值	 * 	 * @param key   键	 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推	 * @return	 */	public Object lGetIndex(String key, long index) {		try {			return redisTemplate.opsForList().index(key, index);		} catch (Exception e) {			e.printStackTrace();			return null;		}	}	/**	 * 将list放入缓存	 * 	 * @param key   键	 * @param value 值	 * @param time  时间(秒)	 * @return	 */	public boolean lSet(String key, Object value) {		try {			redisTemplate.opsForList().rightPush(key, value);			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 将list放入缓存	 * 	 * @param key   键	 * @param value 值	 * @param time  时间(秒)	 * @return	 */	public boolean lSet(String key, Object value, long time) {		try {			redisTemplate.opsForList().rightPush(key, value);			if (time > 0) {				expire(key, time);			}			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 将list放入缓存	 * 	 * @param key   键	 * @param value 值	 * @param time  时间(秒)	 * @return	 */	public boolean lSet(String key, List<Object> value) {		try {			redisTemplate.opsForList().rightPushAll(key, value);			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 将list放入缓存	 * 	 * @param key   键	 * @param value 值	 * @param time  时间(秒)	 * @return	 */	public boolean lSet(String key, List<Object> value, long time) {		try {			redisTemplate.opsForList().rightPushAll(key, value);			if (time > 0) {				expire(key, time);			}			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 根据索引修改list中的某条数据	 * 	 * @param key   键	 * @param index 索引	 * @param value 值	 * @return	 */	public boolean lUpdateIndex(String key, long index, Object value) {		try {			redisTemplate.opsForList().set(key, index, value);			return true;		} catch (Exception e) {			e.printStackTrace();			return false;		}	}	/**	 * 移除N个值为value	 * 	 * @param key   键	 * @param count 移除多少个	 * @param value 值	 * @return 移除的个数	 */	public long lRemove(String key, long count, Object value) {		try {			Long remove = redisTemplate.opsForList().remove(key, count, value);			return remove;		} catch (Exception e) {			e.printStackTrace();			return 0;		}	}	/**	 *  获取指定前缀的一系列key	 *  使用scan命令代替keys, Redis是单线程处理,keys命令在KEY数量较多时,	 *  操作效率极低【时间复杂度为O(N)】,该命令一旦执行会严重阻塞线上其它命令的正常请求	 * @param keyPrefix	 * @return	 */	private Set<String> keys(String keyPrefix) {		String realKey = keyPrefix + "*";		try {			return redisTemplate.execute((RedisCallback<Set<String>>) connection -> {				Set<String> binaryKeys = new HashSet<>();				Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(realKey).count(Integer.MAX_VALUE).build());				while (cursor.hasNext()) {					binaryKeys.add(new String(cursor.next()));				}				return binaryKeys;			});		} catch (Throwable e) {			e.printStackTrace();		}		return null;	}	/**	 *  删除指定前缀的一系列key	 * @param keyPrefix	 */	public void removeAll(String keyPrefix) {		try {			Set<String> keys = keys(keyPrefix);			redisTemplate.delete(keys);		} catch (Throwable e) {			e.printStackTrace();		}	}}
 |