spring-data-redis 2.0 的使用

在使用Spring Boot2.x运行Redis时,发现百度不到顺手的文档,搞通后发现其实这个过程非常简单和简洁,觉得有必要拿出来分享一下。

Spring Boot2.x 不再使用Jedis,换成了Lettuce。Lettuce是基于 Netty 实现的,所以性能更好。但是我看到很多文章居然在Spring Boot 2.x还在写Jedis的配置。

依赖比较简单,spring-boot-starter-data-redis、commons-pool2 即可。


        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--spring2.0&#x96C6;&#x6210;redis&#x6240;&#x9700;common-pool2-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.4.2</version>
        </dependency>

在属性中配置Redis Server的访问地址、密码、数据库,并配置连接池的属性。


  redis:
    #    reids&#x7684;&#x8FDE;&#x63A5;ip
    host: 127.0.0.1
    port: 6379
    password: helloworld

    # Redis&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#x6709;16&#x4E2A;&#x5206;&#x7247;&#xFF0C;&#x8FD9;&#x91CC;&#x914D;&#x7F6E;&#x5177;&#x4F53;&#x4F7F;&#x7528;&#x7684;&#x5206;&#x7247;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F;0
    database: 0

    # &#x8FDE;&#x63A5;&#x8D85;&#x65F6;&#x65F6;&#x95F4;&#xFF08;&#x6BEB;&#x79D2;)
    timeout: 10000ms

    #  redis client&#x914D;&#x7F6E;&#xFF0C;&#x4F7F;&#x7528;lettuce
    lettuce:
      pool:
        # &#x8FDE;&#x63A5;&#x6C60;&#x4E2D;&#x7684;&#x6700;&#x5C0F;&#x7A7A;&#x95F2;&#x8FDE;&#x63A5; &#x9ED8;&#x8BA4; 0
        min-idle: 0
        # &#x8FDE;&#x63A5;&#x6C60;&#x6700;&#x5927;&#x963B;&#x585E;&#x7B49;&#x5F85;&#x65F6;&#x95F4;&#xFF08;&#x4F7F;&#x7528;&#x8D1F;&#x503C;&#x8868;&#x793A;&#x6CA1;&#x6709;&#x9650;&#x5236;&#xFF09; &#x9ED8;&#x8BA4; -1
        max-wait: 1000ms
        # &#x8FDE;&#x63A5;&#x6C60;&#x6700;&#x5927;&#x8FDE;&#x63A5;&#x6570;&#xFF08;&#x4F7F;&#x7528;&#x8D1F;&#x503C;&#x8868;&#x793A;&#x6CA1;&#x6709;&#x9650;&#x5236;&#xFF09; &#x9ED8;&#x8BA4; 8
        max-active: 8
        # &#x8FDE;&#x63A5;&#x6C60;&#x4E2D;&#x7684;&#x6700;&#x5927;&#x7A7A;&#x95F2;&#x8FDE;&#x63A5; &#x9ED8;&#x8BA4; 8
        max-idle: 8

全局使能缓存


@EnableSwagger2          // &#x4F7F;&#x7528;swagger api &#x529F;&#x80FD;
@EnableCaching           // &#x4F7F;&#x7528;&#x7F13;&#x5B58;
@SpringBootApplication
public class Starter {

    public static void main(String[] args) {
        SpringApplication.run(Starter.class, args);
    }
}

通过注解使用缓存,@Cacheable 将获取值存入缓存


    /**
     * &#x57FA;&#x4E8E;id &#x83B7;&#x53D6;&#x7528;&#x6237;&#x4FE1;&#x606F;
     */
    @Cacheable(value="user", key="#id", unless="#result == null")
    public UserDTO GetUserById(int id) {
        User userEntity = userMapper.getUserByID(id);
        if (userEntity == null){
            return null;
        }

        /* entity &#x8F6C; DTO */
        UserDTO userDTO = new UserDTO();
        userDTO.setAge(userEntity.getAge());
        userDTO.setId(id);
        userDTO.setName(userEntity.getName());
        userDTO.setCreateTime(unixTime2String(userEntity.getCreateTime()));
        userDTO.setPhone(userEntity.getPhone());
        userDTO.setEmail(userEntity.getEmail());
        return userDTO;
    }

@CachePut 更新缓存


    @CachePut(value = "user", key="#p0.id")
    public UserDTO updateUser(InputUserInfoDTO inputUserInfoDTO){
        userMapper.updateUser(inputUserInfoDTO.getId(), inputUserInfoDTO.getName(), inputUserInfoDTO.getAge());
        User userEntity = userMapper.getUserByID(inputUserInfoDTO.getId());/* entity &#x8F6C; DTO */

        if (null == userEntity){
            return null;
        }
        UserDTO userDTO = new UserDTO();
        userDTO.setAge(userEntity.getAge());
        userDTO.setId(userEntity.getId());
        userDTO.setName(userEntity.getName());
        userDTO.setCreateTime(unixTime2String(userEntity.getCreateTime()));
        userDTO.setPhone(userEntity.getPhone());
        userDTO.setEmail(userEntity.getEmail());
        return userDTO;
    }

@CacheEvict 删除缓存


    @CacheEvict(value = "user", key="#id")
    public void deleteUser(int id){
        userMapper.deleteUser(id);
    }

当然为了支持序列化,我的UserDTO得implements Serializable


@Data
public class UserDTO implements Serializable {
//public class UserDTO implements Serializable {
    private int id;
    private String name;
    private int age;
    private String createTime;
    private String phone;
    private String email;
}

