spring boot整合redis基本操作

准备工作

引入依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.6.10</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.6.10</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

修改序列号方式

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setDefaultSerializer(new FastJsonRedisSerializer<>(Object.class));
        return template;
    }

配置redis

spring:
  redis:
    host: 192.168.208.139

编写主启动类

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

编写测试类

@SpringBootTest
public class TestApplication {

    @Autowired
    private RedisTemplate redisTemplate;

}

数据类型

Redis是一种高性能的键值存储系统,支持多种数据类型。以下是Redis中常见的数据类型及其说明:

1. 字符串(String):字符串是Redis中最基本的数据类型,可以存储任意类型的数据,如整数、浮点数、二进制数据等。

2. 列表(List):列表是一个有序的字符串集合,可以在列表的两端进行插入和删除操作。可以用于实现队列、栈等数据结构。

3. 哈希(Hash):哈希是一个键值对的集合,类似于关联数组。可以用于存储对象的属性和值,支持快速的查找和更新操作。

4. 集合(Set):集合是一个无序的字符串集合,不允许重复的元素。可以进行交集、并集、差集等集合操作。

5. 有序集合(Sorted Set):有序集合是一个有序的字符串集合,每个元素都关联着一个分数,可以根据分数进行排序。可以用于实现排行榜、优先级队列等功能。

6. 地理空间索引(Geospatial Index):地理空间索引是Redis 3.2版本引入的数据类型,用于存储地理位置信息,并支持根据距离进行查询。

这些数据类型在Redis中都有对应的命令和操作,可以根据具体的需求选择合适的数据类型来存储和操作数据。

字符串操作

存值

@Test
    void testStrSet(){
        ValueOperations operations = redisTemplate.opsForValue();
        //value设置为 key。
        operations.set("key","正常的value");
        //value为 的 key设置 和 过期timeout时间
        operations.set("key1","有过期时间的value",10, TimeUnit.SECONDS);
        //key用给定value的 覆盖从指定offset开始的部分
        operations.set("key2","有offset",3);
        //如果存在就修改
        operations.setIfPresent("key1","有过期时间的value",10, TimeUnit.SECONDS);
        //如果不存在就添加
        operations.setIfAbsent("key1","有过期时间的value",10, TimeUnit.SECONDS);

        Map map=new HashMap();
        map.put("map1","111");
        map.put("map2","222");
        //一次设置多个
        operations.multiSet(map);
        Map map1=new HashMap();
        map1.put("map3","3333");
        map1.put("map4","444");
        //如果map中一个元素也不存在就设置
        Boolean aBoolean = operations.multiSetIfAbsent(map1);
        System.out.println(aBoolean);
        //获取老值并设置新值
        Object andSet = operations.getAndSet("key", "newvalue");
        System.out.println(andSet);
        operations.set("append","22");
        //给key追加
        operations.append("append","333");

        operations.set("num",10);
        //给key减一  值必须是数字
        operations.decrement("num");
        //给key减2  值必须是数字
        Long num = operations.decrement("num", 2);
        System.out.println(num);
        //给key加一  值必须是数字
        operations.increment("num");
        //给key加2  值必须是数字
        operations.increment("num",2);
    }

取值

    @Test
    void testStrGet(){
        ValueOperations operations = redisTemplate.opsForValue();
        operations.set("key",123456789);
        //获取key
        Object key = operations.get("key");
        System.out.println(key);
        //获取key的值的字符串前五位 如下面获取的值是12345
        String key1 = operations.get("key", 0, 4);
        System.out.println(key1);
        //获取key的值并设置过期时间
        Object key2 = operations.getAndExpire("key", 10, TimeUnit.SECONDS);
        System.out.println(key2);
        //获取key值并删除
        Object key3 = operations.getAndDelete("key");
        System.out.println(key3);
        //获取key的值,并删除它的过期时间
        Object key4 = operations.getAndPersist("key");
        System.out.println(key4);
        operations.set("key2",2131);
        //获取多个key的值
        List list = operations.multiGet(Arrays.asList("key", "key2"));
        System.out.println(list);
    }

hash操作

存值

    @Test
    void testHashPut(){
        //类似map 一个map中有多个kv键值对
        String key="map";
        HashOperations operations = redisTemplate.opsForHash();
        //添加集合map中添加一个属性和值
        operations.put(key,"name","张三");
        operations.put(key,"age",22);

        Map data=new HashMap();
        data.put("gender","man");
        data.put("address","南京");
        //添加集合map中添加map
        operations.putAll(key,data);

        //如果不存在就添加
        operations.putIfAbsent(key,"age",22);
    }

