利用Java来访问Redis并对Redis进行相关操作以及spring+redis集成配置与注解式注解

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis缓存的一些注意事项 只应将热数据放到缓存中 所有缓存信息都应设置过期时间 缓存过期时间应当分散以避免集中过期 缓存key应具备可读性 应避免不同业务出现同名缓存key 可对key进行适当的缩写以节省内存空间 选择合适的数据结构 确保写入缓存中的数据是完整且正确的 避免使用耗时较长的操作命令,如:keys * Redis默认配置中操作耗时超过10ms即视为慢查询 一个key对应的数据不应过大 对于string类型,一个key对应的value大小应控制在10K以内,1K左右更优hash类型,不应超过5000行
  1. 可视化管理工具redis-desktop-manager安装与配置
    1.1 双击redis-desktop-manager-0.8.8.384.exe即可

    1.2 配置远程登录
    vi redis.conf #编辑redis.conf文件
    命令模式下输入“/字符串”,例如:“/requirepass”,再按N键向下查找

    1)修改访问IP地址,服务器IP(69)
    #bind 127.0.0.1 #注释这一行

    2)找到下面这一行并去除注释,并添加密码(396行)
    #requirepass foobared #修改前
    requirepass 123456 #修改后

    3)配置redis的6379端口到防火墙
    firewall-cmd --zone=public --add-port=6379/tcp --permanent &&
    firewall-cmd --reload &&
    firewall-cmd --list-ports

  2. Java访问redis
    2.1 添加依赖

    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>
    

    2.2 Java连接redis

    Jedis jedis = new Jedis(ip, port);
    jedis.auth("123456");//权限认证
    jedis.ping();
    jedis.select(0);//切换数据库
    

2.3 Java操作redis

  string(字符串)
  hash(哈希)
  list(列表)
  set(集合)
  zset(sorted set:有序集合)
    zadd/zrevrange


  注1:不需要记得API的方法,只需要查redis命令





spring+redis集成配置

jedis.zadd("zset", 50d, "zs");
jedis.zadd("zset", 30d, "lw");
jedis.zadd("zset", 100d, "ww");

