当前位置:   article > 正文

Spring Boot 使用 Redis

Spring Boot 使用 Redis

1,Spring 是如何集成Redis的?

首先我们要使用jar包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.apache.commons</groupId>
  7. <artifactId>commons-pool2</artifactId>
  8. </dependency>

2,我们使用的时候需要用到高级封装

2,配置Redis

  1. # Redis服务器地址
  2. spring.redis.host=10.1.30.222
  3. # Redis数据库索引(默认为0
  4. spring.redis.database=0
  5. # Redis服务器连接端口
  6. spring.redis.port=6379
  7. # Redis服务器连接密码(默认为空)
  8. #spring.redis.password=
  9. ## 连接超时时间(毫秒)
  10. spring.redis.timeout=30000
  11. # 连接池最大连接数(使用负值表示没有限制) 默认 8
  12. spring.redis.lettuce.pool.max-active=8
  13. # 连接池中的最大空闲连接 默认 8
  14. spring.redis.lettuce.pool.max-idle=8
  15. # 连接池中的最小空闲连接 默认 0
  16. spring.redis.lettuce.pool.min-idle=1
  17. #连接池中最大空闲等待时间,3s没有活干的时候直接驱逐该链接
  18. spring.redis.lettuce.pool.min-evictable-idle-time-millis = 3000
  19. # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
  20. spring.redis.lettuce.pool.max-wait=-1

StringRedisTemplate

String

  1. public class StringDemo {
  2. @Autowired
  3. private StringRedisTemplate stringRedisTemplate;
  4. private final String key = "zhengzhou";
  5. public void test() {
  6. stringRedisTemplate.opsForValue().set(key, "我的家乡", 30, TimeUnit.SECONDS);
  7. String value = stringRedisTemplate.opsForValue().get(key);
  8. System.out.println(value);
  9. }
  10. }

Java

Hash

  1. @Component
  2. public class HashDemo {
  3. @Autowired
  4. private StringRedisTemplate stringRedisTemplate;
  5. private final String key ="zhouxingxing";
  6. public void test(){
  7. stringRedisTemplate.opsForHash().put(key,"20220325","郑州");
  8. stringRedisTemplate.opsForHash().put(key,"20220326","洛阳");
  9. List<Object> values = stringRedisTemplate.opsForHash().values(key);
  10. for (Object value:values){
  11. System.out.println(value);
  12. }
  13. }
  14. }

Java