取值

 @Test
    void testHashGet(){
        //类似map 一个map中有多个kv键值对
        String key="map";
        HashOperations operations = redisTemplate.opsForHash();
        //查询集合map中一个属性和值
        Object name = operations.get(key, "name");
        System.out.println(name);
        //获取集合map的值
        Map entries = operations.entries(key);
        System.out.println(entries);
        //获取一个集合中的多个属性值
        List list = operations.multiGet(key, Arrays.asList("name", "age"));
        System.out.println(list);
        //获取一个集合的所有的key集合
        Set keys = operations.keys(key);
        System.out.println(keys);
        //获取一个集合的所以值集合
        List values = operations.values(key);
        System.out.println(values);

        //查询key中的所有kv
        Cursor scan = operations.scan(key, ScanOptions.NONE);
        while (scan.hasNext()){
            Object next = scan.next();
            System.out.println(next);
        }

        String pattern="*a*";//*是通配符
        Long count=2L; //每次查返回的数目,不是分页,而是每次查多少条数据,查完为止,例如匹配有十条数据,这边写2,就需要消耗五次io,但结果返回是十条数据
        //查询key包含a的kv
        ScanOptions build = ScanOptions.scanOptions().match("*a*").count(2).build();
        Cursor scan1 = operations.scan(key, build);
        while (scan1.hasNext()){
            Object next = scan1.next();
            System.out.println(next);
        }
        //给集合key中的num加一(没有这个属性就创建 初始值是0 然后加一)
        operations.increment(key,"num",1);
        //是否包含牧歌属性
        Boolean num = operations.hasKey(key, "num");
        System.out.println(num);

        //查看属性的长度
        Long length = operations.lengthOfValue(key, "num");
        System.out.println(length);
  //          随机获取集合中的两个kv
        Map map = operations.randomEntries(key, 2);
        System.out.println(map);
        //随机获取集合中的一个kv
        Map.Entry entry = operations.randomEntry(key);
        System.out.println(entry);
        //随机获取集合中的一个key
        Object o = operations.randomKey(key);
        System.out.println(o);
        //随机获取集合中两个key
        List list1 = operations.randomKeys(key, 2);
        System.out.println(list1);
        //删除集合中多个key
        operations.delete(key,"num","age");
    }

list操作

存值

  @Test
    void testListPush() {
        String key = "list";
        ListOperations operations = redisTemplate.opsForList();
        //向集合左边加入值,如果集合不存在就创建集合
        operations.leftPush(key, 11);
        operations.leftPush(key, 22);
        //向集合又边加入值
        operations.rightPush(key, 33);
        //查询索引是0-2的值,如果end为-1就是查询全部
        List range = operations.range(key, 0, 2);
        System.out.println(range);

        //向集合左边加入集合
        operations.leftPushAll(key, Arrays.asList(4, 5, 6));
        //向集合又边加入集合
        operations.rightPushAll(key, Arrays.asList(4, 5, 6));

        //如果存在就向左边添加
        operations.leftPushIfPresent(key, 22);

        //更新list中索引是0的值为1 (找不到对应的索引会报错)
        operations.set(key, 0, "1");
        String key1 = "list1";
        String key2 = "list2";
        operations.leftPushAll(key1, Arrays.asList(1, 2, 3));
        operations.leftPushAll(key2, Arrays.asList(4, 5, 6));
        //将key中头部第一个移到key1中的头部
        operations.move(ListOperations.MoveFrom.fromHead(key1), ListOperations.MoveTo.toHead(key2));
        //list1=> 3 2 1  => 2 1   list2 => 6 5 4 => 3 6 5 4
        String key3 = "list3";
        operations.leftPushAll(key3, Arrays.asList("ss", "hhh", "dsfs", "hhh", "23", "hhh"));
        //从左边开始删除前两个hhh
        operations.remove(key3, 2, "hhh");

        String key4 = "list4";
        operations.leftPushAll(key4, Arrays.asList("11", "22", "33", "44"));
        //截取list4,只取索引1-3的数据
        operations.trim(key4, 1, 3);
        List range1 = operations.range(key4, 0, -1);
        System.out.println(range1);//[ 33,22,11]

        String key5 = "list5";
        operations.leftPushAll(key5, Arrays.asList("11", "22", "33", "44"));
        //更新
        operations.set(key5, 2, "222");
        List range2 = operations.range(key5, 0, -1);
        System.out.println(range2);//[44, 33, 222, 11]
    }

