zoukankan      html  css  js  c++  java
  • Redis--Springboot使用

    Redis--springboot使用:

    之前用redis是用命令行,现在整合到springboot做个简单使用:string,list,set,zset,hash,后面可能还要对redis分布式锁,秒杀项目,狂神说redis还要进一步做个总结

    参考链接:https://blog.csdn.net/m0_37989980/article/details/107448418


    Redis配置:

    注意点:redis存储时如果不序列化和反序列化,对象就没法序列化存入(但是不写序列化配置就能存入)并且 存到redis就会乱码(不写序列化配置存入就乱码),配置共有两种,这次采用的代码,另一种就是redisconfig里面配置

      //修改 key值序列化
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    

    Redis配置




    Redis代码:

    里面用到了两种redisTemplate和stringredisTemplate,两者是父子类,都可以使用5种类型的操作

    package com.empirefree.springboot;
    
    import com.alibaba.fastjson.JSONObject;
    import com.empirefree.springboot.pojo.Content;
    import lombok.extern.slf4j.Slf4j;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.redis.connection.DataType;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.core.ZSetOperations;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.*;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @program: springboot
     * @description: redisTest
     * @author: huyuqiao
     * @create: 2021/05/30 14:44
     */
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Slf4j
    public class RedisTests {
        @Autowired
        StringRedisTemplate stringRedisTemplate;
    
        @Autowired
        RedisTemplate redisTemplate;
    
        @Test
        public void testRedisKey(){
            //判断是否有key
            Boolean hasKey = stringRedisTemplate.hasKey("hyq");
            System.out.println(hasKey);
    
            //key对应value值的类型
            DataType dataType = stringRedisTemplate.type("obj");
            System.out.println(dataType);
    
            //获取redis所有key
            Set<String> keys =  stringRedisTemplate.keys("*");
    //        keys.forEach(key -> System.out.println("key = " + key));
    
            //获取key超时时间: -1永不超时   -2key不存在  >=0过期时间
            Long expire = stringRedisTemplate.getExpire("hyq");
            System.out.println(expire);
    
            //获取一个随机的key
            System.out.println(stringRedisTemplate.randomKey());
    
            //修改key名字
            stringRedisTemplate.renameIfAbsent("hyq", "HYQ");
        }
        /*
        * description:操作redis中string类型
        * */
        @Test
        public void testString(){
            stringRedisTemplate.opsForValue().set("hyq", "胡宇乔", 120, TimeUnit.SECONDS);
            stringRedisTemplate.opsForValue().append("hyq", "往string中追加字符串");
            System.out.println(stringRedisTemplate.opsForValue().get("hyq"));
        }
    
        /*
         * description:操作redis中List类型
         * */
        @Test
        public void testList(){
            List<String> list = new ArrayList<>();
            list.add("name--A");
            list.add("name--B");
            stringRedisTemplate.opsForList().leftPush("list--hyq", "huyuqiao");
            stringRedisTemplate.opsForList().leftPushAll("list--hyq", list);
    
            List<String> stringList = stringRedisTemplate.opsForList().range("list--hyq", 0, -1);
            stringList.forEach(value -> System.out.println("value = " + value));
            System.out.println("=====");
            stringRedisTemplate.opsForList().trim("list--hyq", 1, 1);
        }
    
        /*
         * description:操作redis中set类型
         * */
        @Test
        public void testSet(){
            stringRedisTemplate.opsForSet().add("sets", "张三", "李四");
            Set<String> sets = stringRedisTemplate.opsForSet().members("sets");
            sets.forEach(value -> System.out.println("value = " + value));
            Long size = stringRedisTemplate.opsForSet().size("sets");
            System.out.println("stringRedisTemplate中set的size" + size);
        }
    
        /*
         * description:操作redis中zset类型  有序
         * */
        @Test
        public void testZset(){
            stringRedisTemplate.opsForZSet().add("zsets", "怎么玩1", 20);
            stringRedisTemplate.opsForZSet().add("zsets", "怎么玩2", 19);
            stringRedisTemplate.opsForZSet().add("zsets", "怎么玩3", 18);
            Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);
    
            zsets.forEach(value -> System.out.println(value));
            Set<ZSetOperations.TypedTuple<String>> zsetsScore = stringRedisTemplate.opsForZSet().rangeByScoreWithScores("zsets", 0, 1000);
            zsetsScore.forEach(stringTypedTuple -> {
                System.out.println(stringTypedTuple.getValue());
                System.out.println(stringTypedTuple.getScore());
            });
        }
    
        /*
         * description:操作redis中hash类型
         * */
        @Test
        public void testHash(){
            //个人觉得有点类似Map<Key, Map<Key, value>>,感觉应该还是用string多一点,后面直接封装成Json就可以了
            stringRedisTemplate.opsForHash().put("maps", "name", "胡宇乔");
            stringRedisTemplate.opsForHash().putAll("maps", new LinkedHashMap<String, String>(){{
                put("age", "22");
                put("birthday", "2021-05-30");
            }});
    
            //得到key的多个key对应的value
            List<Object> values = stringRedisTemplate.opsForHash().multiGet("maps", Arrays.asList("name", "age"));
            values.forEach(value -> System.out.println(value));
    
            System.out.println("=====");
            String string = (String) stringRedisTemplate.opsForHash().get("maps", "name");
            System.out.println(string);
            List<Object> stringList =  stringRedisTemplate.opsForHash().values("maps");
            stringList.forEach(obj -> System.out.println(obj));
            Set<Object> keys =  stringRedisTemplate.opsForHash().keys("maps");
            keys.forEach(key -> System.out.println(key));
        }
    
        @Test
        public void testRedisTemplate(){
            //修改 key值序列化
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            Content content = new Content();
            content.setImg(UUID.randomUUID().toString());
            redisTemplate.opsForValue().set("content", content);
    
            Content content1 = (Content) redisTemplate.opsForValue().get("content");
            System.out.println(content1);
    
            redisTemplate.opsForList().leftPush("list", content);
            redisTemplate.opsForSet().add("set", content);
            redisTemplate.opsForZSet().add("zset", content, 10);
            redisTemplate.opsForHash().put("map", "name", content);
        }
    
        @Test
        public void testRedis(){
    //        String k1 = stringRedisTemplate.opsForValue().get("k1");
    //        log.info("拿到{}",k1);
            stringRedisTemplate.opsForValue().set("hyq", "huyuqiao");
            String hyq = stringRedisTemplate.opsForValue().get("hyq");
            log.info("RedisTests--testRedis: 得到redis值 {}", hyq);
            Content content = new Content();
            content.setTitle("胡宇乔");
            content.setPrice("22");
            content.setImg("Img");
            redisTemplate.opsForValue().set("obj", JSONObject.toJSONString(content));
            System.out.println(redisTemplate.opsForValue().get("obj"));
        }
    
    }
    
    

    我曾七次鄙视自己的灵魂:
    第一次,当它本可进取时,却故作谦卑;
    第二次,当它在空虚时,用爱欲来填充;
    第三次,在困难和容易之间,它选择了容易;
    第四次,它犯了错,却借由别人也会犯错来宽慰自己;
    第五次,它自由软弱,却把它认为是生命的坚韧;
    第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
    第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
  • 相关阅读:
    Cocos2d-x之CCMenu理解
    【问题记录】mysql设置任意ip访问
    kafka eagle 使用教程
    查看Android源码和源码布局
    JAVA问题之泛型数组
    Linux面试题汇总答案(转)
    从源码看Azkaban作业流下发过程
    Azkaban源码学习笔记
    Java多线程基础学习(二)
    Java多线程基础学习(一)
  • 原文地址:https://www.cnblogs.com/meditation5201314/p/14828236.html
Copyright © 2011-2022 走看看