redisspringboot

springboot 集成 redis使用实践

2021-03-03  本文已影响0人  Geroge1226

1、背景介绍

Redis作为缓存工具,大部分项目中会经常用到。为方便以后快速集成Redis,现将SpringBoot 集成Redis 实践过程记录如下。

2、springboot 集成redis步骤

1、pom包引入Redis依赖

 <!-- 引用Redis -->
 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>
# 注意:
<!--这里我使用的springboot 2.2.1-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.1.RELEASE</version>
    <relativePath />
</parent>

2、yml文件配置Redis相关

spring:
  application:
    name: redis-demo
  redis:
    host: localhost
    database: 1
    jedis:  # 配置jedis线程池,也可以配置Lettuce
      pool:
        max-active: 8 # 最大活动数量()
        max-wait: -1 # 连接池最大阻塞时间 (使用负数表示没有限制)
    port: 6379  # 6379默认端口,不配置就取默认
  # --lettuce 配置
  #  lettuce:
  #   pool:
  #     max-active: 

注:
这里可以选用redis 的lettuce client端。配置和 jedis一致。

3、编写RedisConfig配置类


/**
 * All rights Reserved, Designed By www.pousheng.com
 *
 * @version V1.0
 * @Title: RedisConfig
 * @Package com.lsy.redisdemo.config
 * @Description: 简单描述下这个类是做什么用的
 * */
@Configuration
public class RedisConfig {
    /**
     * @name: redisTemplate
     * @description: RedisTemplate
     * @param redisConnectionFactory
     * @return: org.springframework.data.redis.core.RedisTemplate<java.lang.String,java.lang.Object>
     * @date: 2020-12-04 13:19
     *
    */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer(Object.class);
        // 设置键(key)的序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // 设置value序列化
        redisTemplate.setValueSerializer(serializer);
        // 设置HashKey序列化 为啥要hashkey
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // 设置HashValue序列化
        redisTemplate.setHashValueSerializer(serializer);
        // 默认序列化
        redisTemplate.setDefaultSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

到这里,简单Redis集成已经完成了,使用到地方,直接@Autowired redisTemplate 即可。

 @Autowired
    private RedisTemplate redisTemplate;

接下来就将不同数据类型操作整理如下:

3、redisTemplate 对于不同数据结构的Curd举例:

redisTemplate.opsForList();//操作list
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForCluster();//集群时使用
redisTemplate.opsForGeo();//地理位置时使用
redisTemplate.opsForHash();//操作散列
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
redisTemplate.opsForHyperLogLog(); //操作有序set
3.1 字符串类型

opsForValue常用方法说明如下:

redisTemplate.opsForValue().setIfAbsent(key,value,timeoutR, TimeUnit.DAYS);
redisTemplate.opsForValue().setIfPresent(key,value,timeoutR, TimeUnit.DAYS);
3.2 散列类型

opsForHash()常用方法如下:

【示例】
key:123456 对应的hash对象如下:

image.png

执行putALL方法,key:123456 Map对象值如下,与redis中已经存在的比较,减少了"mobile",增加了"birthday"。

{
  "id": "123456",
  "userName": "usr",
  "memberId": "337462",
  "birthday": "2021-06-08 16:42:01"
}

执行结果如下:

image.png
3.3 列表类型

现有列表如下:

image.png
opsForList常用方法说明
3.3 set集合型类型

opsForSet常用方法说明:

3.4 zset有序集合类型

opsForZSet常用方法说明

4、redisTemplate中管理redis事务

RedisTemplate来操作Redis,关于事务操作的时候会有问题:

  public void redisMulti(String key, Long increment){
        // redis事务开启
        redisTemplate.multi();
        redisTemplate.opsForValue().increment(key,increment);
        redisTemplate.opsForValue().increment(key,increment);
        redisTemplate.opsForValue().increment(key,increment);
        redisTemplate.opsForValue().increment(key,increment);
        redisTemplate.exec();
    }

原本以为按照如下操作redis事务,但断点在exec地方,还未执行exec()方法,redis客户端里就已近存有key的计算结果。当执行完毕后会报如下错误:

21-06-10 14:04:07.721 ERROR 80076 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/redis-demo] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR EXEC without MULTI] with root cause
io.lettuce.core.RedisCommandExecutionException: ERR EXEC without MULTI
    at io.lettuce.core.ExceptionFactory.createExecutionException(ExceptionFactory.java:135) ~[lettuce-core-5.1.7.RELEASE.jar:na]
    at io.lettuce.core.ExceptionFactory.createExecutionException(ExceptionFactory.java:108) ~[lettuce-core-5.1.7.RELEASE.jar:na]
省略

原因是配置redisTemplate地方未开启事务,增加如下部分:

  // 开启事务
 redisTemplate.setEnableTransactionSupport(true);
上一篇 下一篇

猜你喜欢

热点阅读