24-springboot操作redis



RedisTemplate放入对象的时候,对象应该序列化。取出对象的时候,也会自动进行反序列化
/
/
/
/
一、引入依赖

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

二、编写配置文件

我们启动springboot后,会自动给我们创建RedisTemplate和StringRedisTemplate,我们可以直接在工厂中使用他们。

三、编写代码
1、对stringRedisTemplate的测试

package com.study;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.*;
import java.util.concurrent.TimeUnit;

@SpringBootTest
class SpringbootRedisApplicationTests {

    //注入StringRedisTemplate
    @Autowired
    private StringRedisTemplate stringRedisTemplate; //key 和 value都是字符串

    //操作redis中的key
    @Test
    public void testKey(){
        /*
        注意api与我们终端写的不一样,并且操作key不用在stringRedisTemplate后写opsForKey
         */
        stringRedisTemplate.delete("name");//删除一个key
        Boolean name = stringRedisTemplate.hasKey("name");//判断一个key是否存在
        System.out.println(name);
        stringRedisTemplate.type("name");//判断key所对应的类型
        stringRedisTemplate.keys("*");//获取所有的key
        Long name1 = stringRedisTemplate.getExpire("name");//获取key的超时时间 -1 永不超时 -2 key不存在
        System.out.println(name1);
        stringRedisTemplate.rename("age", "age1");//修改key的名字  要求key必须存在 不存在会报错
        stringRedisTemplate.renameIfAbsent("age", "age1");//如果key存在才修改名字,否则不修改
        stringRedisTemplate.move("name", 1);//移动key到指定库
    }


    //操作redis中字符串 opsForValue实际操作就是redis中的String类型
    @Test
    public void testString(){
        stringRedisTemplate.opsForValue().set("name", "小陈");//set用来设置一个key value
        String name = stringRedisTemplate.opsForValue().get("name");//用来获取一个key对应的value
        System.out.println(name);

        stringRedisTemplate.opsForValue().set("code", "2357", 120, TimeUnit.SECONDS);//设置一个key的超时时间(我们短信验证码的超时时间就是用这个做的)

        stringRedisTemplate.opsForValue().append("name", "他是一个好人");//给key的value追加内容
    }


    //操作list   stringRedisTemplate.opsForList()
    @Test
    public void testList(){
//        stringRedisTemplate.opsForList().leftPush("names", "xiaochen");//创建列表,放入一个元素
//        stringRedisTemplate.opsForList().leftPushAll("names", "xiaowang", "xiaoming", "xiaohei");//放入多个元素

//        List<String> names = new ArrayList<>();
//        names.add("aaa");
//        names.add("bbb");
//        stringRedisTemplate.opsForList().leftPushAll("names", names);//创建一个列表,放入多个元素

        List<String> names = stringRedisTemplate.opsForList().range("names", 0, -1);//循环遍历
        for (String name : names) {
            System.out.println(name);
        }

        stringRedisTemplate.opsForList().trim("names", 1, 3);


    }


    //操作set    stringRedisTemplate.opsForSet()
    @Test
    public void testSet(){
        stringRedisTemplate.opsForSet().add("sets", "zhangsan", "lisi", "wangwu");//创建set,并放入多个元素
        Set<String> sets = stringRedisTemplate.opsForSet().members("sets");
        for (String name : sets) {
            System.out.println(name);
        }

        Long sets1 = stringRedisTemplate.opsForSet().size("sets");
        System.out.println(sets1);
    }

    //操作hash   stringRedisTemplate.opsForHash()
    @Test
    public void tetstHash(){
        stringRedisTemplate.opsForHash().put("maps", "name", "zhangsan");//创建一个hash类型

        Map<String, String> map = new HashMap<>();
        map.put("age", "12");
        map.put("bir", "2012-12-12");
        stringRedisTemplate.opsForHash().putAll("maps", map);

        stringRedisTemplate.opsForHash().get("maps", "name");//获取hash中某个key的值

        stringRedisTemplate.opsForHash().values("maps");//获取所有key的值

        stringRedisTemplate.opsForHash().keys("maps");//获取所有keys

        stringRedisTemplate.opsForHash().multiGet("maps", Arrays.asList("name", "age"));//获取多个key的value

        
    }

    //操作zset   stringRedisTemplate.opsForZSet()
    @Test
    public void testZset(){
        stringRedisTemplate.opsForZSet().add("zsets", "zhangsan", 100);//创建并放入元素
        stringRedisTemplate.opsForZSet().add("zsets", "lisi", 90);//创建并放入元素
        stringRedisTemplate.opsForZSet().add("zsets", "wangwu", 80);//创建并放入元素

//        Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);//获取所有元素
//        for (String zset : zsets) {
//            System.out.println(zset);
//        }

        //获取指定分数范围的值
        Set<ZSetOperations.TypedTuple<String>> zsets = stringRedisTemplate.opsForZSet().rangeByScoreWithScores("zsets", 0, 100);
        for (ZSetOperations.TypedTuple<String> zset : zsets) {
            System.out.println(zset.getValue() + "::" + zset.getScore());
        }
    }


}

2、对RedisTemplate的测试
通过redisTemplate存入redis中的key和value都是经过序列化后的对象,如果我们存入的对象的实体类没有实现序列化接口,那么就会报错,如下



当我们实现序列化接口后,就可以正常存储。

圈中就是序列化的标记,并且我们不能通过redis客户端取,因为redis客户端不能实现序列化。
/
/
/
/
/
/
/
/
存储时不对key进行序列化

/
/
/
/
/
/
/
对于hash类型也要特殊处理


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM