springboot redis(单机/集群)

前言

  前面redis弄了那么多, 就是为了在项目中使用.

  那这里, 就分别来看一下, 单机版和集群版在springboot中的使用吧.  在里面, 我会同时贴出Jedis版, 作为比较.

  

单机版

1. pom.xml 

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>1.5.9.RELEASE</version>
</dependency>

2. application.yml 

spring:
  redis:
    port: 6379
    host: 127.0.0.1
    password: redis

这里为redis设置了一个密码, 可以在 redis.conf 文件中设置: requirepass 密码

3. controller

@RestController
@RequestMapping("simple")
public class SimpleController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping("set")
    public void set(){

        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
        operations.set("1", "1a");
        operations.set("2", "2b");
        operations.set("3", "3c");
        operations.set("4", "4d");
        operations.set("5", "5e");
        operations.set("elvin", "elvin");
        operations.set("abc", "abc");
        operations.set("xingming", "xingming");
    }
}

4. Jedis

来看一下单机版redis下, Jedis是怎么玩的.

  @Test
    public void testJedisPool() throws Exception {
        // 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。
        JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
        // 第二步:从JedisPool中获得Jedis对象。
        Jedis jedis = jedisPool.getResource();
        jedis.auth("redis");
        // 第三步:使用Jedis操作redis服务器。
        String result = jedis.get("abc");
        System.out.println(result);
        // 第四步:操作完毕后关闭jedis对象,连接池回收资源。
        jedis.close();
        // 第五步:关闭JedisPool对象。
        jedisPool.close();
    }

结果我就不展示了, 通过以上步骤, 能把controller存入的数据, 读取出来.

这里有一点要注意以下, 如果步骤3用的不是StringRedisTemplate, 而是RedisTemplate, 那么通过步骤4是读取不出来的.

如果你装了 redis desktop manager , 可以使用这个去看一下, 就会知道为啥读不出来.

具体为啥会产生这样的情况呢?

可以看一下RedisTemplate的源码:

看得出来, 这里使用了 JdkSerializationRedisSerializer 来序列化 key 和 value.

直观点的话, 可以看下图:

so, 这里就能看出来, 为啥用abc直接去查, 是查不到想要的结果的.

集群版

在集群里面, 如果你使用的是 spring-boot-starter-data-redis 的话, 就会发现, 超方便, 只要改一下配置文件就可以了, 其他的都可以不改.

1. application.yml

spring:
  redis:
    cluster:
      nodes:
       - 127.0.0.1:7001
       - 127.0.0.1:7002
       - 127.0.0.1:7003
       - 127.0.0.1:7004
       - 127.0.0.1:7005
       - 127.0.0.1:7006
    password: 123456

在application里面配置集群节点.

2. controller

controller里面的方法不变, 还是用那个. 直接用 Terminal 操作查看:

确实存进去了.

3. Jedis

  @Test
    public void testJedisCluster() throws Exception {
        // 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
        Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("127.0.0.1", 7001));
        nodes.add(new HostAndPort("127.0.0.1", 7002));
        nodes.add(new HostAndPort("127.0.0.1", 7003));
        nodes.add(new HostAndPort("127.0.0.1", 7004));
        nodes.add(new HostAndPort("127.0.0.1", 7005));
        nodes.add(new HostAndPort("127.0.0.1", 7006));
        JedisCluster jedisCluster = new JedisCluster(nodes, 2000, 5, 8, "123456", new GenericObjectPoolConfig());
        // 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
        String result = jedisCluster.get("abc");
        // 第三步:打印结果
        System.out.println(result);
        // 第四步:系统关闭前,关闭JedisCluster对象。
        jedisCluster.close();
    }

这里有个比较蛋疼的事情就是, 如果集群设置了密码, 并不能通过jedisCluster.auth()方式来输入密码

刚开始, 我还以为这是不推荐使用的, 谁知道, 这tm是不能用啊. 过分了, 简直.

通过Jedis的代码, 可以发现, 单机版和集群版, 操作的对象是不一样的, 那么在开发的过程中, 怎么来统一呢?(开发的时候, 不需要使用redis集群, 上线的时候, 直接切换过去就可以了)