取值

 @Test
    void testListPop() {
        String key6 = "list6";
        ListOperations operations = redisTemplate.opsForList();
        operations.leftPushAll(key6, Arrays.asList(1, 2, 3, 4, 5));
        //获取指定索引的数据
        Object value = operations.index(key6, 2);
        System.out.println(value);
        //获取指定索引范围的数据  end为-1时是查询start后面的所有数据
        List range = operations.range(key6, 0, 3);
        System.out.println(range);
        //获取指定值的索引
        Long index = operations.indexOf(key6, 3);
        System.out.println(index);
        //获取指定值在集合中的最后一个索引位置
        Long lastIndex = operations.lastIndexOf(key6, 3);
        System.out.println(lastIndex);
        //从左边取集合移除并返回第一个元素
        Object o = operations.leftPop(key6);
        //从集合左边移除并返回3个元素
        List list = operations.leftPop(key6, 3);
        //去集合中取元素,最多等待十秒钟,如果取不到就返回
        Object o1 = operations.leftPop(key6, 10, TimeUnit.SECONDS);
        System.out.println(o1);
        String key7 = "list7";
        //从list6中移除右边第一个元素到list7中的左边第一个位置,最多等待十秒钟
        operations.rightPopAndLeftPush(key6, key7, 10, TimeUnit.SECONDS);
    }

set操作

    @Test
    void testSet() {
        SetOperations operations = redisTemplate.opsForSet();
        String key = "set";
        //向集合set中添加元素
        operations.add(key,11,22,33);

        String key1 = "set1";
        //向集合set中添加元素
        operations.add(key1,44,33,55);

        //取第一个元素
        Object pop = operations.pop(key);
        System.out.println(pop);
        //去前两个元素
        List pop1 = operations.pop(key, 2);
        //取两个集合的并集
        Set union = operations.union(Arrays.asList(key,key1));
        System.out.println(union);

        String key2="set2";
        //将两个集合的并集存储到另一个集合中
        operations.unionAndStore(Arrays.asList(key,key1),key2);
        //取所有集合的并集
        Set union1 = operations.union(key, Arrays.asList(key1, key2));

        //取集合的交集
        Set intersect = operations.intersect(Arrays.asList(key, key1, key2));

        String key3="set3";
        //将集合的交集存到另一个集合中
        operations.intersectAndStore(key,Arrays.asList(key1,key2),key3);

        //获取集合的差集
        Set difference = operations.difference(Arrays.asList(key, key1, key2));
        //将集合的差集存放到另一个集合中
        operations.differenceAndStore(key, Arrays.asList(key1, key2), key3);

        //判断1是不是key中的元素
        Boolean member = operations.isMember(key, 1);

        //判断元素是不是集合中的
        Map member1 = operations.isMember(key, 1, 2, 3);

        //从集合中随机获取不同的几个元素
        Set set = operations.distinctRandomMembers(key, 3);

        //从集合中随机获取可重复的元素
        List list = operations.randomMembers(key, 2);

        //将3从集合key中移到key1中
        operations.move(key, 3, key1);

        //查询值包含a的集合,每次查询两个  *是通配符
        Cursor scan = operations.scan(key, ScanOptions.scanOptions().match("*a*").count(2).build());
        while (scan.hasNext()){
            Object next = scan.next();
            System.out.println(next);
        }
    }

zset操作


    @Test
    void testZSet(){
        ZSetOperations operations = redisTemplate.opsForZSet();
        String key="zSet";
//        //查询新元素,分数是1,排序是按照分数排序的
        operations.add(key,"value",1);

        Set<ZSetOperations.TypedTuple> set = new HashSet<>();
        set.add(new DefaultTypedTuple("value1",Double.valueOf(2)));
        set.add(new DefaultTypedTuple("value2",Double.valueOf(3)));
        set.add(new DefaultTypedTuple("value3",Double.valueOf(2)));
//        //插入多个元素
        operations.add(key,set);
        //不存在就插入
        operations.addIfAbsent(key,"aa",1);

        //查询集合中索引0-2数据,如果end为-1就是查询start后面所有元素
        Set range = operations.range(key, 0, 2);

        //查询分数是0-100直接数据,如果max为-1就是查询所有数据
        Set set = operations.rangeByScore(key, 0, 100);

        //取分数位于0-100之间的从0个开始的100个数据
        Set set1 = operations.rangeByScore(key, 0, 100, 0, 10);

        //随机取10数据
        List list = operations.randomMembers(key, 10);

        //取分数位于0-100之间的从0个开始的100个数据
        Set<ZSetOperations.TypedTuple> set2 = operations.rangeByScoreWithScores(key, 0, 100, 0, 10);

        //查询分数是10-100之间数据
        Set set3 = operations.rangeByLex(key, RedisZSetCommands.Range.range().gt(10).lt(100));

        //给元素加分
        operations.incrementScore(key,"value",1);

        //根据值删除元素
        operations.remove(key,1,2,3);

        //删除数据
        Long aLong = operations.removeRange(key, 0, 1);

//        交并差参考zet
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值