ScanResult zscan = jedis.zscan("zset", 0);
List result1 = zscan.getResult();
for (Tuple tuple : result1) {

System.out.println(tuple.getScore()+","+tuple.getElement());

}

  1. 前提
    spring+redis集成已完成
  2. spring注解式缓存使用步骤
    1.0 前提:spring+redis集成已完成

    1.1 配置缓存管理器

     <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
       <constructor-arg name="redisOperations" ref="redisTemplate" />
       <!--redis缓存数据过期时间单位秒-->
       <property name="defaultExpiration" value="${redis.expiration}" />
    
       <property name="usePrefix" value="true"/>
    
       <property name="cachePrefix">
           <bean class="org.springframework.data.redis.cache.DefaultRedisCachePrefix">
               <constructor-arg index="0" value="-cache-"/>
           </bean>
       </property>
    

    1.2 配置自定义Key生成器CacheKeyGenerator

     缓存的Java对象一定要重写hashCode和eqauls
     <bean id="cacheKeyGenerator" class="com.zking.ssm.redis.CacheKeyGenerator"></bean>
     
     

    1.3 启用缓存注解功能

     <cache:annotation-driven cache-manager="redisCacheManager" key-generator="cacheKeyGenerator"/>
    

    1.4 在需要的地方进行注解缓存

  3. 缓存注解
    2.1 @CacheConfig

     它是一个类级别的注解,允许共享缓存的名称、KeyGenerator、CacheManager和CacheResolver
    
     value:缓存位置的一段名称,不能为空
     key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL
    
    

    2.2 @Cacheable

     配置在方法或类上,作用:本方法执行后,先去缓存看有没有数据,如果没有,从数据库中查找出来,给缓存中存一份,返回结果,
     下次本方法执行,在缓存未过期情况下,先在缓存中查找,有的话直接返回,没有的话从数据库查找
     value:缓存位置的一段名称,不能为空
     key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL
     keyGenerator:指定key的生成策略
     condition:触发条件,满足条件就加入缓存,默认为空,表示全部都加入缓存,支持SpEL
    
     注1:condition是在方法执行前评估, unless是在方法执行后评估. 
     

    2.3 @CachePut

     类似于更新操作,即每次不管缓存中有没有结果,都从数据库查找结果,并将结果更新到缓存,并返回结果
    
     value    缓存的名称,在 spring 配置文件中定义,必须指定至少一个
     key    缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合
     condition    缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存
    

    2.4 @CacheEvict

     用来清除用在本方法或者类上的缓存数据(用在哪里清除哪里)
     value:缓存位置的一段名称,不能为空
     key:缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL
     condition:触发条件,满足条件就加入缓存,默认为空,表示全部都加入缓存,支持SpEL
     allEntries:true表示清除value中的全部缓存,默认为false
    
    
  4. Spring-Cache key设置
    3.1 基本形式

     @Cacheable(value="cacheName", key="#id")
     public ResultDTO method(int id);
    
     注1:Spring Cacheable注解不缓存null值
          用Cacheable注解时,发现空值,也会被缓存下来。下次另一个系统如果更新了值,这边从缓存取,还是空值,会有问题。
          解决方案:
          @Cacheable(value = "service", key = "#service.serviceId.toString()", unless = "#result == null")
          @Cacheable(value = "service", keyGenerator = RedisKeys.KEY_GENERATOR, unless = "#result.size() == 0")
    

    3.2 组合形式

     @Cacheable(value="cacheName", key="T(String).valueOf(#name).concat('-').concat(#password))
     public ResultDTO method(int name, String password);
    

    3.3 对象形式

     @Cacheable(value="cacheName", key="#user.id)
     public ResultDTO method(User user);
    
     注1:以上三种配置方式中,使用了spEL表达式
    

    3.4 自定义Key生成器

     @Cacheable(value="gomeo2oCache", keyGenerator = "keyGenerator")
     public ResultDTO method(User user);
    
     spring注解式缓存中的巨坑~~~~~~~
     没有指定key,默认情况下spirng会使用SimpleKeyGenerator生成key,
     而Spring默认的SimpleKeyGenerator是不会将函数名组合进key中的,举个例子:
     @Component
     public class CacheTestImpl implements CacheTest {
       @Cacheable("databaseCache")
       public Long test1()
       { return 1L; }
    
       @Cacheable("databaseCache")
       public Long test2()
       { return 2L; }
    
       @Cacheable("databaseCache")
       public Long test3()
       { return 3L; }
    
       @Cacheable("databaseCache")
       public String test4()
       { return "4"; }//注意返回的是字符串“4”
     }
     我们期望的输出是:
     1
     2
     3
     4
     而实际上的输出是:
     1
     1
     1
     ClassCastException: java.lang.Long cannot be cast to java.lang.String
    
  此外,原子类型的数组,直接作为key使用也是不会生效的,为了解决上述2个问题,只能通过自定义KeyGenerator解决


  自定义Key生成器CacheKeyGenerator:源码见资料“CacheKeyGenerator.java”,另外此类使用非加密哈希算法MurmurHash
  (源码46行: Hashing.murmur3_128().hashString),需要引入google guava项目,其pom如下:
  <dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.0.1-jre</version>
  </dependency>
  

  1. redis缓存的一些注意事项
    只应将热数据放到缓存中
    所有缓存信息都应设置过期时间
    缓存过期时间应当分散以避免集中过期
    缓存key应具备可读性
    应避免不同业务出现同名缓存key
    可对key进行适当的缩写以节省内存空间
    选择合适的数据结构
    确保写入缓存中的数据是完整且正确的
    避免使用耗时较长的操作命令,如:keys *
    Redis默认配置中操作耗时超过10ms即视为慢查询
    一个key对应的数据不应过大

    对于string类型,一个key对应的value大小应控制在10K以内,1K左右更优hash类型,不应超过5000行

    避免缓存穿透
    数据库中未查询到的数据,可在Redis中设置特殊标识,以避免因缓存中无数据而导致每次请求均达到数据库

    缓存层不应抛出异常

    缓存应有降级处理方案,缓存出了问题要能回源到数据库进行处理

    可以进行适当的缓存预热
    对于上线后可能会有大量读请求的应用,在上线之前可预先将数据写入缓存中

读的顺序是先缓存,后数据库;写的顺序是先数据库,后缓存

数据一致性问题
数据源发生变更时可能导致缓存中数据与数据源中数据不一致,应根据实际业务需求来选择适当的缓存更新策略:

主动更新:在数据源发生变更时同步更新缓存数据或将缓存数据过期。一致性高,维护成本较高。
被动删除:根据缓存设置的过期时间有Redis负责数据的过期删除。一致性较低,维护成本较低。

  1. 根据用户ID或公司ID进行查询(此想法未测试)

    @Transactional(readOnly = true)
    @Cacheable(value = "service+'By'+service.userId", unless = "#result.size() == 0")
    List listByUserId(Service service, PageBean pageBean);

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
74 7
|
8天前
|
存储 缓存 Java
Java中的分布式缓存与Memcached集成实战
通过在Java项目中集成Memcached,可以显著提升系统的性能和响应速度。合理的缓存策略、分布式架构设计和异常处理机制是实现高效缓存的关键。希望本文提供的实战示例和优化建议能够帮助开发者更好地应用Memcached,实现高性能的分布式缓存解决方案。
32 9
|
10天前
|
Java Linux iOS开发
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
287 12
|
30天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
128 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
17天前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
194 12
|
14天前
|
Java
CentOS7.8配置Adoptium-Java17运行环境
本指南介绍如何设置清华镜像源并安装 Temurin-17-JRE 运行环境。首先,编辑 `/etc/yum.repos.d/adoptium.repo` 文件,配置清华镜像源。接着,使用 `yum install -y temurin-17-jre` 命令安装 Temurin-17-JRE,并通过 `java --version` 验证安装成功。相关配置和操作界面截图附后。
32 8
|
10天前
|
前端开发 NoSQL Java
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
100 1
|
26天前
|
Java API Apache
java集成stable diffusion
通过REST API和JNI两种方法,我们可以在Java应用程序中集成Stable Diffusion模型。REST API方法更加简单和易于维护,而JNI方法则提供更高的性能。根据具体应用场景和需求,选择合适的集成方法,可以充分利用Stable Diffusion的强大功能,实现高效的图像生成和处理。
55 15
|
23天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
71 8
|
10天前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
22 0

热门文章

最新文章