成都网站建设设计

将想法与焦点和您一起共享

SpringBoot操作Redis-创新互联

目录

创新互联公司始终坚持【策划先行,效果至上】的经营理念,通过多达十余年累计超上千家客户的网站建设总结了一套系统有效的网络营销推广解决方案,现已广泛运用于各行各业的客户,其中包括:成都广告设计等企业,备受客户称扬。

1.IDE创建一个maven项目

2、 添加redis启动器

3.修改配置文件application.properties

4.在测试类中测试 

SpringBoot操作Hash(哈希)

SpringBoot操作List集合类型

SpringBoot操作Set集合类型

SpringBoot操作ZSet集合类型


1.IDE创建一个maven项目

2、 添加redis启动器

pring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redis,它依赖于 spring-data-redis 和 lettuce 。

另外,这里还有两个小细节:

  • Spring Boot 1.x 时代,spring-data-redis 底层使用的是 Jedis;2.x 时代换成了 Lettuce 。

  • Lettuce依赖于 commons-pool2

org.springframework.boot spring-boot-starter-data-redisorg.apache.commonscommons-pool2
  • Lettuce 的 timed out 问题

在 Spring Boot 2.x 默认使用 Lettuce 之后,会偶发性出现Redis command timed out问题,从而导致客户端(Java 代码)无法连接到 Redis Server 的问题。

而且该问题无法正面解决。网上通用的解决方案是:放弃使用 Lettuce 驱动,转而使用 Jedis 驱动。

这种情况下,你需要手动排除 spring-data-redis 对 Lettuce 的依赖,并引入 Jedis 依赖。

org.springframework.bootspring-boot-starter-data-redisio.lettuce  lettuce-coreredis.clientsjedis

如果springboot的版本是2.3.7 中这个问题不存在了  

3.修改配置文件application.properties
## Redis 服务器地址
spring.redis.host=localhost
## Redis 服务器连接端口
spring.redis.port=6379
## Redis 数据库索引(默认为 0)
spring.redis.database=0

## 以下非必须,有默认值
## Redis 服务器连接密码(默认为空)
spring.redis.password=
## 连接池大连接数(使用负值表示没有限制)默认 8
spring.redis.lettuce.pool.max-active=8
## 连接池大阻塞等待时间(使用负值表示没有限制)默认 -1
spring.redis.lettuce.pool.max-wait=-1
## 连接池中的大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
## 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

一般情况下我们用到的就是前三行

## Redis 服务器地址
spring.redis.host=localhost
## Redis 服务器连接端口
spring.redis.port=6379
## Redis 数据库索引(默认为 0)
spring.redis.database=0
4.在测试类中测试  SpringBoot操作Hash(哈希)

一般我们存储一个键,很自然的就会使用 get/set 去存储,实际上这并不是很好的做法。Redis 存储一个 key 会有一个最小内存,不管你存的这个键多小,都不会低于这个内存,因此合理的使用 Hash 可以帮我们节省很多内存。

Hash Set 就在哈希表 Key 中的域(Field)的值设为 value。如果 Key 不存在,一个新的哈希表被创建并进行 HSET 操作;如果域(field)已经存在于哈希表中,旧值将被覆盖。

先来看 Redis 对 Pojo 的支持,新建一个 Student 对象(需要实现 Serializable 接口),放到缓存中,再取出来。

@Test
    void contextLoads() {
        //测试hash
        // ValueOperations valueOperations = redisTemplate.opsForValue();
        //生成操作hash类型数据类
        HashOperations hashOperations = redisTemplate.opsForHash();
        //参数1:数据分组
        //参数2:Field
        //参数3:value
        hashOperations.put("good", "name", "面包");
        hashOperations.put("good", "price", "30");
        hashOperations.put("good", "num", "10");


        Object o = hashOperations.get("good", "name");
        System.out.println(o);
    }

如上述代码所示,hash是使用set,get来添加和获取,这里添加hash需要三个参数分别是,这个数据分组,然后是上述的域,之后是值,同时,获取的时候我们则也是通过两个参数来获取,第一个参数是组,之后是域, 执行测试

SpringBoot操作List集合类型

