springboot整合spring-data-redis

本文介绍了如何使用SpringDataRedis进行快速入门,包括引入相关依赖、配置文件设置、核心代码示例,以及如何解决序列化问题。此外,还详细讲解了操作不同类型数据的方法,并展示了如何配置Redis的哨兵模式以实现高可用性。
摘要由CSDN通过智能技术生成

前言

官方网站:Spring Data Redis

其实,整合是一个循序渐进的学习,你肯定是要了解之前底层的相关知识,才能够具体知道现在框架方法api到底tm有什么作用,所以建议先看看我之前的redis博客。

可以不看,但是可以以我这个为目录,针对性得去了解相关知识(学习任何东西,都应该这样)。

(41条消息) Cenos7 --- Redis下载和安装(Linux版本)_本郡主是喵的博客-CSDN博客

(41条消息) redis学习 -- 常用指令_本郡主是喵的博客-CSDN博客

(41条消息) redis -- 持久化存储方案_本郡主是喵的博客-CSDN博客

(41条消息) redis的4种模式,单机,哨兵、主从复制、集群_本郡主是喵的博客-CSDN博客

1.快速入门

1.1导入相关依赖

	<!--spring-data-redis组件-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
		<!--commons-pools连接池,lettuce没有内置的数据库连接池所以要用第三方的 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>
		<!--web组件-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--test组件-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

1.2 配置文件

application.yml

server:
  port: 8080


# redis配置
spring:
  redis:
    password: 123456
    # 默认0库
    database: 0
    #连接超时时间
    timeout: 10000ms
    port: 6379
    host: 192.168.88.135
    lettuce:
      pool:
        # 设置最大连接数
        max-active: 1024
        # 最大阻塞时间
        max-wait: 10000ms
        # 最大空间连接,默认8
        max-idle: 200
        # 最小空间连接,默认5
        min-idle: 5

1.3 核心代码

@SpringBootTest
class SpringDataRedisDemo1ApplicationTests {

    @Autowired
    // 这一种完全够用(与第二种,稍微一点差别,具体看下文)
    private RedisTemplate redisTemplate;
    @Autowired
    // 转对redis的string类型的
    private StringRedisTemplate stringRedisTemplate;
   


    @Test
    void testDemo() {
        ValueOperations value = redisTemplate.opsForValue();
        value.set("qhx","name");
        System.out.println(value.get("qhx"));
        
        ValueOperations<String, String> stringValueOperations = stringRedisTemplate.opsForValue();
        System.out.println(stringValueOperations.get("name"));


    }

}

此处可以忽略。

我们在application.yml配置文件信息,按住ctrl + 单击点进去,发现是一个映射redis配置信息的类。

 就是,假如有些配置你不知道,可以依托这个去相应的官网文档上去查找相应的用法。

1.4 自定义模版解决序列化问题

打开redis可视化客户端,发现我们成功存入数据,但是是java字节数据。如何解决?

先看下图。

 RedisConfig.java

@Configuration
public class RedisConf {
    @Bean
  public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        // 为string 的key设置序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 为string类型的value设置序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 为hash类型的value设置json序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // 为hash类型的key设置json序列化
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 设置数据库连接池
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        return redisTemplate;
    }
}

再次运行。

成功!

此处可以忽略。

可以看出,我们设置key先转成java字节数据,最后存入数据库中。

自定义后,我们设置key先转成java string数据,最后存入数据库中。

2.操作各种类型数据

此处可以忽略

其实,这些api如果你没有学过,需要跟着敲一遍,敲得途中你可能会发现这些api的意思(有基础的前提下)。

2.1 操作string类型数据

 // 添加一条数据
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("name","zhangsan");
        // 获取一条数据
        String name = (String) ops.get("name");
        System.out.println(name);
        // 层级关系
        ops.set("user:01","lisi");
        // 添加多条数据
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("age","20");
        hashMap.put("address","wei");
        ops.multiSet(hashMap);
        // 获取多条数据
        ArrayList<Object> list = new ArrayList<>();
        list.add("age");
        list.add("address");
        List listValue = ops.multiGet(list);
        listValue.forEach(System.out::println);

2.2 操作hash类型数据

  HashOperations hashOps = redisTemplate.opsForHash();
        // 添加hash单条数据
        hashOps.put("user","name","qhx");
        // 获取hash单条数据
        String hash = (String) hashOps.get("user", "name");
        // 添加hash多条数据
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("age","20");
        hashMap.put("address","wei");
        hashOps.putAll("user",hashMap);
        // 获取hash类型的多条数据
        ArrayList<String> list = new ArrayList<>();
        list.add("age");
        list.add("address");
        List user = hashOps.multiGet("user", list);
        user.forEach(System.out::println);
        // 获取hash类型所有数据
        Map entries = hashOps.entries("user");
        entries.forEach((key,value)->{
            System.out.println(key+"-->"+value);
        });
          // 删除Hash类型数据
        hashOps.delete("user","age","name");

2.3 操作list类型数据

 ListOperations listOps = redisTemplate.opsForList();
        // 左添加
        listOps.leftPush("students","w1");
        listOps.leftPushAll("students","w2","w3");
        // 右添加
        listOps.leftPush("students","w4");
        // 在w1前面左添加w0
         listOps.leftPush("students","w1","w0");
        // 获取数据
        List list = listOps.range("students", 0, 4);
        System.out.println(list);
        // 获取总条数
        Long students = listOps.size("students");
        // 删除1条数据
        listOps.remove("students",1,"w0");
        // 左弹出
        listOps.leftPop("students");
        listOps.rightPop("students");

