Redis–SpringCache(二)带有参数的方法缓存

Redis–SpringCache(二)带有参数的方法缓存

一.带有参数的方法缓存

在@Cacheable的key属性中通过#参数名可以获取到方法参数。key中内容Spring EL,既然是表达式字符串要用单引号,没有被单引号包含的内容都表示变量。

注意:基本上当方法有参数时,设置key的时候需要添加上参数条件。因为参数不一样,方法的返回值也可以不一样了。

  @Override
    // Spring EL
    // 字符串使用单引号
    // #+方法参数名称:可以调用方法参数
    @Cacheable(key = "'selectById'+#id")
    public String selectById(Long id) {
   
        System.out.println("执行了selectById:"+id);
        return "selectById"+id;
    }

二.返回值为对象或集合

1.会出现的问题

默认情况下存储到redis中数据前面会出现乱码,此乱码不影响使用,判断结果时忽略乱码内容即可。这是因为默认对Redis的value序列化器使用JdkSerializationRedisSerializer序列化器。在源码org.springframework.data.redis.cache.RedisCacheConfiguration里面45行
源码如下

public static RedisCacheConfiguration defaultCacheConfig(@Nullable ClassLoader classLoader) {
   
    DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
    registerDefaultConverters(conversionService);
    return new RedisCacheConfiguration(Duration.ZERO, true, true, CacheKeyPrefix.simple(), SerializationPair.fromSerializer(RedisSerializer.string()), SerializationPair.fromSerializer(RedisSerializer.java(classLoader)), conversionService);
}

2.解决办法

1)把redis的value序列化器修改为GenericJackson2JsonRedisSerializer,就支持返回值为对象或集合了,顺便解决了缓存内容前面有乱码问题
2)如果不更换也可以有效果,但是实体类必须实现Serializable接口。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2343.html原文链接:https://javaforall.net

(0)
上一篇 2020年11月12日 上午9:48
下一篇 2020年11月12日 上午9:48


相关推荐

  • IIS7配置防盗链「建议收藏」

    IIS7配置防盗链「建议收藏」在IIS下如何实现Web的防盗链等Url重定向了,用下面的方法即可实现:1、下载微软官方提供的IISREWRITE模块:http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=1b8c7bd8-8824-4408-b8fc-49dc7f951a002、修改Web站点的web.config<syst…

    2022年7月23日
    10
  • c#时间转时间戳_数据库时间戳转换日期格式

    c#时间转时间戳_数据库时间戳转换日期格式原文地址:http://www.cnblogs.com/codemo/archive/2012/05/18/2507251.html//////时间戳转为C#格式时间/////////privateDateTimeGetTime(stringtimeStamp){

    2022年10月2日
    4
  • 【Java】Java双端队列Deque使用详解

    【Java】Java双端队列Deque使用详解Deque是一个双端队列接口,继承自Queue接口,它们共同的实现类是LinkedList。Deque的功能很强大:代替普通队列Queue:先进先出、队尾进队头出可以作为双端队列:队尾和队头都可以进出还可以作为堆栈使用:先进后出、只能从一端进出注意:Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。jdk文档中关于Deque的使用介…

    2022年7月14日
    23
  • vue项目打包步骤

    vue项目打包步骤vue项目打包终端运行命令npmrunbuild打包成功的标志与项目的改变,如下图:点击index.html,通过浏览器运行,出现以下报错,如图:那么应该如下修改呢?具体步骤如下:1、查看package.js文件的scripts命令2、打开webpack.dev.conf.js文件,找到publicPath:config.dev.assetsPublicPath,按Ctrl点击,跳转到in…

    2022年6月10日
    133
  • Linux下tomcat的安装与项目部署

    Linux下tomcat的安装与项目部署

    2021年9月16日
    47
  • 服务器winsxs文件夹怎么清理工具,win7系统如何使用WinSxS工具安全删除WinSxS文件夹垃圾?…

    服务器winsxs文件夹怎么清理工具,win7系统如何使用WinSxS工具安全删除WinSxS文件夹垃圾?…WinSxS 文件 WinSxS 是系统文件 Windows 目录下一个非常重要的文件夹 WinSxS 文件夹里边有很多重要的组件 这些文件能够保证 Windows7 系统正常运行 所以 WinSxS 文件夹里面的文件是不可以随便删除的 删除 WinSxS 文件夹垃圾方法 1 在管理员命令提示符窗口中输入 Dism exe Online Cleanup Image AnalyzeCompo 命令

    2026年3月18日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号