Redis笔记(六)之Jedis和Springboot整合

Jedis

什么是Jedis 是 Redis 官方推荐的 java连接开发工具! 使用Java 操作Redis 中间件!如果你要使用
java操作redis,那么一定要对Jedis 十分的熟悉!

我们要使用 Java 来操作 Redis,知其然并知其所以然,授人以渔! 学习不能急躁,慢慢来会很快!
加油!!^_^

测试

1,导入依赖

    <!--导入jedis的包-->
    <dependencies>
        <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>
    </dependencies>

2,编码测试

  • 连接数据库
  • 操作命令
  • 断开连接!
import redis.clients.jedis.Jedis;

/**
 * @author Z
 * @DATE 2020/12/13 - 11:56
 */
public class TestPing {
    public static void main(String[] args) {
        //1,new Jedis对象即可
        Jedis jedis = new Jedis("47.115.2.xxx",6379);
        //jedis 所有的命令就是我们之前学习的所有指令!所以之前的指令学习很重要!
        System.out.println(jedis.ping());

    }
}

常用的API

  • String
  • List
  • Set
  • Hash
  • Zset

所有的api命令,就是我们对应的上面学习的指令,一个都没有变化!

import redis.clients.jedis.Jedis;

import java.util.Set;

/**
 * @author Z
 * @DATE 2020/12/13 - 12:15
 */
public class TestKey {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("47.115.2.xxx",6379);
        System.out.println("清空数据:"+jedis.flushDB());
        System.out.println("判断某个键是否存在"+jedis.exists("username"));
        System.out.println("新增键值对<username,hello>"+jedis.set("username","hello"));
        System.out.println("新增键值对<password,pwd>:"+jedis.set("password","pwd"));
        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("重命名:"+jedis.rename("username","name"));
        System.out.println("取出改后的name:"+jedis.get("name"));
        System.out.println("按索引查询:"+jedis.select(0));
        System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());
        System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());
        System.out.println("删除所有数据库中的key:"+jedis.flushAll());
    }
}

事务

import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

/**
 * @author ZhaoZhiyue
 * @DATE 2020/12/13 - 12:30
 */
public class TestTX {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("47.115.2.92",6379);
        jedis.flushDB();
        JSONObject jsonpObject = new JSONObject();
        jsonpObject.put("hello","world");
        jsonpObject.put("name","zhangsan");

        //开启事务
        Transaction multi =jedis.multi();
        String result = jsonpObject.toJSONString();
        multi.watch("user2");
        try {
            multi.set("user1",result);
            multi.set("user2",result);
//            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整合

SpringBoot 操作数据:所有的接口都封装在spring-data中:包括jpa jdbc mongodb redis!
SpringData 也是和 SpringBoot 齐名的项目!
说明: 在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce
jedis : 采用的直连,多个线程操作的话,是不安全的。如果想要避免不安全的,使用 jedis pool 连接
池! 更像 BIO 模式(阻塞 )。
lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据
了,更像 NIO 模式

源码分析:

    @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;
    }

整合测试

  1. 导入依赖
<!-- 操作redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置链接
#SpringBoot所有的配置类都有一个自动配置类 RedisAutoConfiguration
#自动配置类都会绑定一个properties配置文件 RedisProperties

#配置Redis
spring.redis.host=47.115.2.92
spring.redis.port=6379
#连接池等配置lettuce才生效
  1. 测试
package com.zzy;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class Redis02SpringbootApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
    //在企业开发中,80%的情况下,都不会使用这种原生的方式去编写代码
    //RedisUtils,去百度看!
    
    // redisTemplate 操作不同的数据类型,api和我们的指令是一样的:

    // opsForValue 操作字符串 类似String
    // opsForList 操作List 类似Lis
    // opsForSet
    // opsForHash
    // opsForZSet
    // opsForGeo
    // opsForHyperLogLog

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


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

        redisTemplate.opsForValue().set("mykey","关注狂神说公众号");//在redis客户端查到的是乱码,后续解决
        System.out.println(redisTemplate.opsForValue().get("mykey"));
    }

}

在这里插入图片描述
在这里插入图片描述
所有的对象都需要序列化
在这里插入图片描述
序列化后正常运行
在企业中,所有的poojo都会序列化
在这里插入图片描述

自己写了一个RedisTemplete

package com.zzy.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
   //这是kuangshen给大家写好的一个固定模板,大家在企业中,拿去就可以直接使用!
   // 自己定义了一个 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;
    }
}

选择自己写的redisTemplate
在这里插入图片描述
执行测试,不再乱码
在这里插入图片描述

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

本博客为该视频的笔记
狂神说Java】Redis最新超详细版教程通俗易懂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值