package com.muyu.common.redis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Component; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * spring redis 工具类 * * @author muyu **/ @SuppressWarnings(value = {"unchecked", "rawtypes"}) @Component public class RedisService { @Autowired public RedisTemplate redisTemplate; /** * 缓存基本的对象,Integer、String、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 */ public void setCacheObject (final String key, final T value) { redisTemplate.opsForValue().set(key, value); } public SetOperations opsForSet() { return redisTemplate.opsForSet(); } public HashOperations opsForHash() { return (HashOperations) redisTemplate.opsForHash(); } // 获取缓存集合的方法,返回 List public List getCacheSets(String key) { // 获取绑定的 Set 操作对象 BoundSetOperations setOperation = redisTemplate.boundSetOps(key); // 获取 Redis 集合中的所有元素,并转换为 List Set members = setOperation.members(); return members.stream() .map(Object::toString) .collect(Collectors.toList()); } /** * 减少序列值 * @param key * @param number * @return */ public Long increment(final String key , Long number){ return redisTemplate.opsForValue().increment(key,number); } /** * 向 Redis 集合中添加元素 * @param key Redis 集合的 key * @param value 要添加的元素 * @return 如果元素不存在并成功添加返回 true,如果元素已经存在则返回 false */ public boolean addToSet(String key, String value) { Long added = redisTemplate.opsForSet().add(key, value); return added == 1?true:false; } public ZSetOperations opsForZSet() { return redisTemplate.opsForZSet(); } /** * 缓存基本的对象,Integer、String、实体类等 * * @param key 缓存的键值 * @param value 缓存的值 * @param timeout 时间 * @param timeUnit 时间颗粒度 */ public void setCacheObject (final String key, final T value, final Long timeout, final TimeUnit timeUnit) { redisTemplate.opsForValue().set(key, value, timeout, timeUnit); } /** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * * @return true=设置成功;false=设置失败 */ public boolean expire (final String key, final long timeout) { return expire(key, timeout, TimeUnit.SECONDS); } public ValueOperations opsForValue() { return redisTemplate.opsForValue(); } /** * 设置有效时间 * * @param key Redis键 * @param timeout 超时时间 * @param unit 时间单位 * * @return true=设置成功;false=设置失败 */ public boolean expire (final String key, final long timeout, final TimeUnit unit) { return redisTemplate.expire(key, timeout, unit); } /** * 获取有效时间 * * @param key Redis键 * * @return 有效时间 */ public long getExpire (final String key) { return redisTemplate.getExpire(key); } /** * 判断 key是否存在 * * @param key 键 * * @return true 存在 false不存在 */ public Boolean hasKey (String key) { return redisTemplate.hasKey(key); } /** * 获得缓存的基本对象。 * * @param key 缓存键值 * * @return 缓存键值对应的数据 */ public T getCacheObject (final String key) { ValueOperations operation = redisTemplate.opsForValue(); return operation.get(key); } /** * 删除单个对象 * * @param key */ public boolean deleteObject (final String key) { return redisTemplate.delete(key); } /** * 删除集合对象 * * @param collection 多个对象 * * @return */ public boolean deleteObject (final Collection collection) { return redisTemplate.delete(collection) > 0; } /** * 缓存List数据 * * @param key 缓存的键值 * @param dataList 待缓存的List数据 * * @return 缓存的对象 */ public long setCacheList (final String key, final List dataList) { Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count == null ? 0 : count; } /** * 获得缓存的list对象 * * @param key 缓存的键值 * * @return 缓存键值对应的数据 */ public T getCacheList (final String key,Long index) { return (T) redisTemplate.opsForList().index(key, index); } /** * 缓存Set * * @param key 缓存键值 * @param dataSet 缓存的数据 * * @return 缓存数据的对象 */ public BoundSetOperations setCacheSet (final String key, final Set dataSet) { BoundSetOperations setOperation = redisTemplate.boundSetOps(key); Iterator it = dataSet.iterator(); while (it.hasNext()) { setOperation.add(it.next()); } return setOperation; } /** * 缓存Set * * @param key 缓存键值 * @param setValue 缓存的数据 * * @return 缓存数据的对象 */ public BoundSetOperations setCacheSets (final String key, final T setValue) { BoundSetOperations setOperation = redisTemplate.boundSetOps(key); setOperation.add(setValue); return setOperation; } /** * 删除set值 * * @param key 缓存键值 * @param setValue 缓存的数据 * * @return 缓存数据的对象 */ public void deleteCachSet(String key, String setValue) { BoundSetOperations setOperation = redisTemplate.boundSetOps(key); setOperation.remove(setValue); } /** * 获得缓存的set * * @param key * * @return */ public Set getCacheSet (final String key) { return redisTemplate.opsForSet().members(key); } /** * 缓存Map * * @param key * @param dataMap */ public void setCacheMap (final String key, final Map dataMap) { if (dataMap != null) { redisTemplate.opsForHash().putAll(key, dataMap); } } /** * 获得缓存的Map * * @param key * * @return */ public Map getCacheMap (final String key) { return redisTemplate.opsForHash().entries(key); } /** * 往Hash中存入数据 * * @param key Redis键 * @param hKey Hash键 * @param value 值 */ public void setCacheMapValue (final String key, final String hKey, final T value) { redisTemplate.opsForHash().put(key, hKey, value); } /** * 获取Hash中的数据 * * @param key Redis键 * @param hKey Hash键 * * @return Hash中的对象 */ public T getCacheMapValue (final String key, final String hKey) { HashOperations opsForHash = redisTemplate.opsForHash(); return opsForHash.get(key, hKey); } /** * 获取多个Hash中的数据 * * @param key Redis键 * @param hKeys Hash键集合 * * @return Hash对象集合 */ public List getMultiCacheMapValue (final String key, final Collection hKeys) { return redisTemplate.opsForHash().multiGet(key, hKeys); } /** * 删除Hash中的某条数据 * * @param key Redis键 * @param hKey Hash键 * * @return 是否成功 */ public boolean deleteCacheMapValue (final String key, final String hKey) { return redisTemplate.opsForHash().delete(key, hKey) > 0; } /** * 获得缓存的基本对象列表 * * @param pattern 字符串前缀 * * @return 对象列表 */ public Collection keys (final String pattern) { return redisTemplate.keys(pattern); } public void rightPush(String key, String value) { redisTemplate.opsForList().rightPush(key, value); } public Object leftPopAndRemove(String key) { return redisTemplate.opsForList().leftPop(key); } }