• SpringDataRedis(SpringData)


    介绍:在lettuce那一篇里面写了用lettuce连接数据库,并且操作redis数据库

    结构图:

    1.依赖包

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

    2.SpringData连接redis数据库

    •  先创建一个src/main/profiles/dev/config/redis.properties配置文件,dev为源文件夹。在此配置文件中配置所有与redis有关的属性。

    redis.host=redis-server//redis数据库连接的主机名称或ip地址
    redis.port=6379 //连接端口
    redis.auth=hellolee   //认证信息
    redis.database=0  //数据库的索引编号
    redis.pool.maxTotal=10  //连接池最大的总连接数量
    redis.pool.maxIdle=5   //连接池维持的最大连接数量
    redis.pool.minIdle=3  //连接池维持的最小的连接数量
    redis.pool.testOnBorrow=true  //所有的连接测试后返回
    

    •  在src/main/resources/spring/spring-base.xml配置文件中添加扫描redis.properties所在的包

    <context:component-scan base-package="com.yootk.redis.config"/>
    

    •编写配置类SpringDataRedisConfig.java

    package com.yootk.redis.config;
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.connection.RedisPassword;
    import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
    import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
    import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
    
    @Configuration
    @PropertySource("classpath:config/redis.properties")
    public class SpringDataRedisConfig {
        @Bean("redisConfiguration")
        public RedisStandaloneConfiguration getRedisConfiguration(
                @Value("${redis.host}") String hostName ,
                @Value("${redis.port}") int port,
                @Value("${redis.auth}") String password,
                @Value("${redis.database}") int database
        ) {
            RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration() ;
            configuration.setHostName(hostName); // 设置Redis主机名称
            configuration.setPort(port); // 设置Redis的访问端口
            configuration.setPassword(RedisPassword.of(password)); // 设置密码
            configuration.setDatabase(database); // 设置数据库索引
            return configuration ;
        }
        @Bean("objectPoolConfig")
        public GenericObjectPoolConfig getObjectPoolConfig(
                @Value("${redis.pool.maxTotal}") int maxTotal ,
                @Value("${redis.pool.maxIdle}") int maxIdle ,
                @Value("${redis.pool.minIdle}") int minIdle ,
                @Value("${redis.pool.testOnBorrow}") boolean testOnBorrow
        ) {
            GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig() ;
            poolConfig.setMaxTotal(maxTotal);
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMinIdle(minIdle);
            poolConfig.setTestOnBorrow(testOnBorrow);
            return poolConfig ;
        }
        @Bean("lettuceClientConfiguration")
        public LettuceClientConfiguration getLettuceClientConfiguration(
                @Autowired GenericObjectPoolConfig poolConfig
        ) { // 创建Lettuce组件的连接池客户端配置对象
            return LettucePoolingClientConfiguration.builder().poolConfig(poolConfig).build() ;
        }
        @Bean("redisConnectionFactory")//相当于在这例实例化了RedisConnectionFactory类的实例化对象,前面双引号中的内容就是对象,
       //一旦在其他地方自动注入此对象的时候,此方法便自动执行,所以执行此方法就相当于执行了一个构造方法。
    public RedisConnectionFactory getConnectionFactory( @Autowired RedisStandaloneConfiguration redisConfiguration , @Autowired LettuceClientConfiguration lettuceClientConfiguration ) { LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(redisConfiguration,lettuceClientConfiguration) ; return connectionFactory ; } }

     测试当前的Redis是否可以正常连接,编写测试类

    package com.yootk.test;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @ContextConfiguration(locations = {"classpath:spring/*.xml"})
    @RunWith(SpringJUnit4ClassRunner.class)
    public class TestRedisConnection {
        @Autowired
        private RedisConnectionFactory redisConnectionFactory ;
        @Test
        public void testRedis() {
            System.out.println(this.redisConnectionFactory);    // 输出连接工厂实例
            this.redisConnectionFactory.getConnection().flushDb();  // 清空数据库
        }
    }
    

    3.RedisTemplate

    • 修改配置类SpringDataRedisConfig.java,添加两个方法

        @Bean("stringRedisTemplate")
        public RedisTemplate getStringRedisTempalate(
                @Autowired RedisConnectionFactory connectionFactory
        ) {
            StringRedisTemplate redisTemplate = new StringRedisTemplate() ;
            redisTemplate.setConnectionFactory(connectionFactory);
            return redisTemplate ;
        }
        @Bean("redisTemplate")
        public RedisTemplate getRedisTempalate(
                @Autowired RedisConnectionFactory connectionFactory
        ) {
            RedisTemplate<String,String> redisTemplate = new RedisTemplate<>() ;
            redisTemplate.setConnectionFactory(connectionFactory);
            return redisTemplate ;
        }
    

    • 测试StringRedisTemplate

    package com.yootk.test;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;
    
    @ContextConfiguration(locations = {"classpath:spring/*.xml"})
    @RunWith(SpringJUnit4ClassRunner.class)
    public class TestRedisTemplateBase {
        @Autowired
        private RedisTemplate<String, String> stringRedisTemplate;
        @Test
        public void testString() {
            for (int x = 0; x < 10; x++) {
                this.stringRedisTemplate.opsForValue().set("msg - " + x, "Hello - " + x);
            }
        }
        @Test
        public void testHash() {
            Map<String, String> map = new HashMap<>();
            map.put("name", "可爱的小李老师");
            map.put("age", String.valueOf(16));
            map.put("salary", String.valueOf(1.1));
            this.stringRedisTemplate.opsForHash().putAll("member-lee", map);
            System.out.println(this.stringRedisTemplate.opsForHash().get("member-lee","name"));
        }
        @Test
        public void testKeys() {
            Set<String> keys = this.stringRedisTemplate.keys("msg - *");
            System.out.println("【所有的key】" + keys);
        }
    }
    

    • 测试RedisTemplate

    package com.yootk.test;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.dao.DataAccessException;
    import org.springframework.data.redis.connection.RedisConnection;
    import org.springframework.data.redis.core.RedisCallback;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @ContextConfiguration(locations = {"classpath:spring/*.xml"})
    @RunWith(SpringJUnit4ClassRunner.class)
    public class TestRedisTemplate {
        @Autowired
        private RedisTemplate<String, String> redisTemplate;
    
        @Test
        public void testString() {
            this.redisTemplate.execute(new RedisCallback<Object>() {    // Redis回调
                @Override
                public Object doInRedis(RedisConnection connection) throws DataAccessException {
                    connection.flushDb(); // 清空数据库
                    return "ok";
                }
            }) ;
            for (int x = 0; x < 10; x++) {
                this.redisTemplate.opsForValue().set("message-" + x, "Hello - " + x);
            }
        }
        @Test
        public void testGet() {
            System.err.println("【获取数据】" + this.redisTemplate.opsForValue().get("message-3"));
        }
    }
    

    4. 对象序列化存储:在redis数据库中存放类的对象,强调:对象对应的类一定要实现Serializable接口。

      RedisTemplate与StringRedisTemplate的区别:StringRedisTemplate是设置了一系列字符串序列化处理的RedisTemplate。

      在SpringDataRedis里面对象序列化处理操作有两种方式:基于JDK的序列化处理机制,基于JSON的序列化处理机制。如果哦代码通过java实现,并且充分考虑到性能则使用JDK的机制,如果考虑到数据的通用性则使用JSON机制。

    •  使用JDK机制存储对象,修改配置类SpringDataRedisConfig.java

     @Bean("redisTemplate")//将原来的getRedisTempalate方法改成现在这个
        public RedisTemplate getRedisTempalate(
                @Autowired RedisConnectionFactory connectionFactory
        ) {
            RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>() ;
            redisTemplate.setConnectionFactory(connectionFactory);
            redisTemplate.setKeySerializer(new StringRedisSerializer()); // 数据的key通过字符串存储
            redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); // 保存的value为对象
            redisTemplate.setHashKeySerializer(new StringRedisSerializer()); // 数据的key通过字符串存储
            redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); // 保存的value为对象
            return redisTemplate ;
        }
    

    •  使用JSON机制存储对象,修改配置类SpringDataRedisConfig.java 

        @Bean("redisTemplate")//将原来的getRedisTempalate方法改成现在这个
        public RedisTemplate getRedisTempalate(
                @Autowired RedisConnectionFactory connectionFactory
        ) {
            RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>() ;
            redisTemplate.setConnectionFactory(connectionFactory);
            redisTemplate.setKeySerializer(new StringRedisSerializer()); // 数据的key通过字符串存储
            redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class)); // 保存的value为对象
            redisTemplate.setHashKeySerializer(new StringRedisSerializer()); // 数据的key通过字符串存储
            redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer(Object.class)); // 保存的value为对象
            return redisTemplate ;
        }
    

    5.Pipeline流水线(详情见笔记)

  • 相关阅读:
    SSH框架中使用Oracle数据库转换为SQLServer的相关配置和注意事项
    MYSQL性能优化系统整理
    PHP时间处理
    debian9 VirtualBox rc=-1908的错误
    https://snapcraft.io/store
    中文转拼音 pinyin4j的使用
    java对象转数组|数组转对象
    Deflater 压缩解压
    spring的RestTemplate连接池相关配置
    spring获取指定包下面的所有类
  • 原文地址:https://www.cnblogs.com/wxl123/p/11110392.html
Copyright © 2020-2023  润新知