开发者

SpringBoot如何使用redis

目录
  • 一、pom.XML
  • 二、application.properties
  • 三、编写一个配置类用于解决乱码问题和对象真实的类型问题
  • 四、代码案例
    • 4.1 model 准备 因为有可能存对象
    • 4.2 使用Redis 操作string
    • 4.3 使用redis 操作list
    • 4.4 使用redis 操作hash
    • 4.5 使用redis 操作set
    • 4.6 使用redis 操作zset
    • 4.7 Redis 操作BitMap
  • 总结

    一、pom.xml

     <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-pool2</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
     </dependencies>

    二、application.properties

    # Redis服务器地址
    spring.redis.host=192.168.11.84
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=
    # Redis数据库索引(默认为0) 共15个
    spirng.redis.database=0
    ## 连接超时时间(毫秒)
    spring.redis.timout=30000
    # 连接池最大连接数(使用负值表示没有限制) 默认 8
    spring.redis.lettuce.pool.max-active=8
    # 连接池中的最大空闲连接 默认 8
    spring.redis.lettuce.pool.max-idle=8
    # 连接池中的最小空闲连接 默认 0
    spring.redis.lettuce.pool.min-idle=1
    #连接池中最大空闲等待时间,3s没有活干的时候直接驱逐该链接
    spring.redis.lettuce.pool.min-evicate-idle-time-millis=3000
    # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
    spring.redis.lettuce.pool.max-wait=-1

    三、编写一个配置类用于解决乱码问题和对象真实的类型问题

    package com.by.config;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.Jackson2jsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import Java.net.UnknownHostException;
    
    @Configuration
    public class RedisConfig {
        @Bean
        @ConditionalOnMissingBean(name = "redisTemplate")
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
                throws UnknownHostException {
            RedisTemplate<Object, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(redisConnectionFactory);
            // key序列化方式
            template.setKeySerializer(StringRedisSerializer.UTF_8);
            //Jackson2JsonRedisSerializer 序列化方式 来代替自来的jdk序列化方式,因为后者会乱码
            Jackson2JsonRedisSerializer jack = new Jackspythonon2JsonRedisSerializer(Object.class);
            template.setValueSerializer(jack);
            template.setHashKeySerializer(StringRedisSerializer.UTF_8);
            template.setHashValueSerializer(jack);
            /**
             * 使用objeck设置对象的类型为真实的对象类型 而不是hsash
             */
            ObjectMapper mapper=new ObjectMapper();
            // 启用默认类型推理,将类型信息作为属性写入JSON
            // 就是把对象的全类名写入json
            map编程客栈per.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
             // 将类型的信息作为属性传给json
            jack.setObjectMapper(mapper);
            return template;
        }
    }

    四、代码案例

    4.1 model 准备 因为有可能存对象

    • Student.java
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class Student implements Serializable {
       private Integer id;
       private String name;
    }
    • Product.java
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class Product implements Serializable {
        private Integer id;
        private String name;
    }

    4.2 使用redis 操作string

    @Slf4j
    @SpringBootTest
    class StringTest {
        /**
         * 使用redis 操作string
         */
        @Autowired
        private StringRedisTemplate str;
        // 自动序列化,用 @Autowired报错
        @Resource(name ="redisTemplate")
        private RedisTemplate<String,Student> redisTemplate;
        private  final  String key ="zhouxingxing";
    
        /**
         * 将对象序列化 不用手动将对象转成字符串
         */
        @Test
        void m8() {
            // jdk 序列化
            Student student = Student.builder().id(1).name("张三").build();
    //        JdkSerializationRedisSerializer serializer =new JdkSerializationRedisSerializer();
    //        byte[] serialize = serializer.serialize(student);
    //        String s=new String(serialize);
            // s乱码
            redisTemplate.opsForValue().set("student", student);
            Student student1 =  redisTemplate.opsForValue().get("student");
            System.out.println(student1.getName());
    
        }
        /**
         * string里的get set 方法
         */
        @Test
        void m1() {
            str.opsForValue().set("xiaolong", "帅呆了");
            String xiaolong = str.opsForValue().get("xiaolong");
            log.info("xiaolong:{}", xiaolong);
        }
    
        /**
         * string里的strlen 方法
         * append 方法:追加字符串
         */
        @Test
        void m2() {
            str.opsForValue().set("xiaolong", "帅呆了");
            String xiaolong = str.opsForValue().get("xiaolong");
            log.info("xiaolong:{}", xiaolong);
            // 追加字符串
            str.opsForValue().append("xiaolong", "哈哈");
            // 获取长度
            Long size = str.opsForValue().size("xiaolong");
            log.info("长度为:{}", size);//15
        }
    
        /**
         * string里的incr 方法
         * incrBy 方法:增加指定值
         */
        @Test
        void m3() {
            str.opsForValue().set("xiaolong", "100");
            Long xiaolong = str.opsForValue().decrement("xiaolong", 2);
            log.info("xiaolong:{}", xiaolong); //98
        }
    
        /**
         * 将student 对象存到redis 里
         * JSONUtil.toJsonStr(对象)--->将对象转成序列化的json字符串
         */
        @Test
        void m4() {
            Student student = Student.builder().id(1).name("张三").build();
            str.opsForValue().set("student", JSONUtil.toJsonStr(student));
            log.info("student:{}", str.opsForValue().get("student"));//student:{"id":1,"name":"张三"}
        }
        @Test
        public void m7() {
            str.opsForHash().put(key,"20220325","郑州");
            str.opsForHash().put(key,"20220326","洛阳");
            // 拿到所有小key的值
            List<Object> values = str.opsForHash().values(key);
            for (Object value : values) {
                System.out.println(value);
            }
        }

    4.3 使用redis 操作list

    @SpringBootTest
    @Slf4j
    public class ListTest {
        @Autowired
        private StringRedisTemplate redisTemplate;
        private final String key = "xiaolopythonng";
        /**
         * 给list左推元素和又推元素
         * 从右方删除元素并返回删除的元素
         */
        @Test
        void m1() {
            redisTemplate.opsForList().leftPush(key, "g1");
            redisTemplate.opsForList().leftPush(key, "g2");
            redisTemplate.opsForList().leftPush(key, "g3");
            redisTemplate.opsForList().rightPush(key, "g4");//顺序为 g3 g2 g1 g4
            // 从右边删除元素 并返回删除的元素
            String s = redisTemplate.opsFoandroidrList().rightPop(key);
            log.info("删除元素为:{}", s);// g4
        }
    
        @Test
        public void m2() {
            List<Object> obj = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {
                //队列没有元素会阻塞操作,直到队列获取新的元素或超时
                return connection.bLPop(600, "list1".getBytes());
            }, new StringRedisSerializer());
            for (Object str : obj) {
                System.out.println(str);
            }
        }

    4.4 使用redis 操作hash

    @Slf4j
    @SpringBootTest
    public class HashTest {
        @Autowired
        private StringRedisTemplate redisTemplate;
        // 自动序列化
        @Resource(name ="redisTemplate")
        private RedisTemplate<String, Student> redisTemplate1;
        // 设置大key
        private final String key = "xiaolong";
        @Test
         void m10() {
            Student student = Student.builder().id(1).name("张三").build();
            redisTemplate1.opsForHash().put(key, "g1", student);
            Object o = redisTemplate1.opsForHash().get(key, "g1");
        }
     // 设置商品黑名单
        @Test
        public void m9() {
            Product p1 = Product.builder().id(1).name("华为").build();
            Product p2 = Product.builder().id(2).name("小米").build();
            redisTemplate1.opsForHash().put("黑名单","名单列表1",p1);
            redisTemplate1.opsForHash().put("黑名单","名单列表2",p2);
        }
    
        /**
         * 获取大key里所有小key的值
         */
        @Test
        public void m1() {
            redisTemplate.opsForHash().put(key, "g1", "小芳");
            redisTemplate.opsForHash().put(key, "g2", "小红");
            // 拿到所有小key的值
            List<Object> values = redisTemplate.opsForHash().values(key);
            for (Object value : values) {
                log.info("所有小key的值为:"+value);
            }
        }

    4.5 使用redis 操作set

    @SpringBootTest
    @Slf4j
    public class SetTest {
      @Autowired
       private StringRedisTemplate redisTemplate;
       private final String xiaoming = "xiaoming";
       private final String xiaohong = "xiaohong";
      @Test// 交集
        void m1()
        {
            // 添加小明同学感兴趣的学科
            redisTemplate.opsForSet().add(xiaoming, "语文", "数学","物理");
            // 添加小红同学感兴趣的学科
            redisTemplate.opsForSet().add(xiaohong, "语文", "英语");
            // 获取两位同学共同感兴趣的学科
            Set<String> tong = redisTemplate.opsForSet().intersect(xiaohong, xiaoming);
            for (String s : tong) {
               log.info("小明和小红共同感兴趣的学科为:"+s);// 语文
            }
        }
        @Test//并集
        void m2()
        {
            // 添加小明同学感兴趣的学科
            redisTemplate.opsForSet().add(xiaoming, "语文", "数学","物理");
            // 添加小红同学感兴趣的学科
            redisTemplate.opsForSet().add(xiaohong, "语文", "英语");
            // 获取两位同学共同感兴趣的学科
            Set<String> tong = redisTemplate.opsForSet().union(xiaohong, xiaoming);
            for (String s : tong) {
                log.info("小明和小红共同感兴趣的学科为:"+s);// 语文
            }
        }

    4.6 使用redis 操作zset

    @SpringBootTest
    @Slf4j
    public class ZsetTest {
        @Autowired
        private StringRedisTemplate redisTemplate;
        @Resource(name = "redisTemplate")
        private RedisTemplate<String, Integer> redisTemplate1;
        private String key = "xiaolong";
        /**
         * zset有序集合唯一 去重 适用于今日头条和热搜
         * 给xiaolong 添加三门得成绩
         */
        @Test
        public void m1() {
            redisTemplate.opsForZSet().add(key, "语文", 90);
            redisTemplate.opsForZSet().add(key, "数学", 100);
            redisTemplate.opsForZSet().add(key, "英语", 80);
            Long aLong = redisTemplate.opsForZSet().zCard(key);
            log.javascriptinfo("{科目数量为:}", aLong);
            // 获取xiaolong的最高分 spring 没有给我们封装
            redisTemplate.execute(new RedisCallback<Object>() {
                @Override
                public Object doInRedis(RedisConnection connection) throws DataAccessException {
                    return connection.bLPop(5, key.getBytes());
                }
            });
        }

    4.7 Redis 操作BitMap

    @Component
    public class BitMapDemo {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
        private final  String key ="sign#2022#zhouxingxing";
        public void test(){
           //设置签到
            stringRedisTemplate.opsForValue().setBit(key,2,true);
            stringRedisTemplate.opsForValue().setBit(key,85,true);
            //获取周星星同学的签到天数
            RedisCallback<Long> callback = connection -> { return  connection.bitCount(key.getBytes(),0,365);};
            Long count = stringRedisTemplate.execute(callback);
            //打印周星星2022年签到天数
            System.out.println("周星星2022年一共签到天数:"+count);
        }
    }

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