Redis List 的应用场景非常多,也是 Redis 最重要的数据结构之一。 使用 List 可以轻松的实现一个队列, List 典型的应用场景就是消息队列,可以利用 List 的 Push 操作,将任务存在 List 中,然后工作线程再用 POP 操作将任务取出进行执行。

@Test
    void testRedisList() {
        //测试list
        ListOperations listOperations = redisTemplate.opsForList();
        //leftPush是从左往后排
        //listOperations.leftPush("list", "hello");
        //listOperations.leftPush("list", "world");
        //listOperations.leftPush("list", "!!!");
        //遍历
        //从第一元素到向后找两个元素
        //List list = listOperations.range("list", 0, 2);
        //list.forEach(e ->System.out.println(e));

        //拿最左边的数据,会删除该数据
        Object leftList = listOperations.leftPop("list");
        System.out.println(leftList);
        //拿最右边数据,会删除该数据
        Object rightList = listOperations.rightPop("list");
        System.out.println(rightList);
    }

list类型,我们这里放入可以通过leftpush和rightpush来进行放入数据,leftpush是作为从左往后放,每次放都会放在左边(即最前边),同理,rightpush的时候是从右往后放,每次放都会放在右边(即最后边),

通过range来遍历集合则是需要三个参数,分别需要的是集合之后两个参数是集合的下标的开始和要找的元素个数,上述代码就是从第一元素开始向后找两个元素,如果使用leftpop,则会显示集合中最左边的元素,但是同时也会删除该元素,即在redis中删除,所以只能使用一次,下次使用的话即是下一个最左边元素,rightpop同理 

Redis List 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis 内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

SpringBoot操作Set集合类型

Redis Set 对外提供的功能与 List 类似,是一个列表的功能,特殊之处在于 Set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,Set 是一个很好的选择,并且 Set 提供了判断某个成员是否在一个 Set 集合内的重要接口,这个也是 List 所不能提供的。

@Test
    void testSet(){
        SetOperations setOperations = redisTemplate.opsForSet();
        setOperations.add("set","hello");
        setOperations.add("set","hello");
        setOperations.add("set","world");
        setOperations.add("set","!!!");
        setOperations.add("set","!!!");


        Set set = setOperations.members("set");
        set.forEach(e->System.out.println(e));
    }

输出结果 

set可以理解为无序排列,但是可以去重

SpringBoot操作ZSet集合类型

Redis Sorted Set 的使用场景与 Set 类似,区别是 Set 不是自动有序的,而 Sorted Set 可以通过用户额外提供一个优先级(Score)的参数来为成员排序,并且是插入有序,即自动排序。

在使用 Zset 的时候需要额外的输入一个参数 Score,Zset 会自动根据 Score 的值对集合进行排序,我们可以利用这个特性来做具有权重的队列,比如普通消息的 Score 为 1,重要消息的 Score 为 2,然后工作线程可以选择按 Score 的倒序来获取工作任务。

@Test
    void testZset(){
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
       // zSetOperations.add("news","hello",1);
       // zSetOperations.add("news","world",4);
        //zSetOperations.add("news","good",2);
        //zSetOperations.add("news","bye",3);
        //根据score 从小到大排序,0和3是集合的下标
        Set samll = zSetOperations.range("news", 0, 3);
        samll.forEach(e->System.out.println(e));
        System.out.println("========================================");
        //根据score 从大到小排序,0和3是集合的下标
        Set big = zSetOperations.reverseRange("news", 0, 3);
        big.forEach(e->System.out.println(e));
        System.out.println("========================================");
        //根据score的大小权重查询
        Set score = zSetOperations.rangeByScore("news", 3, 4);
        score.forEach(e->System.out.println(e));
    }

上述输出结果是 

range在这里是按照设置参数时的大小,从小到大排序,后面参数为下标来代表启始和结束

reverseRange则是按照设置参数时的从小到大排序,后面参数为下标来代表启始和结束

rangeByScore则是根据当时设置的score的大小权重来进行查询,后面参数是权重是3和4,排序也是按照这个权重大小

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享标题:SpringBoot操作Redis-创新互联
转载注明:http://chengdu.cdxwcx.cn/article/dgegpi.html