springDataRedis操作

发布于:2022-12-17 ⋅ 阅读:(625) ⋅ 点赞:(0)

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏::本文写在java专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

一、基础环境

maven坐标

<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>2.7.2</version>
</dependency>


yml文件

spring:
  redis:
    host: IP地址
    port: 6379
    database: 0 #redis默认提供l 16个数据库 这里指定0号数据库
    password:  0615
    jedis: #连接池
      pool:
        max-active: 20  #最大连接数,负值表示没有限制,默认8
        max-wait: -1    #最大阻塞等待时间,负值表示没限制,默认-1
        max-idle: 4     #最大空闲连接,默认8
        min-idle: 0     #最小空闲连接,默认0



自动管理连接池,提供了一个高度封装的RedisTemplate类
针对jedis客户端的大量api进行了归类封装,把同一类型的操作封装成了operation接口,具体如下

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:针对map类型的数据操作
  • ListOperations:针对list类型的数据操作

二、设置序列化

我们先来执行如下代码

@SpringBootTest
@RunWith(SpringRunner.class)
public class Test01 {

    @Resource
    private RedisTemplate redisTemplate;

    @Test
    public void testString(){
        redisTemplate.opsForValue().set("city","遂宁");
    }
}

运行结果
在这里插入图片描述

可见代码运行成功
我们来看看redis
在这里插入图片描述
却没有我们设置的key 因为redisTemplate给我们序列化了!我们如何改变这个序列化?

配置类修改默认的序列化

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //设置键的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置值的序列化方式
        redisTemplate.setValueSerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }

再来运行代码
在这里插入图片描述
成功后
在这里插入图片描述
虽然value还是那样但是可以不用序列化 因为get后也会反序列化

@Test
    public void testString1(){
        final Object city1 = redisTemplate.opsForValue().get("city1");
        System.out.println("=============");
        System.out.println(city1);
        System.out.println("=============");
    }

结果:
在这里插入图片描述

三、操作数据类型string

简介:String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

上代码

/**
     * 操作string类型的数据
     */
    @Test
    public void testString1(){
        //设置值
        redisTemplate.opsForValue().set("city2","遂宁2");

        //设置值的同时设置过期时间  参数说明(key,vaule,lONG型的数据,单位)
        redisTemplate.opsForValue().set("key1","value",10l, TimeUnit.SECONDS);

        //setNx 当值存在就不设置,不存在才设置
         Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city2", "成都");
        System.out.println("********"+aBoolean+"********");
        aBoolean = redisTemplate.opsForValue().setIfAbsent("city3", "成都");
        System.out.println("********"+aBoolean+"********");

        //得到所有的key
        final Set keys = redisTemplate.keys("*");
        System.out.println(keys);

    }

在这里插入图片描述


四、操作数据类型Hash

Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里面的Map<String,Object>
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储

上代码

 /**
     * 操作hash类型
     */
    @Test
    public void testHash(){
        //存值
        redisTemplate.opsForHash().put("001","name","笑霸");
        redisTemplate.opsForHash().put("001","age","18");
        redisTemplate.opsForHash().put("001","address","北京");

        //取值
        final Object name = redisTemplate.opsForHash().get("001", "name");
        final Object address = redisTemplate.opsForHash().get("001", "address");
        System.out.println(name+"======"+address);

        //获得hash中所有的字段
        System.out.println("获得hash中所有的字段");
        final Set keys = redisTemplate.opsForHash().keys("001");
        for (Object key : keys) {
            System.out.println(key);
        }
        //获得hash结构中所有值
        System.out.println("获得hash结构中所有值");
        final List values = redisTemplate.opsForHash().values("001");
        for (Object value : values) {
            System.out.println(value);
        }


    }

在这里插入图片描述


五、操作数据类型List

简介
单键多值
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

/**
     * 操作数据类型List
     */
    @Test
    public void testList(){
        final ListOperations listOperations = redisTemplate.opsForList();
        //存值
        listOperations.leftPush("001","a");

        //存值(从左存入多个值)
       listOperations.leftPushAll("003","b","c","d");

        //取值
         List ranges = listOperations.range("003", 0, -1);
        for (Object range : ranges) {
            System.out.print(range+" ");
        }
        System.out.println();//换行

        //获取长度
        final Long size = listOperations.size("003");
        System.out.println("003的长度为 "+size);

        System.out.print("弹出值:");
        final int iSize = size.intValue();
        for (int i = 0; i < iSize; i++) {
            final Object leftPop = listOperations.leftPop("003");
            System.out.print(leftPop+" ");
        }
        System.out.println();//换行

        //取值
        System.out.println("弹出后再次取值为:");
         ranges = listOperations.range("003", 0, -1);
            for (Object range : ranges) {
            System.out.print(range+" ");
        }
    }

在这里插入图片描述

六、操作数据类型Set

Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变

/**
     * 操作数据类型Set
     */
    @Test
    public void testSet(){
        final SetOperations setOperations = redisTemplate.opsForSet();
        
        //存值
        setOperations.add("k1","a","b","c","a");
        
        //取值
         Set k1s = setOperations.members("k1");
        for (Object k1 : k1s) {
            System.out.println(k1);
        }

        //删除成员
        setOperations.remove("k1","a","b","d");
        System.out.println("===删除后===");
        k1s = setOperations.members("k1");
        for (Object k1 : k1s) {
            System.out.println(k1);
        }
        
    }

在这里插入图片描述

七、操作数据类型ZSet(有序集合)

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

 /**
     * 七、操作数据类型ZSet(有序集合)
     */
    @Test
    public void testZSet(){
        final ZSetOperations zSetOperations = redisTemplate.opsForZSet();

        //存值
        zSetOperations.add("k2","a",10);
        zSetOperations.add("k2","b",11);
        zSetOperations.add("k2","c",12);
        zSetOperations.add("k2","d",12);
        zSetOperations.add("k2","a",10);

        //取值
         Set k2s = zSetOperations.range("k2", 0, -1);
        for (Object k2 : k2s) {
            System.out.println(k2);
        }
        System.out.println("取值完毕");
        //修改值
        zSetOperations.incrementScore("k2","e",15);//追加元素
        zSetOperations.incrementScore("k2","a",20);//修改
        //取值
        k2s = zSetOperations.range("k2", 0, -1);
        for (Object k2 : k2s) {
            System.out.println(k2);
        }
        System.out.println("修改后取值完毕");

        //删除成员
        zSetOperations.remove("k2","a","b");//删除指定的
        zSetOperations.removeRange("k2",0,-1);//删除范围的

    }

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到