29. SpringBoot Redis 非注解
Posted 超轶绝尘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了29. SpringBoot Redis 非注解相关的知识,希望对你有一定的参考价值。
1. 引入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring.data.redis.version>2.0.8.RELEASE</spring.data.redis.version><!--1.8.7.RELEASE--> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>${spring.data.redis.version}</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> </dependencies>
2. application.yml中添加配置
spring:
redis:
#数据库索引
database: 0
host: 127.0.0.1
port: 6379
password:
jedis:
pool:
#最大连接数
max-active: 8
#最大阻塞等待时间(负数表示没限制)
max-wait: -1
#最大空闲
max-idle: 8
#最小空闲
min-idle: 0
#连接超时时间
timeout: 10000
3. RedisConfiguration
@Configuration @EnableCaching public class RedisConfiguration extends CachingConfigurerSupport { @Bean public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } // @Bean // public CacheManager cacheManager(RedisTemplate redisTemplate) { // RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate); // return redisCacheManager; // } // // // @Bean // public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { // ////解决键、值序列化问题 // StringRedisTemplate template = new StringRedisTemplate(factory); // Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); // ObjectMapper om = new ObjectMapper(); // om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // jackson2JsonRedisSerializer.setObjectMapper(om); // template.setValueSerializer(jackson2JsonRedisSerializer); // template.afterPropertiesSet(); // return template; // } /* spring-data-redis 版本不同,方法也不一样 上面是1.5 下面是2.0 */ @Bean public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build(); return redisCacheManager; } /** * @Description: 防止redis入库序列化乱码的问题 * @return 返回类型 * @date 2018/4/12 10:54 */ @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){ RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(new StringRedisSerializer());//key序列化 redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class)); //value序列化 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; }
4. RedisService
@Component public class RedisService<HK, V> { // 在构造器中获取redisTemplate实例, key(not hashKey) 默认使用String类型 private RedisTemplate<String, V> redisTemplate; // 在构造器中通过redisTemplate的工厂方法实例化操作对象 private HashOperations<String, HK, V> hashOperations; private ListOperations<String, V> listOperations; private ZSetOperations<String, V> zSetOperations; private SetOperations<String, V> setOperations; private ValueOperations<String, V> valueOperations; // IDEA虽然报错,但是依然可以注入成功, 实例化操作对象后就可以直接调用方法操作Redis数据库 @Autowired public RedisService(RedisTemplate<String, V> redisTemplate) { this.redisTemplate = redisTemplate; this.hashOperations = redisTemplate.opsForHash(); this.listOperations = redisTemplate.opsForList(); this.zSetOperations = redisTemplate.opsForZSet(); this.setOperations = redisTemplate.opsForSet(); this.valueOperations = redisTemplate.opsForValue(); } public void hashPut(String key, HK hashKey, V value) { hashOperations.put(key, hashKey, value); } public Map<HK, V> hashFindAll(String key) { return hashOperations.entries(key); } public V hashGet(String key, HK hashKey) { return hashOperations.get(key, hashKey); } public void hashRemove(String key, HK hashKey) { hashOperations.delete(key, hashKey); } public Long listPush(String key, V value) { return listOperations.rightPush(key, value); } public Long listUnshift(String key, V value) { return listOperations.leftPush(key, value); } public List<V> listFindAll(String key) { if (!redisTemplate.hasKey(key)) { return null; } return listOperations.range(key, 0, listOperations.size(key)); } public V listLPop(String key) { return listOperations.leftPop(key); } public void setValue(String key, V value) { valueOperations.set(key, value); } public void setValue(String key, V value, long timeout) { ValueOperations<String, V> vo = redisTemplate.opsForValue(); vo.set(key, value, timeout, TimeUnit.MILLISECONDS); } public V getValue(String key) { return valueOperations.get(key); } public void remove(String key) { redisTemplate.delete(key); } public boolean expire(String key, long timeout, TimeUnit timeUnit) { return redisTemplate.expire(key, timeout, timeUnit); }
5. test
@RunWith(SpringRunner.class) @SpringBootTest public class RedisTest { @Autowired RedisService redisService; @Test public void findAllUsers() { redisService.setValue("key","hello"); } @Test public void findAllUsers2() { System.out.println("get key value:"+ redisService.getValue("key")); } }
说明
- 以上是具体的配置,如果没有引入redis.clients.jedis 依赖,则会报No beans of ‘RedisConnectionFactory‘ type found.
版本则2.9.0 如果 版本低,则会报其它错误 - spring-data-redis 这个版本分为 1.x 和 2.x 版本变动挺多,不同版本方法也不一样
以上是关于29. SpringBoot Redis 非注解的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot整合SpringSeesion实现Redis缓存
SpringSecurity注解鉴权(整合springboot,jwt,redis)
Springboot集成Redis详细教程(缓存注解使用@Cacheable,@CacheEvict,@CachePut)