redis是一个在开发中常用的NoSql库,下面贴出自己在 springboot 项目中整合 redis 的代码。
1. pom.xml 中引用 spring-boot-starter-data-redis 依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.2.5.RELEASE</version> </dependency> </dependencies>引入的版本需要参考自己使用的 springboot 版本,一般大于或等于 springboot 版本 。
2. 配置自定义缓存
package cn.xxx.common.redis.support.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * redis 配置 * @author ZL * */ @Configuration @EnableCaching //开启缓存 public class RedisConfig extends CachingConfigurerSupport { /** * retemplate相关配置 * @param factory * @return */ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) @SuppressWarnings({ "rawtypes", "unchecked" }) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); // 值采用json序列化 template.setValueSerializer(jacksonSeial); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); // 设置hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } }
3. 自定义 redis 操作类
package cn.xxx.common.redis.support.client; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations.TypedTuple; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** * redis 客户端操作类 * * @author ZL */ @Component public class RedisClient { private final RedisTemplate<String, Object> redisTemplate; public RedisClient(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } /** * 指定缓存失效时间 * * @param key 键 * @param time 时间(秒) * @return Boolean */ 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 可以传一个值 或多个 */ 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)); } } } //============================ TODO 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 delta 要增加几(大于0) * @return long */ public long incr(String key, long delta) { if (delta < 0) { throw new RuntimeException("递增因子必须大于0"); } return redisTemplate.opsForValue().increment(key, delta); } /** * 递减 * * @param key 键 * @param delta 要减少几(小于0) * @return */ public long decr(String key, long delta) { if (delta < 0) { throw new RuntimeException("递减因子必须大于0"); } return redisTemplate.opsForValue().increment(key, -delta); } //================================TODO Map================================= /** * HashGet * * @param key 键 不能为null * @param item 项 不能为null。即 map 中的key * @return 值 */ public Object hget(String key, String item) { return redisTemplate.opsForHash().get(key, item); } /** * 获取hashKey对应的所有键值 * * @param key 键 * @return 对应的多个键值 */ public Map<Object, Object> hget(String key) { return redisTemplate.opsForHash().entries(key); } /** * HashSet * * @param key 键 * @param map 对应多个键值 * @return true 成功 false 失败 */ public Boolean hset(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 hset(String key, Map<Object, 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); } //============================ TODO set============================= /** * 根据key获取所有成员值 * * @param key 键 * @return */ public Set<Object> sGet(String key) { try { return redisTemplate.opsForSet().members(key); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取2个key 的成员并集 (所有成员加起来) * * @param key1 * @param key2 * @return */ public Set<Object> sGetUinon(String key1, String key2) { try { return redisTemplate.opsForSet().union(key1, key2); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取2个key 的成员差集 (去除2边都有的成员,然后所有成员加起来,) * * @param key1 * @param key2 * @return */ public Set<Object> sGetDiff(String key1, String key2) { try { return redisTemplate.opsForSet().difference(key1, key2); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取2个key 的成员交集(2边都有的成员) * * @param key1 * @param key2 * @return */ public Set<Object> sGetInter(String key1, String key2) { try { return redisTemplate.opsForSet().intersect(key1, key2); } 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 sRemove(String key, Object... values) { try { Long count = redisTemplate.opsForSet().remove(key, values); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } //============================ TODO sortSet============================= /** * 设置 成员 * * @param key 保持一致 * @param member 要变化 * @param score 分值。zset 是根据score 从小到大排序的 * @return */ public Boolean zsSet(String key, String member, double score) { try { return redisTemplate.opsForZSet().add(key, member, score); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据 score 顺序排 * * @param key * @param min * @param max * @param limitStart * @param limit * @return */ public Set<TypedTuple<Object>> zsRangebyscore(String key, double min, double max, Long limitStart, Long limit) { try { if (null == limitStart && null == limit) return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max); return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max, limitStart, limit); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 根据 score 逆序排 * * @param key * @param min * @param max * @param limitStart 分页开始下标 * @param limit 读取条数 * @return */ public Set<TypedTuple<Object>> zsRevrangebyscore(String key, double min, double max, Long limitStart, Long limit) { try { if (null == limitStart && null == limit) return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, max, min); return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key, max, min, limitStart, limit); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 根据 指定score 值范围查找条数 * * @param key * @param min * @param max * @return */ public Long zsCount(String key, double min, double max) { try { return redisTemplate.opsForZSet().count(key, min, max); } catch (Exception e) { e.printStackTrace(); return 0L; } } /** * 设置成员 score 增长 * * @param key * @param member * @param increNum 增长值。可正可负 * @return */ public Double zsIncr(String key, String member, double increNum) { try { return redisTemplate.opsForZSet().incrementScore(key, member, increNum); } catch (Exception e) { e.printStackTrace(); return 0D; } } /** * 移除 指定成员 * * @param key * @param members * @return */ public Long zsRemove(String key, Object... members) { try { return redisTemplate.opsForZSet().remove(key, members); } catch (Exception e) { e.printStackTrace(); return 0L; } } //===============================TODO 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放入缓存。配合lLeftPop 使用 * * @param key 键 * @param value 值 * @return */ public Boolean lRightPush(String key, Object value) { try { if (value instanceof List) { @SuppressWarnings("unchecked") List<Object> list = (List<Object>) value; redisTemplate.opsForList().rightPushAll(key, list); } else { redisTemplate.opsForList().rightPush(key, value); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存。配合lLeftPop 使用 * * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public Boolean lRightPush(String key, Object value, long time) { try { if (value instanceof List) { @SuppressWarnings("unchecked") List<Object> list = (List<Object>) value; redisTemplate.opsForList().rightPushAll(key, list); } else { redisTemplate.opsForList().rightPush(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 元素。配合lRightPush 使用 * * @param key * @return */ public Object lLeftPop(String key) { try { return redisTemplate.opsForList().leftPop(key); } catch (Exception e) { e.printStackTrace(); return null; } } }好啦!代码都贴出来了,觉得有用别忘了点个赞哟!
学无止境,生生不息。