Redis(五)——Redis的Java客户端

导读:本篇文章讲解 Redis(五)——Redis的Java客户端,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Redis(五)——Redis的Java客户端

目录

Jedis

快速入门

Jedis的连接池

SpringDataRedis

快速入门

RedisTemplate的RedisSerializer

StringRedisTemplate

RedisTemplate操作Hash类型


Jedis

快速入门

Jedis里的许多方法名就是命令名称

  • 1.引入依赖
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.2.0</version>
        </dependency>
  • 2.建立连接
    private Jedis jedis ;

    //这个注释意思是每次@Test方法前都会执行的这段,下面每个@Test就不用重复写这段了,抽取出来
    //@BeforeEach表示执行测试方法之前会先执行该方法
    @BeforeEach
    void setUp() {
        //建立连接
        jedis = new Jedis ("192.168.150.101",6379) ;
        //设置密码
        jedis. auth("123321") ;
        //选择库
        jedis . select(0);
    }
  •  3.测试String和Hash(其他类型相似操作)
@Test
void testString() {
    //插入数据,方法名称就是redis命令名称,非常简单
    String result = jedis.set("name","张三");
    System.out.printlf("result =”+ result);
    //获取数据
    String name = jedis.get("name");
    System.out.println("name = " + name);
}

@Test 
void testHash() {
    //插入hash 数据
    jedis.hset("user:1","name","Jack") ;
    jedis.hset("user:1","age","21") ;
    //获取
    Map<String,String> map = jedis.hgetAll("user:1");
    System.out.println(map) ;
}
  • 4.释放资源
@AfterEach
void tearDown() {
    //释放资源
    if (jedis != null) {
    jedis. close();
    }
}

Jedis的连接池

        Jedis是线程不安全的,如果说在多线程的环境下并发的去访问,大家都来去使用,Jedis是有可能出现线程安全问题的,在并发的环境下,Jedis一定要给每一个线程创建独立的对象,那此时最好的方案是使用线程池,因为频繁的创建和销毁这类的对象是有很大的一个线程损耗的。
Redis(五)——Redis的Java客户端

JedisPool里是连接的一些参数,Config传的是池的一些参数。

最大连接:这个连接池最多创建8个连接,再多就不行了。

最大空闲连接:即使没有人来连接连接池,那么这个连接池最多也可以预备八个连接,这样如果有人来了,就可以直接拿来用,不用在创建连接了。
最小空闲连接:这些空闲连接在一段时间后就会被清理,设置最小空闲连接用来保留n个连接不被清理。

最长等待时间:当连接池里没有连接可用的时候,我们要不要等待?等待多长时间?默认值为-1,无限等待,直到有新的空闲连接为止。

@BeforeEach 
void setUp() {
    // 1.建立连接
    // jedis = new Jedis("192.168.150.101",6379) ;
    jedis = JedisConnectionFactory.getJedis();
    // 2.设置密码
    jedis.auth( password:"123321");
    // 3.选择库
    jqdis.select(0) ;
}

SpringDataRedis

Redis(五)——Redis的Java客户端

        Redis将命令根据类型进行了分组,而RedisTemplate也做了这件事,内部根据类型提供了各种API,返回不同的对象,对象里面封装的就是对于该类型的各种操作,利用对象封装的形式,把不同数据类型的方法封装到不同对象里去了。

Redis(五)——Redis的Java客户端

快速入门

  • 1.引入依赖
<!--Redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
  • 2.配置文件
spring:
    redis:
        host: 192.168.150.101
        port: 6379
        password: 123321
        lettuce:    #此时可以用lettuce也可以用jedis
            pool:
                max-active: 8 #最大连接
                max-idle: 8 #最大空闲连接
                min-idle: 0 #最小空闲连接
                max-wait: 100ms #连接等待时间

Redis(五)——Redis的Java客户端

  • 3.注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
  • 4.编写测试
@SpringBootTest
public class RedisTest {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void testString() {
        //插入一条string类型数据
        redisTemplate.opsForValue().set("name","李四") ;
        //读取一条string类型数据
        Object name = redisTemplate.opsForValue().get("name") ;
        System.out.println("name=”+name) ;
    }
}

Redis(五)——Redis的Java客户端

 SpringDataRedis的使用步骤: 
1.引入spring-boot-starter-data-redis依赖
2.在application.yml配置Redis信息
3.注入RedisTemplate

RedisTemplate的RedisSerializer

上述测试出现的问题:

Redis(五)——Redis的Java客户端

剖析:

Redis(五)——Redis的Java客户端

默认的JDK序列化方式:

Redis(五)——Redis的Java客户端

解决:更改RedisTemplate的序列化方式

一般key都为字符串,故key序列化用StringRedisSerializer

一般value都是对象,建议使用GenericJackson2JsonRedisSerializer

Redis(五)——Redis的Java客户端

 Redis(五)——Redis的Java客户端

        定义一个Bean叫做RedisTemplate,定义泛型key是string,value是object,先创建Template,然后连接工厂,连接工厂由springboot创建,我们只需要注入进来即可,然后设置序列化工具,一顿操作之后把redisTemplate返回。

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();

        //创建字符串序列化工具
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();

        //创建并设置JSON序列化工具
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();//Objectmapper是jackson的依赖,目的把对象写成json格式
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        //设置连接工厂
        template.setConnectionFactory(factory);
        //设置key序列化方式
        template.setKeySerializer(redisSerializer);
        template.setHashKeySerializer(redisSerializer);
        //设置value序列化方式
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }
}

value(“虎哥”)作为 字符串可以正常传入了

Redis(五)——Redis的Java客户端

value作为对象也可以正常传入

Redis(五)——Redis的Java客户端

        当获取结果的时候还能自动地反序列化成对象(存的时候将对象转化为JSON,取的时候将JSON转换为对象)。Redis(五)——Redis的Java客户端

StringRedisTemplate

将JSON反序列化为对象需要@class字节码来标识需要转化为哪个对象。

Redis(五)——Redis的Java客户端

Redis(五)——Redis的Java客户端

Redis(五)——Redis的Java客户端

 存储结果:

Redis(五)——Redis的Java客户端

RedisTemplate的两种序列化实践方案
方案一:
        1.自定义RedisTemplate
        2.修改RedisTemplate的序列化器 为Generi cJackson2JsonRedisSerializer
方案二:
        1.使用StringRedisTemplate
        2.写 入Redis时,手动把对象序列化为JSON
        3.读取Redis时, 手动把读取到的JSON反序列化为对象

RedisTemplate操作Hash类型

在hash里面一个key可以对应多个值

注意,Hash类型存数据不用hset

Redis(五)——Redis的Java客户端

而是用put(因为对应JAVA中的HashMap,干脆直接用put了,更接近Java的编程习惯) 

Redis(五)——Redis的Java客户端

@Test
void testHash() {
    stringRedisTemplate.opsForHash().put("user:400","name","虎哥");
    stringRedisTemplate.opsForHash().put("user:400","age","21");
    Map<Object, object> entries = stringRedi sTemplate.opsForHash().entries("user:400") ;
    System.out.println("entries =”+ entries);
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99439.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!