2.4 操作set类型数据

 SetOperations setOps = redisTemplate.opsForSet();
        // 添加数据
        setOps.add("ids","1","2");
        // 获取数据
        Set ids = setOps.members("ids");
        ids.forEach(System.out::println);
        // 删除数据
        setOps.remove("ids","1","2");

2.5 操作sorted-set类型数据

 ZSetOperations zSetOps = redisTemplate.opsForZSet();
        // 添加多条数据(我自己也属实看不懂)将数据封装到hash里。
        ZSetOperations.TypedTuple<Object> objectTypedTuple1 = new DefaultTypedTuple<>("wls",1D);
        ZSetOperations.TypedTuple<Object> objectTypedTuple2 = new DefaultTypedTuple<>("qhx",2D);
        ZSetOperations.TypedTuple<Object> objectTypedTuple3 = new DefaultTypedTuple<>("zlx",3D);
        Set<ZSetOperations.TypedTuple> tuples = new HashSet<>();
        tuples.add(objectTypedTuple1);
        tuples.add(objectTypedTuple2);
        tuples.add(objectTypedTuple3);
        zSetOps.add("names",tuples);
        // 添加单条数据
        zSetOps.add("names","qhx1",4D);
        // 获取数据
        Set names = zSetOps.range("names", 0, 3);
        names.forEach(System.out::println);
        // 删除数据
        zSetOps.remove("names","qhx","wls");

2.6 获取所有的key和给key设置过期时间

  // 获取所有的keys(当前数据库)
        Set keys = redisTemplate.keys("*");
        keys.forEach(System.out::println);
        // 给已存在key设置失效时间
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("name","qhx",200, TimeUnit.SECONDS);
        // 给key设置失效时间
       redisTemplate.expire("age",30,TimeUnit.SECONDS);

3.配置哨兵模式

先在redis中启用哨兵模式。

还有别忘了用Linux防火墙把相应的端口打开(或者,直接关闭防火墙)。

1.方式一,在aplication.yml文件中新加 spring.redis.sentinel

预览图:

 sentinel:
      # 主节点名称
      master: mysaster
      # 主服务器密码
      password: 123456
      # 哨兵节点
      nodes: 192.168.88.135:26379,192.168.88.135:26380,192.168.88.135:26381

2.方式二,

在上文RedisCong.java中添加

    @Bean
    public RedisSentinelConfiguration redisSentinelConfiguration(){
        RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration()
                // 主节点名称
                .master("mymaster")
                // 哨兵
                .sentinel("192.168.88.135",26379)
                .sentinel("192.168.88.135",26380)
                .sentinel("192.168.88.135",26381);
                // 密码
                redisSentinelConfiguration.setPassword("123456");
                return redisSentinelConfiguration;
    }

Spring Boot中使用Spring Data Redis进行Redis Geo操作,需要在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.6.0</version> </dependency> ``` 然后在application.properties文件中配置Redis相关信息: ```properties # Redis spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= ``` 接下来,我们需要创建一个RedisGeoService来进行Geo操作: ```java @Service public class RedisGeoService { private final RedisTemplate<String, String> redisTemplate; public RedisGeoService(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } /** * 添加地理位置信息 * * @param key 键 * @param longitude 经度 * @param latitude 纬度 * @param member 成员 * @return Long */ public Long add(String key, double longitude, double latitude, String member) { Point point = new Point(longitude, latitude); return redisTemplate.opsForGeo().add(key, point, member); } /** * 获取两个地理位置的距离 * * @param key 键 * @param member1 成员1 * @param member2 成员2 * @param unit 距离单位 * @return Distance */ public Distance distance(String key, String member1, String member2, Metric unit) { return redisTemplate.opsForGeo().distance(key, member1, member2, unit); } /** * 获取指定成员的地理位置 * * @param key 键 * @param members 成员 * @return List<Point> */ public List<Point> position(String key, String... members) { return redisTemplate.opsForGeo().position(key, members); } /** * 获取指定地理位置附近的成员 * * @param key 键 * @param longitude 经度 * @param latitude 纬度 * @param radius 半径 * @param unit 距离单位 * @return GeoResults<GeoLocation<String>> */ public GeoResults<GeoLocation<String>> nearBy(String key, double longitude, double latitude, double radius, Metric unit) { Circle circle = new Circle(longitude, latitude, new Distance(radius, unit)); GeoRadiusCommandArgs args = GeoRadiusCommandArgs.newGeoRadiusArgs().sortAscending(); return redisTemplate.opsForGeo().radius(key, circle, args); } } ``` 上述代码中,我们使用了RedisTemplate来进行Redis操作。RedisTemplate是Spring Data Redis提供的核心组件,用于执行Redis命令。 在RedisGeoService中,我们定义了四个方法来进行Geo操作: - add方法:添加地理位置信息。 - distance方法:获取两个地理位置的距离。 - position方法:获取指定成员的地理位置。 - nearBy方法:获取指定地理位置附近的成员。 使用Spring BootSpring Data Redis进行Geo操作非常方便,只需要定义一个RedisGeoService,并注入RedisTemplate即可。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

本郡主是喵

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值