Redis学习日记【二】--redis整合Springboot

24 篇文章 0 订阅
4 篇文章 0 订阅

Redis整合SpringBoot

SpringBoot操作数据:spring-data、jpa、jdbc、mongodb、redis

SpringData 也是和 Springboot齐名的项目

说明:在SpringBoot2.X之后,原来使用的jedis被替换成了lettuce

jedis:采用的直连,多个线程操作的话,不安全,如果想要避免不安全的 ,就必须使用jedis连接池

lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况。可以减少线程数量

反映到代码上,就是properties那边必须写成lettuce。不能再用jedis
Redis推荐使用lettuce

源码分析:

@Bean 
@ConditionalOnMissingBean(name = "redisTemplate") // 我们可以自己定义一个 redisTemplate来替换这个默认的! 
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { 
// 默认的 RedisTemplate 没有过多的设置,redis 对象都是需要序列化! 
// 两个泛型都是 Object, Object 的类型,我们后使用需要强制转换 <String, Object> 
RedisTemplate<Object, Object> template = new RedisTemplate<>(); 
template.setConnectionFactory(redisConnectionFactory); 
return template; 
}

@Bean 
@ConditionalOnMissingBean // 由于 String 是redis中最常使用的类型,所以说单独提出来了一 个bean! 
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { 
StringRedisTemplate template = new StringRedisTemplate(); 
template.setConnectionFactory(redisConnectionFactory); 
return template;
}

那么最后自定义的redisTemplate长什么样呢?

@Configuration
public class RedisConfig {
    // 自己定义了一个 RedisTemplate
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 我们为了自己开发方便,一般直接使用 <String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);

        // Json序列化配置
        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);
        // 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;
    }
}

在这个基础上。会定义一个RedisUtils.java,目的是为了封装好Spring-data-redis的方法然后抛出异常。

redisUtil的内容

之后,我们要想对redis进行操作,用这个工具类的方法就行。每个公司一般都有这样的一个Redis工具类

工具类编写完之后,就是我们的 应用场景了。

测试的应用场景:

@SpringBootTest
class Redis02SpringbootApplicationTests {
    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate redisTemplate;

    @Autowired
    private RedisUtil redisUtil;

    @Test
    public void test1(){
        redisUtil.set("name","kuangshen");
        System.out.println(redisUtil.get("name"));
    }

    @Test
    void contextLoads() {

        // 在企业开发中,我们80%的情况下,都不会使用这个原生的方式去编写代码!
        // RedisUtils;
        // redisTemplate  操作不同的数据类型,api和我们的指令是一样的
        // opsForValue  操作字符串 类似String
        // opsForList   操作List 类似List
        // opsForSet
        // opsForHash
        // opsForZSet
        // opsForGeo
        // opsForHyperLogLog

        // 除了进本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务,和基本的CRUD

        // 获取redis的连接对象
        //        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
        //        connection.flushDb();
        //        connection.flushAll();

        redisTemplate.opsForValue().set("mykey","关注");
        System.out.println(redisTemplate.opsForValue().get("mykey"));

    }

    @Test
    public void test() throws JsonProcessingException {
        // 真实的开发一般都使用json来传递对象
        // 该博文来自狂神说,b站搜狂神说的课堂笔记,我是二改
        User user = new User("takei", 3);
//        String jsonUser = new ObjectMapper().writeValueAsString(user);
        redisTemplate.opsForValue().set("user",user);
        System.out.println(redisTemplate.opsForValue().get("user"));
    }

}

下一篇我会在github找一个具体的项目看看redis的真实场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值