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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
相关文章
|
2月前
|
SQL Java 关系型数据库
Dataphin功能Tips系列(53)-离线集成任务如何合理配置JVM资源
本文探讨了将MySQL数据同步至Hive时出现OOM问题的解决方案。
59 5
|
3月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
300 4
|
4月前
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
150 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
2月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
118 32
|
2月前
|
JSON JavaScript API
MCP 实战:用配置与真实代码玩转 GitHub 集成
MCP 实战:用配置与真实代码玩转 GitHub 集成
888 4
|
3月前
|
缓存 前端开发 API
(网页系统集成CAD功能)在线CAD中配置属性的使用教程
本文介绍了Mxcad SDK在线预览和编辑CAD图纸的功能及配置方法。通过Vite、CDN或Webpack实现集成,用户可自定义设置以满足项目需求。主要内容包括:1)`createMxCad()`方法的初始属性配置,如画布ID、WASM文件路径、字体加载路径等;2)`MxFun.setIniset()`方法提供的更多CAD初始配置;3)`McObject`对象API用于动态调整视图背景色、浏览模式等。此外,还提供了在线Demo(https://demo2.mxdraw3d.com:3000/mxcad/)供用户测试实时效果。
|
3月前
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
|
4月前
|
NoSQL Java API
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Spring Boot 集成 Redis
本文介绍了在Spring Boot中集成Redis的方法,包括依赖导入、Redis配置及常用API的使用。通过导入`spring-boot-starter-data-redis`依赖和配置`application.yml`文件,可轻松实现Redis集成。文中详细讲解了StringRedisTemplate的使用,适用于字符串操作,并结合FastJSON将实体类转换为JSON存储。还展示了Redis的string、hash和list类型的操作示例。最后总结了Redis在缓存和高并发场景中的应用价值,并提供课程源代码下载链接。
322 0
|
4月前
|
NoSQL Java Redis
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 安装
本教程介绍在 VMware 虚拟机(CentOS 7)或阿里云服务器中安装 Redis 的过程,包括安装 gcc 编译环境、下载 Redis(官网或 wget)、解压安装、修改配置文件(如 bind、daemonize、requirepass 等设置)、启动 Redis 服务及测试客户端连接。通过 set 和 get 命令验证安装是否成功。适用于初学者快速上手 Redis 部署。
72 0
|
Java Android开发
WSDL2Java操作指南
1. 安装JDK1.5, 配置系统环境变量:     下载安装JDK后, 设置环境变量:     JAVA_HOME=C:\Program Files\Java\jdk1.5.0_02     Path=%Path%;%JAVA_HOME%\bin(这里的%Path%指你系统已经有的一系列配置)     CLASSPATH=%JAVA_HOME%\lib  2. 下载axis,
1497 0