springboot第九课:springboot整合redis(1)

本文介绍如何使用Java和Spring Boot连接及操作Redis数据库。包括使用Jedis客户端库进行基本的字符串和哈希类型操作,以及Spring Boot整合Redis的配置与示例代码。同时对比了StringRedisTemplate和RedisTemplate的不同之处。

一、java连接redis

1 引入redis的依赖------>jedis

    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.3.0</version>
        </dependency>
    </dependencies>

2 java代码操作redis

 		//获取连接对象
        Jedis jedis=new Jedis("192.168.205.33",6379);//默认连接的是localhost,端口号为6379
        //操作redis数据库---------String类型
        jedis.set("k1","aa");
        jedis.set("k2","bb");
        jedis.setnx("k1","cc");
        jedis.mset("k3","33","k4","44");
        List<String> mget= jedis.mget("k1","k2");
        System.out.println(mget);

在这里插入图片描述

public class RedisTest {
    public static void main(String[] args) {
        //获取连接对象
        Jedis jedis=new Jedis("192.168.205.33",6379);//默认连接的是localhost,端口号为6379
        //操作redis数据库---------String类型
        jedis.set("k1","aa");
        jedis.set("k2","bb");
        jedis.setnx("k1","cc");
        jedis.mset("k3","33","k4","44");
        List<String> mget= jedis.mget("k1","k2");
        System.out.println(mget);
        jedis.flushAll();

        //操作hash类型
        Map<String,String> map=new HashMap<>();
        map.put("name","aa");
        map.put("age","18");
        map.put("sex","女");
        jedis.hset("k1",map);

        Map<String, String> map1 = jedis.hgetAll("k1");
        System.out.println(map1);
        
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);
    }
}

二、springboot整合redis

1 依赖---->启动依赖---->自动装配---->自动读取配置

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

stringboot对redis的操作封装了两个工具类:RedisTemplate、StringRedisTemplate

StringRedisTemplate 与 RedisTemplate 的区别
StringRedisTemplate 继承了 RedisTemplate。
RedisTemplate 是一个泛型类,而 StringRedisTemplate 则不是。
StringRedisTemplate 只能对 key=String,value=String 的键值对进行操作,RedisTemplate 可以对任何类型的 key-value 键值对操作。
他们各自序列化的方式不同,但最终都是得到了一个字节数组,殊途同归,StringRedisTemplate 使用的是 StringRedisSerializer 类;RedisTemplate 使用的是 JdkSerializationRedisSerializer 类。反序列化,则是一个得到 String,一个得到 Object
两者的数据是不共通的,StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据,RedisTemplate 只能管理 RedisTemplate中 的数据。

2 代码测试--------StringRedistemplate


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.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.RedisSerializer;

import java.util.HashMap;

@SpringBootTest
class RedisApplicationTests {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;   //存放的数据格式为String类型

    @Test
    void contextLoads() {
        //操作的是String类型------------------------使用StringRedisTemplate
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        ops.set("k1","aa");
        System.out.println(ops.get("k1"));
        Boolean aboolean =ops.setIfAbsent("k2","bbbbbbbbbb");
        System.out.println(aboolean);
        HashMap<String,String> map = new HashMap<>();
        map.put("name","aaaaaa");
        map.put("age","16");
        ops.multiSet(map);
        System.out.println(stringRedisTemplate.keys("*"));

    }

}

package com.xxx.redis;

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.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.RedisSerializer;

import java.util.HashMap;

@SpringBootTest
class RedisApplicationTests {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;   //存放的数据格式为String类型

    @Test
    void contextLoads() {
        //操作hash类型 HashOperations<String, Object, Object>
        HashOperations hash = stringRedisTemplate.opsForHash();
        hash.put("k1","name","aaaaaaaaaa");
        hash.put("k1","age","16");
        Object o = hash.get("k1", "name");
        System.out.println(hash.keys("k1"));
        System.out.println(hash.values("k1"));
        System.out.println(o);
        System.out.println(hash.entries("k1"));
    }

}

3 代码测试----------RedisTemplate

它的key和value可以存放Object类型,那么它的key和value默认采用的序列化方式为JDK序列化方式。一般我们需要为key和value指定序列化方式。

​redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer()); 

@SpringBootApplication
public class RedisTest2 {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void contextLoaads(){
	    //因为RedisTemplate默认会为key和value进行序列  按照JDK的序列化方式进行的,
        //再实际开发过程中不用默认的序列化方式。空间少  而且不用为实体类实现序列化接口
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());


        ValueOperations valueOperations = redisTemplate.opsForValue();
  		//可以指定key的序列化方式
        valueOperations.set("k4",new User("aa",14,"男"));

        Object k = valueOperations.get("k4");
        System.out.println(k);

    }
}
@SpringBootApplication
public class RedisTest2 {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoadsHash() {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        HashOperations hash = redisTemplate.opsForHash();
        hash.put("k5","name","ccccc");
        hash.put("k5","age",16);
        hash.put("k5","sex","男");
    }
}

4 连接集群

哨兵模式
Redis哨兵模式

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。
哨兵模式概述
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

在这里插入图片描述
详解redis的哨兵模式和集群模式

集群:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值