那么想要解决这个问题, 可以通过策略模式来解决, 定义一个操作接口, 在接口中定义方法, 我管你单机还是集群, 都要来实现这个接口. 那么在操作的过程中, 就统一到接口了. 剩下来的就是赋值和切换了.

而使用  spring-boot-starter-data-redis 就不需要考虑那么多了, 确实方便许多.

原文地址:https://www.cnblogs.com/elvinle/p/8378484.html

时间: 2024-10-10 18:03:39

springboot redis(单机/集群)的相关文章

springboot2.x版本整合redis(单机/集群)(使用lettuce)

在springboot1.x系列中,其中使用的是jedis,但是到了springboot2.x其中使用的是Lettuce. 此处springboot2.x,所以使用的是Lettuce.关于jedis跟lettuce的区别: Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接 Lett

SpringBoot集成redisson(单机,集群,哨兵)

1.springBoot集成redisson(单机,集群,哨兵) redisson版本使用3.8.2 <dependency>??????<groupId>org.redisson</groupId>??????<artifactId>redisson</artifactId>??????<version>3.8.2</version></dependency> 2.配置文件 application.prope

Redis 一二事 - 在spring中使用jedis 连接调试单机redis以及集群redis

Redis真是好,其中的键值用起来真心强大啊有木有, 之前的文章讲过搭建了redis集群 那么咋们该如何调用单机版的redis以及集群版的redis来使用缓存服务呢? 先讲讲单机版的,单机版redis安装非常简单,不多说了,直接使用命令: 1 [[email protected] bin]# ./redis-server redis.conf 启动就行 在sprig文件中配置如下 1 <!-- 2 TODO: 3 开发环境使用单机版 4 生产环境务必切换成集群 5 --> 6 <!--

Redis缓存集群方案

由于单台Redis服务器的内存管理能力有限,使用过大内存的Redis又会使得服务器的性能急剧下降,一旦服务器发生故障将会影响更大范围业务,而Redis 3.0 beta1支持的集群功能还不适合生产环境的使用.于是为了获取更好的Redis缓存性能及可用性,很多公司都研发了Redis缓存集群方案.现对NetFlix.Twitter.国内的豌豆荚在缓存集群方面的解决方案进行一个汇总,以供读者参考,具体内容如下: 1.NetFlix对Dynamo的开源通用实现Dynomite Dynomite是NetF

Redis学习笔记(11)——Redis缓存集群方案

由于单台Redis服务器的内存管理能力有限,使用过大内存的Redis又会使得服务器的性能急剧下降,一旦服务器发生故障将会影响更大范围业务,而Redis 3.0 beta1支持的集群功能还不适合生产环境的使用.于是为了获取更好的Redis缓存性能及可用性,很多公司都研发了Redis缓存集群方案.现对NetFlix.Twitter.国内的豌豆荚在缓存集群方面的解决方案进行一个汇总,以供读者参考,具体内容如下: 1.NetFlix对Dynamo的开源通用实现Dynomite Dynomite是NetF

如何利用容器实现生产级别的redis sharding集群的一键交付

作者介绍: 张春源 希云cSphere合伙人,国内早期的Docker布道者,对企业应用Docker化有丰富的实践经验,擅长利用Docker践行Devops文化.国内第一套Docker系列实战视频课程讲师,视频播放量累计10万+ 开篇: Redis在3.0之后开始支持sharding集群.Redis集群可以让数据自动在多个节点上分布.如何使用Docker实现Redis集群的一键部署交付,是一个有趣的并且有价值的话题. 本文将给大家介绍基于进程的容器技术实现Redis sharding集群的一键部署

Redis Cluster集群总结性梳理

前面已经介绍了Redis Cluster集群及其部署过程,下面再补充下有关Redis Cluster应用原理部分内容,以便更加深刻透彻地理解Redis Cluster. 一.Redis Cluster集群最核心的三个目标 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在C

Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建

[TOC] Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建 Redis Java API使用(一):单机版本Redis API使用 Redis的Java API通过Jedis来进行操作,因此首先需要Jedis的第三方库,因为使用的是Maven工程,所以先给出Jedis的依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactI

Redis(五)、Redis数据库集群相关

Redis数据库集群 第1章 集群简介 Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset),是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability). Re