zoukankan      html  css  js  c++  java
  • springboot整合redis

    springboot整合redis

    • 简介

    springboot2.x之后原来底层操作redis使用的jedis被替换成了lettuce

    jedis:采用直连,多个线程同时操作是不安全的,如果想要避免不安全,就要使用jedis pool连接池,但是比较麻烦,类似BIO模式

    lettuce:采用netty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,类似NIO模式

    • springboot知识回顾

    所有的配置类,都有一个自动配置类,自动配置类都会绑定一个properties文件

    我们可以找到springboot自动配置类的jar包里的META-INF下的spring.factories文件查看redis自动配置类源码

    • 源码简单说明:
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(RedisOperations.class)
    @EnableConfigurationProperties(RedisProperties.class)
    @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
    public class RedisAutoConfiguration {
    
    	@Bean
    	@ConditionalOnMissingBean(name = "redisTemplate")//我们可以自定义一个redisTemplate来替换这个默认的
    	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            //默认的redisTemplate没有过多的设置,注意:redis对象都是需要序列化的
            //两个泛型都是object类型,我们使用的时候需要强制转换
    		RedisTemplate<Object, Object> template = new RedisTemplate<>();
    		template.setConnectionFactory(redisConnectionFactory);
    		return template;
    	}
    
    	@Bean
    	@ConditionalOnMissingBean//由于string类型是redis中最常用的,所以单独提供了一个bean
    	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
    		StringRedisTemplate template = new StringRedisTemplate();
    		template.setConnectionFactory(redisConnectionFactory);
    		return template;
    	}
    
    }
    

    springboot整合redis案例

    • 导包
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    • 配置文件
    spring:
      redis:
        host: 192.168.244.129
        port: 6379
    
    • 默认api的使用
    @SpringBootTest
    class RedisSpringboot01ApplicationTests {
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Test
        void contextLoads() {
            //操作字符串类型对象,其他类型以此类推,工作中不会直接使用原生对象进行操作,一般都会封装一个RedisUtils来使用
            ValueOperations valueOperations = redisTemplate.opsForValue();
            valueOperations.set("user1","yl01");
            System.out.println(valueOperations.get("user1"));
            //获取redis数据库连接,可以通过connection操作数据库,eg:清空数据库
            RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
        }
        
        @Test
        public void test() throws JsonProcessingException {
            User user = new User("yl01", 18);
    		//将对象转成字符串进行传输,如果不转字符串直接进行传输则必须实现序列化接口
            String jsonUser=new ObjectMapper().writeValueAsString(user);
    
            redisTemplate.opsForValue().set("user1",jsonUser);
            System.out.println(redisTemplate.opsForValue().get("user1"));
        }
    
    }
    
    • 自定义redisTemplate
    /**
     * redis配置类
     */
    @Configuration
    public class RedisConfig {
    
        @Bean
        public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<String, Object> template = new RedisTemplate<>();//为了开发方便,一般直接使用<String,Object>
            template.setConnectionFactory(redisConnectionFactory);
    
            //json序列化配置
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper objectMapper=new ObjectMapper();
            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
            //string的序列化
            StringRedisSerializer stringRedisSerializer=new StringRedisSerializer();
    
            //key采用string的序列化方式
            template.setKeySerializer(stringRedisSerializer);
            //hash的key也采用string的序列化方式
            template.setHashKeySerializer(stringRedisSerializer);
            //value序列化采用jackson
            template.setValueSerializer(jackson2JsonRedisSerializer);
            //hash的value序列化采用jackson
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
            template.afterPropertiesSet();
    
            return template;
        }
    
    }
    
    记得快乐
  • 相关阅读:
    AngularJS双向绑定,手动实施观察
    AngularJS的Hello World
    LESS碎语
    chrome浏览器调试报错:Failed to load resource: the server responsed width a status of 404 (Not Found)…http://127.0.0.1:5099/favicon.ico
    AngularJS报错:[$compile:tpload]
    Javascript中的依赖注入
    使用HTML5和CSS3碎语
    在Brackets中使用Emmet
    使用Brackets
    Bootstrap碎语
  • 原文地址:https://www.cnblogs.com/Y-wee/p/14560768.html
Copyright © 2011-2022 走看看