spring boot集成redis踩坑记录

tech2024-04-01  58

废话不多说,上代码 首先是redis依赖----pom文件

<!-- Redis Jedis依赖--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.3.RELEASE</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.9.1</version> </dependency>

然后添加redis.properties文件

# Redis settings redis.host=127.0.0.1 redis.pass= redis.port=6379 redis.maxIdle=300 redis.default.db=0 redis.timeout=100000 redis.maxActive=600 redis.maxWait=1000 redis.testOnBorrow=true

然后配置spring-pool.xml

<!-- redis缓存数据库的相关配置BEGIN --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxActive}" /> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="MaxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig" p:timeout="${redis.timeout}" /> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="keySerializer"> <!--对key的默认序列化器。默认值是StringSerializer--> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <!--是对value的默认序列化器,默认值是取自DefaultSerializer的JdkSerializationRedisSerializer。--> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property> <!--存储Map时key需要的序列化配置--> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <!--存储Map时value需要的序列化配置--> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> </property> </bean> <bean id="LoginRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> </bean> <!-- redis缓存数据库的相关配置 END-->

然后再配置一个Redis的工具类

package com.dccj.redis; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import javax.annotation.Resource; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; /** * @author WeiYiBin * @date 2020/9/3 */ @Component public class RedisClient { @Resource private RedisTemplate<String, Object> redisTemplate; /** * 指定缓存失效时间 * * @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 ttl(String key) { return redisTemplate.getExpire(key, TimeUnit.SECONDS); } /** * 判断key是否存在 * * @param key 键 * @return true 存在 false不存在 */ public boolean exists(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)); } } } /** * 模糊匹配批量删除 * * @param pattern 匹配的前缀 */ public void deleteByPattern(String pattern) { Set<String> keys = redisTemplate.keys(pattern); if (!CollectionUtils.isEmpty(keys)) { redisTemplate.delete(keys); } } /** * 设置指定 key 的值 * * @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 == CacheTime.CACHE_EXP_FOREVER) { redisTemplate.opsForValue().set(key, value); } else { redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 获取指定 key 的值 * * @param key 键 * @return 值 */ @SuppressWarnings("unchecked") public <T> T get(String key) { return key == null ? null : (T) redisTemplate.opsForValue().get(key); } /** * 将 key 中储存的数字值递增 * * @param key 键 * @param delta 要增加几(大于0) * @return */ public long incr(String key, long delta) { if (delta <= 0) { throw new IllegalArgumentException("递增因子必须大于0"); } return redisTemplate.opsForValue().increment(key, delta); } /** * 将 key 中储存的数字值递减 * * @param key 键 * @param delta 要减少几(小于0) * @return */ public long decr(String key, long delta) { if (delta <= 0) { throw new IllegalArgumentException("递减因子必须大于0"); } return redisTemplate.opsForValue().increment(key, -delta); } /** * 将哈希表 key 中的字段 field 的值设为 value * * @param key 键 * @param field 字段 * @param value 值 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 * @return true 成功 false失败 */ public boolean hset(String key, String field, Object value, long time) { try { redisTemplate.opsForHash().put(key, field, value); if (time != CacheTime.CACHE_EXP_FOREVER) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 同时将多个 field-value (域-值)对设置到哈希表 key 中 * * @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 != CacheTime.CACHE_EXP_FOREVER) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 删除一个或多个哈希表字段 * * @param key 键 * @param field 字段 可以多个 */ public void hdel(String key, Object... field) { redisTemplate.opsForHash().delete(key, field); } /** * 获取存储在哈希表中指定字段的值 * * @param key 键 * @param field 字段 * @return 值 */ public <T> T hget(String key, String field) { return (T) redisTemplate.opsForHash().get(key, field); } /** * 获取在哈希表中指定 key 的所有字段和值 * * @param key 键 * @return 对应的多个键值 */ public Map<Object, Object> hmget(String key) { return redisTemplate.opsForHash().entries(key); } /** * 查看哈希表 key 中,指定的字段是否存在 * * @param key 键 * @param field 字段 * @return true 存在 false不存在 */ public boolean hexists(String key, String field) { return redisTemplate.opsForHash().hasKey(key, field); } /** * 获取哈希表中字段的数量 * * @param key 键 * @return 字段数量 */ public long hlen(String key) { try { return redisTemplate.opsForHash().size(key); } catch (Exception e) { e.printStackTrace(); return 0L; } } /** * 向集合添加一个或多个成员 * * @param key 键 * @param time 时间(秒) * @param values 成员 可以是多个 * @return 成功个数 */ public long sadd(String key, long time, Object... values) { try { Long count = redisTemplate.opsForSet().add(key, values); if (time != CacheTime.CACHE_EXP_FOREVER) { expire(key, time); } return count; } catch (Exception e) { e.printStackTrace(); return 0L; } } /** * 移除集合中一个或多个成员 * * @param key 键 * @param values 成员 可以是多个 * @return 移除的个数 */ public long srem(String key, Object... values) { try { return redisTemplate.opsForSet().remove(key, values); } catch (Exception e) { e.printStackTrace(); return 0L; } } /** * 返回集合中的所有成员 * * @param key 键 * @return 成员列表 */ public <T> Set<T> smembers(String key) { try { return (Set<T>) redisTemplate.opsForSet().members(key); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 判断 member 元素是否是集合 key 的成员 * * @param key 键 * @param member 成员 * @return true 存在 false不存在 */ public boolean sismember(String key, Object member) { try { return redisTemplate.opsForSet().isMember(key, member); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 获取集合的成员数 * * @param key 键 * @return 成员数 */ public long slen(String key) { try { return redisTemplate.opsForSet().size(key); } catch (Exception e) { e.printStackTrace(); return 0L; } } /** * 在列表头部添加一个值 * * @param key 键 * @param value 值 * @param time 时间(秒) * @return boolean */ public boolean lpush(String key, Object value, long time) { try { redisTemplate.opsForList().leftPush(key, value); if (time != CacheTime.CACHE_EXP_FOREVER) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 在列表头部添加多个值 * * @param key 键 * @param values 值 * @param time 时间(秒) * @return boolean */ public boolean lpush(String key, List<Object> values, long time) { try { redisTemplate.opsForList().leftPushAll(key, values); if (time != CacheTime.CACHE_EXP_FOREVER) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 在列表尾部添加一个值 * * @param key 键 * @param value 值 * @param time 时间(秒) * @return boolean */ public boolean rpush(String key, Object value, long time) { try { redisTemplate.opsForList().rightPush(key, value); if (time != CacheTime.CACHE_EXP_FOREVER) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 在列表尾部添加多个值 * * @param key 键 * @param values 值 * @param time 时间(秒) * @return boolean */ public boolean rpush(String key, List<Object> values, long time) { try { redisTemplate.opsForList().rightPushAll(key, values); if (time != CacheTime.CACHE_EXP_FOREVER) { expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 移除列表元素 * * @param key 键 * @param count 移除多少个 * @param value 值 * @return 移除的个数 */ public long lrem(String key, long count, Object value) { try { return redisTemplate.opsForList().remove(key, count, value); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 通过索引设置列表元素的值 * * @param key 键 * @param index 索引 * @param value 值 * @return boolean */ public boolean lset(String key, long index, Object value) { try { redisTemplate.opsForList().set(key, index, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 获取列表指定范围内的元素 * * @param key 键 * @param start 开始 * @param end 结束 0 到 -1代表所有值 * @return 元素列表 */ @SuppressWarnings("unchecked") public <T> List<T> lrange(String key, long start, long end) { try { return (List<T>) redisTemplate.opsForList().range(key, start, end); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 通过索引获取列表中的元素 * * @param key 键 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 * @return */ public Object lindex(String key, long index) { try { return redisTemplate.opsForList().index(key, index); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取列表长度 * * @param key 键 * @return 列表长度 */ public long llen(String key) { try { return redisTemplate.opsForList().size(key); } catch (Exception e) { e.printStackTrace(); return 0L; } } /** * 向有序集合添加一个成员,或者更新已存在成员的分数 * * @param key 键 * @param time 时间(秒) * @param member 成员 * @param score 分数 * @return */ public boolean zadd(String key, long time, Object member, double score) { try { boolean ret = redisTemplate.opsForZSet().add(key, member, score); if (time != CacheTime.CACHE_EXP_FOREVER) { expire(key, time); } return ret; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 移除有序集合中的一个或多个成员 * * @param key 键 * @param values 值 可以是多个 * @return 移除的个数 */ public long zrem(String key, Object... values) { try { return redisTemplate.opsForZSet().remove(key, values); } catch (Exception e) { e.printStackTrace(); return 0L; } } /** * 通过索引区间返回有序集合成指定区间内的成员 分数从低到高 * * @param key 键 * @param start 开始 * @param end 结束 0 到 -1代表所有值 * @return 成员集合 */ public Set<Object> zrange(String key, long start, long end) { try { return redisTemplate.opsForZSet().range(key, start, end); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 通过索引区间返回有序集合成指定区间内的成员 分数从高到低 * * @param key 键 * @param start 开始 * @param end 结束 0 到 -1代表所有值 * @return 成员集合 */ public Set<Object> zrevrange(String key, long start, long end) { try { return redisTemplate.opsForZSet().range(key, start, end); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 返回有序集合中某个成员的分数值 * * @param key 键 * @param member 成员 * @return 分数值 */ public double zscore(String key, Object member) { try { return redisTemplate.opsForZSet().score(key, member); } catch (Exception e) { e.printStackTrace(); return 0.0; } } /** * 判断有序集合中某个成员是否存在 * * @param key 键 * @param member 成员 * @return true 存在 false不存在 */ public boolean zexist(String key, Object member) { try { return null != redisTemplate.opsForZSet().score(key, member); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 获取有序集合的成员数 * * @param key 键 * @return 成员数 */ public long zlen(String key) { try { return redisTemplate.opsForZSet().size(key); } catch (Exception e) { e.printStackTrace(); return 0L; } } }

最后就可以测试了 新建User类

@Data public class User implements Serializable { private static final long serialVersionUID = 1768931144633277198L; private Integer id; private String username; private String password; }

新建UserService类

void saveUser(User user);

新建UserServiceImpl实现类

@Autowired private RedisClient redisClient; public void saveUser(User user,) { int i = userDao.save(user); if(i!=1){ throw new RuntimeException("保存用户信息失败!"); } //放入Redis redisClient.set("user:1", user, CacheTime.CACHE_EXP_FIVE_MINUTES); //取出Redis数据,根据key User user1 = (User) redisClient.get("user:1"); System.out.println("id"+user1.getId()+"name"+user1.getUsername()); }

//这就算成啦, 如果朋友有其他好的写法,欢迎来激烈的讨论哈 微信号:bin2259849646

最新回复(0)