SpringBoot整合Redis

通过Jedis整合

导入maven依赖

<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>

使用Jedis

public static void main(String[] args) {
        //通过jedis创建连接
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //创建json
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("hello", "world");
        jsonObject.put("name", "purpleStars");
        String result = jsonObject.toJSONString();
        //清空数据库
        jedis.flushDB();
        //开启事务
        Transaction multi = jedis.multi();
        //通过watch关键词监控实现乐观锁
        multi.watch(result);
        try {
            multi.set("user", result);
            multi.exec();   //执行事务
        } catch (Exception e) {
            multi.discard();    //放弃事务
            e.printStackTrace();
        } finally {
            System.out.println(jedis.get("user"));
            jedis.close();  //关闭连接
        }
    }

Jedis其实就是封装的一个redis操作类,可以进行redis中的操作。

通过SpringData整合

导入依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

首先我们来了解一下SpringBoot实现redis的模板RedisTemplate,首先进入redis配置类RedisAutoConfiguration。
在这里插入图片描述

由上图可知,在SpringData中默认有两种Redis的实现,分别为Lettuce和Jedis。

而Spring2.0以后默认的实现为Lettuce,那么Lettuce和Jedis的区别是什么呢?

  • Lettuce
    Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,因为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
    lettuce主要利用netty实现与redis的同步和异步通信。
  • Jedis
    Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接。

那么除此之外还可以发现SpringData为我们提供了两个默认的redisTemplate
在这里插入图片描述
可知默认的RedisTemplate是Object类型的,而且@ConditionalOnMissingBean注解表明如果自定义自己的redisTemplate则默认的会失效。
那么我们则可以自定义RedisTemplate。

@Configuration      //表明自己是config配置类
public class RedisConfig {

    //自定义自己的RedisTemplate
    @Bean       //将自己注入SpringIOC容器
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        //自定义RedisTemplate<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采用String序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        //value采用jackson序列化方式
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //hash的value序列化采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

上述RedisTemplate则可以自定义自己的序列化类型。使用@Configuration标注自己是配置类,并使用@Bean将redisTemplate注入到容器SpringIOC容器中其他类则可以从容器中取出自定义redisTemplate进行redis相关操作。

  • redisTemplate基本操作
    opsForValue 操作字符串 类似String
    opsForList 操作List
    opsForSet 操作Set
    opsForHash 操作Hash
    opsForZSet 操作ZSet
    opsForGeo 操作Geo(地图)类型
    opsForHyperLogLog 操作opsForHyperLogLog类型
  • 常用的可以直接用redisTemplate来操作
    获取redis连接对象
    RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
    connection.flushDb();
    connection.flushAll();

测试自定义序列化的RedisTemplate

    @Test
    public void test() throws JsonProcessingException {
        User user = new User("紫色星辰",3);
//		json序列化        
//      String jsonUser = new ObjectMapper().writeValueAsString(user);	
        redisTemplate.opsForValue().set("user",user);
        Object userData = redisTemplate.opsForValue().get("user");
        System.out.println(userData);
    }

控制台输出
User(name=紫色星辰, age=3)

查询redis数据库的key的值,已经被序列化为String

在这里插入图片描述
因此,同Jedis一样,只需要实例化一个RedisTemplate模板就可以对redis进行操作了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值