• SpringBoot中使用Redis


    准备

    1、创建SpringBoot项目

    2、pom文件中需要有Redis依赖

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

    3、yml中配置Redis

    单机Redis配置:

    #Redis 配置
    spring:
      redis:
        host: 192.168.81.130
        password: 123456
        port: 6379
        jedis:
          pool:
            max-active: 20
            max-idle: 8
            min-idle: 0
            max-wait: 2000 #最大等待时间2s
    

    Redis集群配置:

    #Redis 配置
    spring:
      redis:
        jedis:
          pool:
            max-active: 20
            max-idle: 8
            min-idle: 0
            max-wait: 2000 #最大等待时间2s
        cluster: #配置集群
          nodes: 192.160.81.130:7001,192.160.81.130:7002,192.160.81.130:7003,192.160.81.130:7004,192.160.81.130:7005,192.160.81.130:7006
     
    

    Redis自动配置类说明

    SpringBoot中所有的自动配置都在starter中的xxxAutoConfiguration类中,每个我们能在yaml中配置的内容都在xxxProperties类中有说明。

    我们查看Redis的配置类:RedisProperties。它提供了一系列Redis所需的配置。

    package org.springframework.boot.autoconfigure.data.redis;
    @ConfigurationProperties(
        prefix = "spring.redis"
    )
    public class RedisProperties {
        private int database = 0;
        private String url;
        private String host = "localhost";
        private String password;
        private int port = 6379;
        private boolean ssl;
        private Duration timeout;
        private String clientName;
        private RedisProperties.Sentinel sentinel;
        private RedisProperties.Cluster cluster;
        private final RedisProperties.Jedis jedis = new RedisProperties.Jedis();
        private final RedisProperties.Lettuce lettuce = new RedisProperties.Lettuce();
        //...
    }
    

    SpringBoot中Redis为我们的自动配置都在RedisAutoConfiguration类中,它通过RedisTemplate,即Redis的模板进行自动装配。StringRedisTemplate继承自RedisTemplate,它只是将RedisTemplate的泛型<Object, Object>改为了<String,String>,我们只能在StringRedisTemplate存储String类型。

    package org.springframework.boot.autoconfigure.data.redis;
    
    @Configuration(
        proxyBeanMethods = false
    )
    @ConditionalOnClass({RedisOperations.class})
    @EnableConfigurationProperties({RedisProperties.class})
    @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
    public class RedisAutoConfiguration {
        public RedisAutoConfiguration() {
        }
    
        @Bean
        @ConditionalOnMissingBean(
            name = {"redisTemplate"}
        )
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
            RedisTemplate<Object, Object> template = new RedisTemplate();
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }
    
        @Bean
        @ConditionalOnMissingBean
        public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
            StringRedisTemplate template = new StringRedisTemplate();
            template.setConnectionFactory(redisConnectionFactory);
            return template;
        }
    }
    

    使用

    测试配置

    @SpringBootTest
    class BootRedis02ApplicationTests {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @Test
        //keys *
        void contextLoads() {
            Set<String> keys = stringRedisTemplate.keys("*");
            for (String key : keys) {
                System.out.println(key);
            }
        }
    }
    

    StringRedisTemplate操作Redis

    @SpringBootTest
    class ApplicationTests {
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        @Test
        //刷新Redis
        void flushdb(){
            redisTemplate.execute(new RedisCallback<String>() {
                @Override
                public String doInRedis(RedisConnection connection) throws DataAccessException {
                    connection.flushAll();
                    connection.flushDb();
                    return "ok";
                }
            });
        }
    	
        @Test
        void testNormal(){
            redisTemplate.keys("*");//获取所有key
            redisTemplate.multi();//开启事务
            redisTemplate.exec();//提交事务
            redisTemplate.watch("");//监听
            redisTemplate.unwatch();//取消监听
            redisTemplate.delete("k1");//删除k1
            Collection<String> keys=null;
            redisTemplate.delete(keys);//删除多个key
            redisTemplate.randomKey();//随机一个key
            redisTemplate.rename("oldKey","newKey");//重命名key
            redisTemplate.discard();//放弃事务
    
            //redisTemplate提供的序列化
            redisTemplate.getStringSerializer(); //指redis key序列化方式
            redisTemplate.getValueSerializer();  //指值的序列化方式
            redisTemplate.getHashKeySerializer();//指hash中Value的key序列化方式 
            redisTemplate.getHashValueSerializer();//指hash  Value的 value序列化方式
        }
    
        @Test
        void testString(){
            ValueOperations<String, String> opsForValue = redisTemplate.opsForValue();
            //System.out.println(redisTemplate.getKeySerializer());
            //System.out.println(redisTemplate.getValueSerializer());
    
            //其它方法集
            RedisOperations<String, String> operations = opsForValue.getOperations();
    //        opsForValue.get("");
    //        opsForValue.set("","");
    //        opsForValue.setIfPresent("","");
    //        opsForValue.increment("");
    //        opsForValue.decrement("");
    //        opsForValue.set("name","xiaoming");
            System.out.println(opsForValue.get("name"));
        }
    
        @Test
        void testList(){
            ListOperations<String, String> opsForList = this.redisTemplate.opsForList();
            RedisOperations<String, String> operations = opsForList.getOperations();
            opsForList.leftPush("","");
            opsForList.leftPushAll("","","","");
            opsForList.rightPush("","");
            opsForList.rightPushAll("","");
            opsForList.leftPop("");
            opsForList.rightPop("");
            List<String> key = opsForList.range("key", 0, -1);
        }
    
        @Test
        void testHash(){
            HashOperations<String, Object, Object> opsForHash = this.redisTemplate.opsForHash();
            opsForHash.put("","hashKey","value");
            opsForHash.get("","hashKey");
        }
    
        @Test
        void testSet(){
            SetOperations<String, String> opsForSet = this.redisTemplate.opsForSet();
            opsForSet.add("","");
            opsForSet.members("");
        }
    
        @Test
        void testZset(){
            ZSetOperations<String, String> opsForZSet = this.redisTemplate.opsForZSet();
            opsForZSet.add("key","value",1);
        }
    
        //集群操作
        @Test
        void test(){
            ClusterOperations<String, String> clusterOperations = this.redisTemplate.opsForCluster();
            //关闭集群的7001端口的主机
            opsForCluster.shutdown(new RedisClusterNode("192.168.81.130", 7001));
        }
    }
    

    RedisTemplate操作Redis

    @SpringBootTest
    class ApplicationRedisTemplateTests {
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Test
        void contextLoads() {
            System.out.println(redisTemplate);
            System.out.println(redisTemplate.getKeySerializer());
            System.out.println(redisTemplate.getValueSerializer());
        }
        @Test
        void testString(){
            //这是设置key的序列化方式,因为RedisTemplate<Object,Object> 如果传String key会被当做object进行序列化
            this.redisTemplate.setKeySerializer(new StringRedisSerializer());
            ValueOperations opsForValue = redisTemplate.opsForValue();
            //opsForValue.set("user:1".toString(),new User(1,"xiaoming","wh",new Date()));
            User user = (User) opsForValue.get("user:1");
            System.out.println(user);      
        }
        
        @Test
        void testString2(){
            this.redisTemplate.setKeySerializer(new StringRedisSerializer());
            this.redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            ValueOperations opsForValue = redisTemplate.opsForValue();
            //opsForValue.set("user:2".toString(),new User(1,"xiaoming","wh",new Date()));
            // 若该对象的强转转换,则redis 内部会使用JackSon的工具将字符串->java 对象 ,那jackson 转换为对象时,需要一个对象的类型 ,其实它已经自动获取对象的类型了
            User user = (User) opsForValue.get("user:2");
            System.out.println(user);       
        }
    }
    

    Redis中的序列化

    Redis的序列化规则在package org.springframework.data.redis.serializer包下的RedisSerializer接口中。

    public interface RedisSerializer<T> {}
    

    若不设置序列化规则,它将使用JDK自动的序列化将对象转换为字节,存到Redis 里面。它可以存在对象到redis里面,如果对象没有序列化,那么默认使用的JDK的序列化方式。

    coydone的博客
  • 相关阅读:
    C语言源代码——计算任何一天是星期几
    计算任意一天是星期几
    wpf利用线程制作初始界面和关闭窗体特效
    实用的 集合工具类 和 String工具类
    从“关于Java堆与栈的思考”一帖看错误信息的传播
    web.xml 配置中classpath: 与classpath*:的区别
    git的安装-环境变量配置
    解决Oracle安装时报错“SID已在使用”办法
    ORACLE日期时间函数
    Java 开发环境配置
  • 原文地址:https://www.cnblogs.com/coydone/p/13920949.html
Copyright © 2020-2023  润新知