List

  1. @Component
  2. public class ListDemo {
  3. @Autowired
  4. private StringRedisTemplate stringRedisTemplate;
  5. private final String key ="onewayroad";
  6. void test(){
  7. stringRedisTemplate.opsForList().leftPush(key,"周星星");
  8. stringRedisTemplate.opsForList().leftPush(key,"张敏");
  9. stringRedisTemplate.opsForList().leftPush(key,"李大锤");
  10. String value = stringRedisTemplate.opsForList().rightPop(key);
  11. System.out.println(value);
  12. }
  13. }
  14. @Test
  15. void test6() {
  16. // 如果一些原生命令,spring 没有给我们封装,redisTemplate.execute(new RedisCallback)
  17. while (true){
  18. System.out.println("开始一轮监听");
  19. List<byte[]> rawResults = redisTemplateProduct.execute(new RedisCallback<List<byte[]>>() {
  20. @Override
  21. public List<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {
  22. return connection.bRPop(5,"product.hot".getBytes());
  23. }
  24. });
  25. if(ObjUtil.isNotEmpty(rawResults)){
  26. byte[] rawKey = rawResults.get(0);
  27. byte[] rawValue = rawResults.get(1);
  28. Product product = (Product)redisTemplateProduct.getValueSerializer().deserialize(rawValue);
  29. System.out.println(product);
  30. }
  31. }

Java

Set

  1. @Component
  2. public class SetDemo {
  3. @Autowired
  4. private StringRedisTemplate stringRedisTemplate;
  5. private final String zhouxingxing ="zhouxingxing";
  6. private final String zhangmin = "zhangming";
  7. public void test(){
  8. //添加周星星同学感兴趣的科目
  9. stringRedisTemplate.opsForSet().add(zhouxingxing,"语文");
  10. stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");
  11. stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");
  12. //添加张敏同学感兴趣的科目
  13. stringRedisTemplate.opsForSet().add(zhangmin,"数学");
  14. stringRedisTemplate.opsForSet().add(zhangmin,"英语");
  15. //获取两位同学共同感兴趣的科目
  16. Set<String> values = stringRedisTemplate.opsForSet().intersect(zhouxingxing, zhangmin);
  17. System.out.println("周星星和张敏共同感兴趣的科目为:");
  18. for(String value : values){
  19. System.out.println(value);
  20. }
  21. }
  22. }

Java

ZSet

  1. @Component
  2. public class ZSetDemo {
  3. @Autowired
  4. private StringRedisTemplate stringRedisTemplate;
  5. private final String key ="zhouxingxing";
  6. public void test(){
  7. //添加周星星同学成绩
  8. stringRedisTemplate.opsForZSet().add(key,"语文",98);
  9. stringRedisTemplate.opsForZSet().add(key,"数学",87);
  10. stringRedisTemplate.opsForZSet().add(key,"英语",75);
  11. //获取分数最高的成绩
  12. ZSetOperations.TypedTuple<String> values = stringRedisTemplate.opsForZSet().popMax(key);
  13. //打印值
  14. System.out.println("周星星最好成绩科目是:"+values.getValue());
  15. System.out.println("周星星最好成绩:"+values.getScore());
  16. }
  17. }

Java

BitMap

  1. @Component
  2. public class BitMapDemo {
  3. @Autowired
  4. private StringRedisTemplate stringRedisTemplate;
  5. private final String key ="sign#2022#zhouxingxing";
  6. public void test(){
  7. //设置签到
  8. stringRedisTemplate.opsForValue().setBit(key,2,true);
  9. stringRedisTemplate.opsForValue().setBit(key,85,true);
  10. //获取周星星同学的签到天数
  11. RedisCallback<Long> callback = connection -> { return connection.bitCount(key.getBytes(),0,365);};
  12. Long count = stringRedisTemplate.execute(callback);
  13. //打印周星星2022年签到天数
  14. System.out.println("周星星2022年一共签到天数:"+count);
  15. }
  16. }

Java

3.RedisTemplate

3.1泛型约束的使用

  1. @Component
  2. public class RedisTemplateDemo {
  3. @Autowired
  4. private StringRedisTemplate stringRedisTemplate;
  5. @Autowired
  6. private RedisTemplate<String, String> redisTemplate_string_string;
  7. @Resource
  8. private RedisTemplate<String, User> redisTemplate;
  9. @Resource(name="redisTemplate")
  10. private ValueOperations<String,User> valueOperations;
  11. private final String key = "useris#01";
  12. public void test() {
  13. User user = User.builder().id(1).name("李四").build();
  14. redisTemplate.opsForValue().set(key,user );
  15. User value = redisTemplate.opsForValue().get(key);
  16. valueOperations.set(key,user );
  17. User value2 = valueOperations.get(key);
  18. System.out.println(value);
  19. }
  20. }

4,乱码的问题

  1. JdkSerializationRedisSerializer serializer = new JdkSerializationRedisSerializer();
  2. byte[] serialize = serializer.serialize("user#01");
  3. System.out.println(new String(serialize));

自定义序列化工具

  1. @Configuration
  2. public class RedisConfig {
  3. @Bean //主动注册了一个名字叫redisTemplate 的bean
  4. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
  5. {
  6. RedisTemplate<Object, Object> template = new RedisTemplate<>();
  7. template.setConnectionFactory(redisConnectionFactory);
  8. Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);
  9. ObjectMapper mapper = new ObjectMapper();
  10. // 启用默认类型推理,将类型信息作为属性写入JSON
  11. // 就是把对象的全类名写入json
  12. mapper.activateDefaultTyping( mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
  13. jackson.setObjectMapper(mapper);
  14. template.setKeySerializer(StringRedisSerializer.UTF_8);
  15. template.setValueSerializer(jackson);
  16. template.setHashKeySerializer(StringRedisSerializer.UTF_8);
  17. template.setHashValueSerializer(jackson);
  18. return template;
  19. }
  20. }

为什么要自定话应该序列化工具,因为他自己提供的不是很好,所以我们要自己定义一个,这样的话可以把java对象转化成json和字节码存入Redis 里,反序列化就是把json和字节码转化为java对象,泛型指定为 Object.class 表示可以处理任何类型的对象。

最后返回配置好的 RedisTemplate 实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。

详细的介绍:

  1. @Configuration 注解表明这是一个配置类,Spring IoC容器将会读取该类中的bean定义。

  2. @Bean 注解的方法表示该方法会返回一个对象,该对象会被注册为Spring容器中的bean。在这个例子中,方法名为 redisTemplate,所以生成的bean的名字也是 "redisTemplate"。

  3. 方法体中首先创建了一个 RedisTemplate<Object, Object> 实例,并将其连接工厂设置为传入的 RedisConnectionFactory,这是连接Redis的基础配置。

  4. 创建了 Jackson2JsonRedisSerializer 实例,用于将Java对象序列化为JSON字符串,反序列化时则将JSON字符串转回为Java对象。泛型指定为 Object.class 表示可以处理任何类型的对象。

  5. 初始化 ObjectMapper,它是Jackson库中用于处理JSON的核心类。这里启用了默认类型推理(activateDefaultTyping),这样在序列化时,即使目标类没有显式地声明类型信息,也能根据实际运行时类型推断并在JSON中包含类型信息,这对于处理多态类型的场景非常有用。

  6. 将初始化好的 ObjectMapper 设置给 Jackson2JsonRedisSerializer

  7. 配置RedisTemplate的序列化策略:

    • template.setKeySerializer(StringRedisSerializer.UTF_8); 设置键(key)的序列化器为 StringRedisSerializer,以UTF-8格式进行字符串序列化。
    • template.setValueSerializer(jackson); 设置值(value)的序列化器为刚才创建的 Jackson2JsonRedisSerializer,即所有值都将转化为JSON字符串存储。
    • template.setHashKeySerializer(StringRedisSerializer.UTF_8); 设置哈希表键(hash key)的序列化器也为 StringRedisSerializer,同样以UTF-8格式进行字符串序列化。
    • template.setHashValueSerializer(jackson); 设置哈希表值(hash value)的序列化器为 Jackson2JsonRedisSerializer,意味着哈希表中的每个值也将被转化为JSON字符串存储。

最后,返回配置好的 RedisTemplate 实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。

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

闽ICP备14008679号