当前位置:   article > 正文

redis 在idea里面的使用_idea redis

idea redis

一.redis的发布订阅

什么 是发布和订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

Redis 客户端可以订

Redis的发布和订阅

客户端订阅频道发布的消息

频道发布消息 订阅者就可以收到消息

发布订阅的代码实现

1、 打开一个客户端订阅channel1

2、打开另一个客户端,给channel1发布消息hello

publish channel1 hello

        返回的1是订阅者数量

3、打开第一个客户端可以看到发送的消息

二.redis事务

1.事务简介

可以一次执行多个命令,本质是一组命令的集合。一个事务中的 所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。

单独的隔离的操作

官网说明

https://redis.io/docs/interact/transactions/icon-default.png?t=N7T8https://redis.io/topics/transactions

MULTI、EXEC、DISCARD、WATCH。这四个指令构成了 redis 事务处理的基础。

1.MULTI 用来组装一个事务;将命令存放到一个队列里面

2.EXEC 用来执行一个事务;//commit

3.DISCARD 用来取消一个事务;//rollback

4.WATCH 用来监视一些 key,一旦这些 key 在事务执行之前被改变,则取消事务的执行。

示例:

MULTI //标记事务开始

INCR user_id //多条按顺序入队

EXEC //执行

有关事务,经常会遇到的是两类错误

1.调用 EXEC 之前的错误

“调用 EXEC 之前的错误”,有可能是由于语法有误导致的,也可能时由于内存不足导致的。只要出现某个命令无法成功写入缓冲队列的情况,redis 都会进行记录,在客户端调用 EXEC 时,redis 会拒绝执行这一事务

add tem v1 v2 v3 错误的命令

2.调用 EXEC 之后的错误

而对于“调用 EXEC 之后的错误”,redis 则采取了完全不同的策略,即 redis 不会理睬这些错误,而是继续向下执行事务中的其他命令。这是因为,对于应用层面的错误,并不是 redis 自身需要考虑和处理的问题,所以一个事务中如果某一条命令执行失败,并不会影响接下来的其他命令的执行

例子:

3.WATCH

“WATCH”可以帮我们实现类似于“乐观锁”的效果,即 CAS(check and set)。

WATCH 本身的作用是“监视 key 是否被改动过”,而且支持同时监视多个 key,只要还没真正触发事务,WATCH 都会尽职尽责的监视,一旦发现某个 key 被修改了,在执行 EXEC 时就会返回 nil,表示事务无法触发。

示例:

watch myage //开始监控 myage

set myage 12 //在exec之前,age的值被修改了

nil //事务无法被执行

事务回滚:

三.Redis的使用

1.创建java项目

2.添加redis的依赖

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>3.2.0</version>
  5. </dependency>

3.在idea里使用redis

4.在java里面操作redis

5.redis整合springboot

1.创建spring项目

2.加入redis的依赖
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
3.编写配置文件
  1. #设置reis的索引
  2. spring.redis.database=15
  3. #设置连接redis的密码
  4. spring.redis.password=yyl
  5. #设置的redis的服务器
  6. spring.redis.host=192.168.158.129
  7. #端口号
  8. spring.redis.port=6379
  9. #连接超时时间(毫秒)
  10. spring.redis.timeout=1800000
  11. #连接池最大连接数(使用负值表示没有限制)
  12. spring.redis.lettuce.pool.max-active=20
  13. #最大阻塞等待时间(负数表示没限制)
  14. spring.redis.lettuce.pool.max-wait=-1
  15. #连接池中的最大空闲连接
  16. spring.redis.lettuce.pool.max-idle=5
  17. #连接池中的最小空闲连接
  18. spring.redis.lettuce.pool.min-idle=0
4.设置配置类
  1. package com.example.demo;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.PropertyAccessor;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import org.springframework.cache.CacheManager;
  6. import org.springframework.cache.annotation.CachingConfigurerSupport;
  7. import org.springframework.cache.annotation.EnableCaching;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  11. import org.springframework.data.redis.cache.RedisCacheManager;
  12. import org.springframework.data.redis.connection.RedisConnectionFactory;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  15. import org.springframework.data.redis.serializer.RedisSerializationContext;
  16. import org.springframework.data.redis.serializer.RedisSerializer;
  17. import org.springframework.data.redis.serializer.StringRedisSerializer;
  18. import java.time.Duration;
  19. @EnableCaching
  20. @Configuration
  21. public class RedisConfig extends CachingConfigurerSupport {
  22. /**
  23. * 连接池的设置
  24. *
  25. * @return
  26. */
  27. @Bean
  28. public JedisPoolConfig getJedisPoolConfig() {
  29. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  30. return jedisPoolConfig;
  31. }
  32. /**
  33. * RedisTemplate
  34. * @param factory
  35. * @return
  36. */
  37. @Bean
  38. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  39. RedisTemplate<String, Object> template = new RedisTemplate<>();
  40. RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  41. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  42. ObjectMapper om = new ObjectMapper();
  43. // 指定要序列化的域,field,getset,以及修饰符范围,ANY是都有包括private和public
  44. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  45. // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
  46. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  47. jackson2JsonRedisSerializer.setObjectMapper(om);
  48. template.setConnectionFactory(factory);
  49. //key序列化方式
  50. template.setKeySerializer(redisSerializer);
  51. //value序列化
  52. template.setValueSerializer(jackson2JsonRedisSerializer);
  53. //value hashmap序列化
  54. template.setHashValueSerializer(jackson2JsonRedisSerializer);
  55. return template;
  56. }
  57. /**
  58. * 缓存处理
  59. * @param factory
  60. * @return
  61. */
  62. @Bean
  63. public CacheManager cacheManager(RedisConnectionFactory factory) {
  64. RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  65. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  66. //解决查询缓存转换异常的问题
  67. ObjectMapper om = new ObjectMapper();
  68. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  69. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  70. jackson2JsonRedisSerializer.setObjectMapper(om);
  71. // 配置序列化(解决乱码的问题),过期时间600
  72. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
  73. .entryTtl(Duration.ofSeconds(600))
  74. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
  75. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
  76. .disableCachingNullValues();
  77. RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
  78. .cacheDefaults(config)
  79. .build();
  80. return cacheManager;
  81. }
  82. }
5.编写测试代码

spring-data-redis针对jedis提供了如下功能:

1. 连接池自动管理,提供了一个高度封装的“RedisTemplate”类

2. RedisTemplate 对五种数据结构分别定义了操作

操作字符串

redisTemplate.opsForValue();

操作hash

redisTemplate.opsForHash();

操作list

redisTemplate.opsForList();

操作set

redisTemplate.opsForSet();

操作有序set

redisTemplate.opsForZSet();

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/801268
推荐阅读
相关标签
  

闽ICP备14008679号