zoukankan      html  css  js  c++  java
  • Spring Boot使用Spring Data Redis操作Redis(单机/集群)

    说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和Jedis客户端,可以减少版本这块的冲突,当然,如果要引入别的版本也是可以的。版本控制全部交由Parent引入的Spring Boot节点进行管理!,建议不要引入最新版本的spring-boot-starter-data-redis,避免造成其它冲突。

    有个假设:如果在使用Spring/Spring MVC项目时引入的Spring Data Redis和Jedis客户端时如果存在版本问题,出现莫名奇怪的问题,那么可以使用Spring Boot每个版本对应使用的Spring Data Redis和Jedis。

    Spring Boot下面使用Spring Data Redis相当的简单,只需要引入Spring Data Redis和在配置文件application.properties中配置地址即可,因为它有spring-boot-autoconfigure来实现了自动注入。

    下面是实际项目例子:

    POM:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.jsoft.springboottest</groupId>
        <artifactId>springboottest1</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>springboottest1</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <!-- Inherit defaults from Spring Boot -->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.7.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <scope>test</scope>
            </dependency>
    
            <!-- Add typical dependencies for a web application -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            
            <!-- 热部署模块 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
            </dependency>
            
            <!-- Redis -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            
        </dependencies>
    
        <!-- Package as an executable jar -->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

    application.properties:

    # REDIS(RedisProperties)
    # (普通集群,不使用则不用开启)在群集中执行命令时要遵循的最大重定向数目。
    # spring.redis.cluster.max-redirects=
    # (普通集群,不使用则不用开启)以逗号分隔的“主机:端口”对列表进行引导。
    # spring.redis.cluster.nodes=
    # 连接工厂使用的数据库索引。
    spring.redis.database=0
    # 连接URL,将覆盖主机,端口和密码(用户将被忽略),例如:redis://user:password@example.com:6379
    spring.redis.url=
    # Redis服务器主机。
    spring.redis.host=localhost
    # 登录redis服务器的密码。
    spring.redis.password=
    # 启用SSL支持。
    spring.redis.ssl=false
    # 池在给定时间可以分配的最大连接数。使用负值无限制。
    spring.redis.pool.max-active=8
    # 池中“空闲”连接的最大数量。使用负值表示无限数量的空闲连接。
    spring.redis.pool.max-idle=8
    # 连接分配在池被耗尽时抛出异常之前应该阻塞的最长时间量(以毫秒为单位)。使用负值可以无限期地阻止。
    spring.redis.pool.max-wait=-1
    # 目标为保持在池中的最小空闲连接数。这个设置只有在正面的情况下才有效果。
    spring.redis.pool.min-idle=0
    # Redis服务器端口。
    spring.redis.port=6379
    # (哨兵模式,不使用则不用开启)Redis服务器的名称。
    # spring.redis.sentinel.master=
    # (哨兵模式,不使用则不用开启)主机:端口对的逗号分隔列表。 
    # spring.redis.sentinel.nodes=
    # 以毫秒为单位的连接超时。
    spring.redis.timeout=0

    说明:以上是单机版本的,如果是集群的只需要开启这两项:

    # (普通集群,不使用则不用开启)在群集中执行命令时要遵循的最大重定向数目。
    spring.redis.cluster.max-redirects=
    # (普通集群,不使用则不用开启)以逗号分隔的“主机:端口”对列表进行引导。
    spring.redis.cluster.nodes=127.0.0.1:1001,127.0.0.1:1002

    注意:一旦开启了集群模式,那么基于单机的配置就会覆盖。

    提示:可以这么说,上面的配置应该是最全的了。当然上面针对客户端的操作估计会比较少,比如哨兵模式,分片等等的,因为这些高可用在服务已经做了,如果想要在客户端实现这些,那么可以重新注入想要实现Bean即可。比如注入建立工厂,实现自己的Session。

    使用:

    package com.jsoft.springboottest.springboottest1.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController {
        
        private static final Logger logger = LoggerFactory.getLogger(TestController.class);
        
        @Autowired
        RedisTemplate redisTemplate;
        
        @Autowired
        StringRedisTemplate stringRedisTemplate;
        
        @RequestMapping("/set")
        public void set() {
            redisTemplate.opsForValue().set("test", "4321");
        }
        
        @RequestMapping("/show")
        public String show(){
            
            logger.info(redisTemplate.opsForValue().get("test").toString());
            return "Hello World";        
        }
    }

    说明:只需要注入RedisTemplate即可。

    使用技巧:

    在市面上可能存在两种个用法,1中是针对opsForValue,另一种是execute的,那么这两种的使用区别如下:

    1、在redistemplate中配置Serializer

    ValueOperations<String, User> valueops = redisTemplate.opsForValue();
    valueops.set(user.getId(), user);

    2、不在redistemplate中配置Serializer,而是在Service的实现类中单独指定Serializer。

    boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
          public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException { 
              RedisSerializer<String> redisSerializer = redisTemplate .getStringSerializer(); 
              byte[] key = redisSerializer.serialize(user.getId());
              byte[] value = redisSerializer.serialize(user.getName()); 
              return redisConnection.setNX(key, value); } }); 
         return result;
    }

    也就是说这两者的区别的序列化是自己实现的。

    示例项目:https://github.com/easonjim/5_java_example/tree/master/springboottest/springboottest6

    参考:

    https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/htmlsingle/(官方文档,搜索spring.redis)

    http://blog.csdn.net/i_vic/article/details/53081241

    http://www.cnblogs.com/ityouknow/p/5748830.html

    https://www.cnblogs.com/edwinchen/p/3816938.html

  • 相关阅读:
    操作系统学习(一)、80x86保护模式内存管理
    Linux命令(十三) 建立目录 mkdir 删除目录 rmdir
    Linux命令(十二) 分割文件 split 合并文件 join
    Linux命令(十一) 显示文件类型 file
    linux下环境变量PS1设置
    Jenkins email-ext邮件通知模板
    building system busy, pls wait !!
    SCP 命令
    NDK Build 用法(NDK Build)
    android下m、mm、mmm编译命令的使用
  • 原文地址:https://www.cnblogs.com/EasonJim/p/7805665.html
Copyright © 2011-2022 走看看