至此缓存已经可以用起来了,不需要编写RedisConfig代码,有点小遗憾,直接去Redis查看数据,发现是乱码。这是因为我使用的是Java自带的序列化,如果要更换Redis序列化方法,就要重写RedisConfig了。

这个配置也不复杂,使用Jackson2JsonRedisSerializer将对象转换为Json串,注意这里一定要使用ObjectMapper,否则再将json串反序列化为对象时会报。


@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig extends CachingConfigurerSupport{

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //&#x89E3;&#x51B3;&#x67E5;&#x8BE2;&#x7F13;&#x5B58;&#x8F6C;&#x6362;&#x5F02;&#x5E38;&#x7684;&#x95EE;&#x9898;
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // &#x914D;&#x7F6E;&#x5E8F;&#x5217;&#x5316;&#xFF08;&#x89E3;&#x51B3;&#x4E71;&#x7801;&#x7684;&#x95EE;&#x9898;&#xFF09;
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                                            .entryTtl(Duration.ZERO)
                                            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                                            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                                            .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();
        return cacheManager;
    }
}

来源:

Original: https://www.cnblogs.com/datiangou/p/10296156.html
Author: 大天狗子
Title: spring-data-redis 2.0 的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529326/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • OpenWRT TP_LINK703N 校园网 锐捷认证解决办法

    OpenWRT TP_LINK703N 校园网 锐捷认证解决办法 一、准备的工具 1) SSH登录工具,推荐使用MobaXterm_Personal下载链接https://moba…

    Linux 2023年6月6日
    077
  • 使用Foxit Reader实现批量打印以及一页多版设置技巧

    阅文时长 | 0.36分钟字数统计 | 587.2字符主要内容 | 1、引言&背景 2、批量打印软件 3、Foxit Reader设置一页多版 4、声明与参考资料『使用Fo…

    Linux 2023年6月14日
    094
  • API 的 Authorization 头里为啥有个 Bearer

    在我们设计和使用 API 授权的时候,经常会接触到如下内容: Authorization : Bearer Tokenxxxxxx 为什么前面会有个 Bearer,直接弄成这样不是…

    Linux 2023年6月7日
    080
  • 目录遍历漏洞

    一.目录遍历漏洞原理目录遍历(路径遍历)是由于Web服务器或者Web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器…

    Linux 2023年6月14日
    087
  • 大数据之Hadoop集群中MapReduce的Join操作

    如下两张输入表格 order表 id pid amount 1001 01 1 1002 02 2 1003 03 3 1004 01 4 1005 02 5 1006 03 6 …

    Linux 2023年6月8日
    078
  • Linux Centos7.5 vsftp 的安装与配置

    安装及配置 安装 sudo yum install vsftpd -y 服务管理 启动服务 service vsftpd start 关闭服务 service vsftpd sto…

    Linux 2023年6月14日
    062
  • ServiceHub.DataWarehouseHost.exe内存泄漏问题的处理

    ServiceHub.DataWarehouseHost.exe内存泄漏问题的处理。 Visual Studio 2017的15.2版本在debug应用程序时,ServiceHub…

    Linux 2023年6月7日
    096
  • Linux的NIS配置

    快速命令 Server和Client设置NIS域名 nisdomainname nis_server echo ‘NISDOMAIN=nis_server’ >> /e…

    Linux 2023年6月6日
    091
  • GT/s和Gbps的关系

    GT/s 和 Gbps 数据传输表示通过数字接口传递的数据量。 当用较多的数据位对原始数据进行编码时,有效数据传输量低于实际传输的数据位数。例如:PCIe串行总线采用10位数据对8…

    Linux 2023年6月7日
    079
  • 在Ubuntu机器上使用war包安装Jenkins

    因为一些需求需要迁移之前使用的Jenkins,原来是按照官方文档使用apt方式安装的,这次搬迁后的机器由于默认不通外网(可以通过代理走外网),因此趁此机会,尝试改用war包方式安装…

    Linux 2023年6月6日
    098
  • 【转】我是一个CPU:这个世界慢!死!了!

    简介 我经常听到人们说磁盘慢,网络很慢,这是从人类感知的角度来表达的。比如,把一个文件拷贝到硬盘上需要几分钟到几十分钟,足够我吃一顿饭;而从网上下载一部电影,有时需要几个小时,我可…

    Linux 2023年5月27日
    077
  • MySQL Performance Schema详解

    MySQL的performance schema 用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况。 1 performance schema特…

    Linux 2023年6月13日
    083
  • ASP.NET Core 2.2 : 二十三. 深入聊一聊配置的内部处理机制

    上一章介绍了配置的多种数据源被注册、加载和获取的过程,本节看一下这个过程系统是如何实现的。(ASP.NET Core 系列目录) 一、数据源的注册 在上一节介绍的数据源设置中,ap…

    Linux 2023年6月7日
    0114
  • 解决pip下载慢

    临时使用 可以在使用pip的时候加参数 -i https://pypi.tuna.tsinghua.edu.cn/simple 设为默认 pip install pip -U -i…

    Linux 2023年6月13日
    077
  • 截止2021年底,我国18个税种中已有12个税种完成立法

    截止2021年底,我国18个税种中已有12个税种完成立法: 1.中华人民共和国个人所得税法 (自1980年9月10日起施行)2.中华人民共和国企业所得税法 (自2008年1月1日起…

    Linux 2023年6月14日
    0379
  • Mysql 5.7开启binlog日志

    Mysql 5.7开启binlog日志 前言 binlog是MySQL的二进制日志,并且是MySQL中最重要的日志。binlog记录了对MySQL数据库执行更改的所有操作,包括对数…

    Linux 2023年6月6日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球