Redis整合SpringBoot

本文主要介绍SpringBoot集成Redis的使用,用于我们实际场景的中的各种开发

Jedis

Jedis,是Redis官方推荐的Java连接开发工具,使用Java操作Redis的中间件。所以我们需要对Jedis十分熟悉才能很好的用Java操作Redis

1、导入相关依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.2.0</version>
</dependency>
<!--fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>

2、连接数据库,并且ping尝试

public static void main(String[] args) {
    //1、 new Jedis 对象
    Jedis jedis = new Jedis("8.142.14.138",6379);
    //输入连接密码
    jedis.auth("123456");
    // jedis所有的命令就是API中的命令
    System.out.println(jedis.ping());
}

3、常用的API调试

public static void main(String[] args) {
    //1、 new Jedis 对象
    Jedis jedis = new Jedis("8.142.14.138",6379);
    //输入连接密码
    jedis.auth("123456");
    // jedis所有的命令就是API中的命令
    System.out.println("清空数据:"+jedis.flushDB());
    System.out.println("判断某个键是否存在:"+jedis.exists("username"));
    System.out.println("新增'<'username','bobo'>的键值对:"+jedis.set("username","bobo"));
    System.out.println("新增'<'password','password'>的键值对:"+jedis.set("password","password"));
    System.out.println("系统中所有键如下:");
    Set<String> keys = jedis.keys("*");
    System.out.println(keys);
    System.out.println("删除password:"+jedis.del("password"));
    System.out.println("判断键password是否存在:"+jedis.exists("password"));
    System.out.println("查看键username所存储的值的类型:"+jedis.type("username"));
    System.out.println("随机返回key空间的一个元素:"+jedis.randomKey());
    System.out.println("重命名key:"+jedis.rename("username","name"));
    System.out.println("去除改后的name:"+jedis.get("name"));
    System.out.println("按索引查询:"+jedis.select(0));
    System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());
    System.out.println("删除当前选择数据库中的所有:"+jedis.flushDB());
    System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());
    System.out.println("删除所有数据库中的所有key:"+jedis.flushAll());
    }

4、调试事务

public static void main(String[] args) {
    Jedis jedis = new Jedis("8.142.14.138",6379);
    jedis.auth("123456");
    jedis.flushDB();
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("hello","world");
    jsonObject.put("name","bobo");
    Transaction multi = jedis.multi();
    String res = jsonObject.toJSONString();

    //开启事务
    try{
        multi.set("user1",res);
        multi.set("user2",res);
        int i = 1/0;
        multi.exec();   //执行事务
    }catch (Exception e){
        multi.discard();    //放弃事务
        e.printStackTrace();
    }finally {
        System.out.println(jedis.get("user1"));
        System.out.println(jedis.get("user2"));
        jedis.close();
    }
}

SpringBoot整合Redis

1、导入依赖,在SpringBoot2.x之后,原来使用的jedis被替换为了lettuce

jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,只能用jedis pool连接池。 BIO

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

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

源码分析:

@Bean
@ConditionalOnMissingBean(
    name = {"redisTemplate"}
)
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)	//可以自定义redisTemplate
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    //默认的RedisTemplate 没有过多的设置,redis 对象都是需要序列化的
    //两个泛型都是Obeject类型,所以后面需要强转 <String,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;
}

2、配置连接

#redis配置
spring:
  redis:
    host: 8.142.14.138
    port: 6379
    password: 123456	//一般连接远程服务器需要密码,如果是本地一般不用密码

3、测试连接

@Test
void contextLoads() {

//redisTemplate 操作不同的数据类型用opsForxxx,api和直接linux操作一样
//opsForValue   操作字符串 类似String
//opsForList    操作list  类似list
//...   五大数据类型

//除了基本的操作,常用的方法可以直接通过redisTemplate操作,比如事务、CRUD
/*        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
System.out.println(connection.ping());
connection.flushDb();
connection.flushAll();*/

redisTemplate.opsForValue().set("mykey","bobo");
System.out.println(redisTemplate.opsForValue().get("mykey"));
}

注意:

@Test
public void test() throws JsonProcessingException {
    //真是的开发一般都使用json来传递对象
    User user = new User("龚剑波", 3);
    //用于将user对象序列化,如果对象未被序列化,则会直接报错
    //所以在企业中,所有的pojo,都需要进行序列化操作
    String jsonUser = new ObjectMapper().writeValueAsString(user);
    redisTemplate.opsForValue().set("user",user);
    System.out.println(redisTemplate.opsForValue().get("user"));
}

redis的对象都需要进行序列化操作,如果直接进行set操作,会报未被序列化的错误

所以在企业中,所有的pojo,都需要进行序列化操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8CbCjhr9-1629641509455)(/textImgs/image-20210614234458914.png)]

由于默认的是JDK序列化方式,传入到redis中并不是我们实际的String,还有一些其他的特殊请求等等问题是,这里就可以自定义配置redisTemplate

@Configuration
public class RedisConfig {

    //由于我们的redis对象都需要序列化操作,这里我们自定义编写RedisTemplate
    //默认使用的JDK的序列化方式,我们也可以自定义序列化的方式
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
       //为了开发方便,一般使用<String,Object>
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);

        //序列化配置
        Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //用ObjectMapper来进行转义
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectJackson2JsonRedisSerializer.setObjectMapper(om);
        //String 的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        //value采用jackson的序列化方式
        template.setValueSerializer(objectJackson2JsonRedisSerializer);
        //hash的key采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        //hash的value采用jackson的序列化方式
        template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
        //将所有的properties进行set
        template.afterPropertiesSet();

        return template;
    }
}

所有的redis操作,其实对于Java开发人员来说,十分的简单,更重要的是去理解redis的思想和每一种数据结构的用处和应用场景


如果你觉得这篇文章对您有帮助的话,麻烦帮我点个点个赞关注一下吧,创作不易,有你的支持才是我前进的动力~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听弧丶

你的鼓励将是我最大的前进动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值