一、效果
二、配置
1.配置pom.xml
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-redisartifactId> dependency> <dependency> <groupId>redis.clientsgroupId> <artifactId>jedisartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-cacheartifactId> dependency>
2.配置spring.xml
##################Redis配置######### Redis服务器地址spring.redis.host=127.0.0.1# Redis服务器连接端口spring.redis.port=6379# Redis服务器连接密码(默认为空)spring.redis.password=123456789# 连接池最大连接数(使用负值表示没有限制)spring.redis.pool.max-active=8# 连接池最大阻塞等待时间(使用负值表示没有限制)spring.redis.pool.max-wait=-1# 连接池中的最大空闲连接spring.redis.pool.max-idle=8# 连接池中的最小空闲连接spring.redis.pool.min-idle=0# 连接超时时间(毫秒)spring.redis.timeout=0spring.redis.commandTimeout=5000#连接的数据库spring.redis.database=0# redis.clusterspring.redis.cluster.nodes=127.0.0.1:6379##########################################################################
3.配置CacheManager
直接配置会提示错误:
new RedisCacheManager(redisTemplate)没有此构造
现在这么写会有报错The constructor RedisCacheManager(RedisTemplate) is undefined。
这是因为Spring Boot 2.x版本删除了RedisCacheManager这个构造器, 也不可以通过之前的setDefaultExpiration方法设置默认的缓存过期时间等。
通过设置RedisConnectionFactory factory进行解决,最后RedisConfig.java如下:
/*** * 配置redis缓存 * @author Administrator * */@Configuration@EnableCaching//启用缓存public class RedisConfig extends CachingConfigurerSupport{ //注入 RedisConnectionFactory @Autowired public RedisConnectionFactory redisConnectionFactory; //实例化 RedisTemplate 对象 设置数据存入 redis 的序列化方式 @Bean public RedisTemplate<String, Object> functionDomainRedisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); //定义key生成策略 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } //缓存管理器 --》配置缓存时间 @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(-1)); RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build(); return cacheManager; } }
创建实体类,一定要实现Serializable
序列化,
因为redis保存对象的时候要求对象是序列化
如:
实体类配置好后,将redis的操作的接口类进行封装后,进行使用:
public interface RedisService{ public boolean set(final String key, Object value); public boolean set(final String key, Object value, Long expireTime); public void remove(final String... keys); public void removePattern(final String pattern); public void remove(final String key); public boolean exists(final String key); public Object get(final String key); public void hmSet(String key, Object hashKey, Object value); public Object hmGet(String key, Object hashKey); public void lPush(String k,Object v); public List<Object> lRange(String k, long l, long l1); public void add(String key,Object value); public Set<Object> setMembers(String key); public void zAdd(String key,Object value,double scoure); public Set<Object> rangeByScore(String key,double scoure,double scoure1); }
package ***; import java.io.Serializable;import java.util.List;import java.util.Set;import java.util.concurrent.TimeUnit; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.HashOperations;import org.springframework.data.redis.core.ListOperations;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.SetOperations;import org.springframework.data.redis.core.ValueOperations;import org.springframework.data.redis.core.ZSetOperations;import org.springframework.stereotype.Service; @SuppressWarnings("all")@Servicepublic class RedisServiceImpl implements RedisService{ @Autowired private RedisTemplate redisTemplate; /** * 写入缓存 * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperationsObject> operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存设置时效时间 * @param key * @param value * @return */ public boolean set(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperationsObject> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 批量删除对应的value * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * 批量删除key * @param pattern */ public void removePattern(final String pattern) { Set keys = redisTemplate.keys(pattern); if (keys.size() > 0) redisTemplate.delete(keys); } /** * 删除对应的value * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * 判断缓存中是否有对应的value * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 读取缓存 * @param key * @return */ public Object get(final String key) { Object result = null; ValueOperationsObject> operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * 哈希 添加 * @param key * @param hashKey * @param value */ public void hmSet(String key, Object hashKey, Object value){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key,hashKey,value); } /** * 哈希获取数据 * @param key * @param hashKey * @return */ public Object hmGet(String key, Object hashKey){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); return hash.get(key,hashKey); } /** * 列表添加 * @param k * @param v */ public void lPush(String k,Object v){ ListOperations<String, Object> list = redisTemplate.opsForList(); list.rightPush(k,v); } /** * 列表获取 * @param k * @param l * @param l1 * @return */ public List<Object> lRange(String k, long l, long l1){ ListOperations<String, Object> list = redisTemplate.opsForList(); return list.range(k,l,l1); } /** * 集合添加 * @param key * @param value */ public void add(String key,Object value){ SetOperations<String, Object> set = redisTemplate.opsForSet(); set.add(key,value); } /** * 集合获取 * @param key * @return */ public Set<Object> setMembers(String key){ SetOperations<String, Object> set = redisTemplate.opsForSet(); return set.members(key); } /** * 有序集合添加 * @param key * @param value * @param scoure */ public void zAdd(String key,Object value,double scoure){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key,value,scoure); } /** * 有序集合获取 * @param key * @param scoure * @param scoure1 * @return */ public Set<Object> rangeByScore(String key,double scoure,double scoure1){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rangeByScore(key, scoure, scoure1); } }
便于redis-key的整理,创建一个key的管理文件,进行将所有要缓存的业务类进行统一管理,如
/**** * 整合redis缓存key文件 * @author Administrator * */public class RedisServiceKey { public static final String Product_REDIS_KEY = "Product_KEY"; }
基本配置就全部完成,可以启动。
所有配置文件在资源中:【https://download.csdn.net/download/qq_31653405/12440229 】
启动后可能遇见的问题:
1.问题:HostAndPort need to be seperated by ‘:’.
解决
如上图,添加端口127.0.0.1:6379
扩展:
host变成ip:port,集群多个ip和端口用“,”分割,
2.
问题
:再次启动出现问题:org.springframework.data.redis.core.HashOperations
解决
:
原因就是,缺少redis中HashOperationsbean,其实在下面已经提示了,所以在redisconfig中注入bean,并同时在再调用下就可以了,
//实例化 HashOperations 对象,可以使用 Hash 类型操作 @Bean public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForHash(); } //实例化 ValueOperations 对象,可以使用 String 操作 @Bean public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForValue(); } //实例化 ListOperations 对象,可以使用 List 操作 @Bean public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForList(); } //实例化 SetOperations 对象,可以使用 Set 操作 @Bean public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForSet(); } //实例化 ZSetOperations 对象,可以使用 ZSet 操作 @Bean public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForZSet(); }
如上图的*Service.java文件中
访问这个文章【 https://blog.csdn.net/hello_world_qwp/article/details/81205921 】
3.问题:Cannot retrieve initial cluster partitions from initial URIs [RedisURI [host=’127.0.0.1′, port=6379]]
当前问题说:在配置redis集群时,地址用的是127的IP
解决 :在配置集群时,一定要用IP地址,不要用127/localhost等代替IP
4.问题:Command timed out 连接请求超时
将spring.xml中时间设长一点
# 连接超时时间(毫秒)
spring.redis.timeout=200
spring.redis.commandTimeout=500000
通过上面的配置完全解决这个问题的所在.
有问题的可以评论!!!!!!!
版权声明:本文为CSDN博主「快找一个值得变态的事情去做!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31653405