• Redis 7 第九讲 微服务集成Redis 应用篇


    Jedis

    理论 

            Jedis是redis的java版本的客户端实现,使用Jedis提供的Java API对Redis进行操作,是Redis官方推崇的方式;并且,使用Jedis提供的对Redis的支持也最为灵活、全面;不足之处,就是编码复杂度较高。 

    引入包 

    1. <!--Jedis-->
    2. <dependency>
    3. <groupId>redis.clients</groupId>
    4. <artifactId>jedis</artifactId>
    5. <version>4.3.1</version>
    6. </dependency>

    案例演示

     直连案列

     

     获取Redis连接对象

    1. // 获取Jedis对象
    2. private static Jedis getJedis() {
    3. Jedis jedis = new Jedis("自己的地址", 端口);
    4. jedis.auth("111111");
    5. return jedis;
    6. }

    Redis 案列

    1. Jedis jedis = getJedis();
    2. //geo
    3. String geo_key = getKey();
    4. jedis.geoadd(geo_key, getGeo());
    5. logger.info(String.valueOf(jedis.geodist(geo_key, "成都", "上海", GeoUnit.KM)));
    6. private static String getKey() {
    7. return "TOC-" + RandomUtil.randomString(6);
    8. }
    9. private static Map<String, GeoCoordinate> getGeo() {
    10. Map<String, GeoCoordinate> geoCoordinateHashMap = new HashMap<>(5);
    11. geoCoordinateHashMap.put("成都", new GeoCoordinate(103.954887, 30.569293));
    12. geoCoordinateHashMap.put("北京", new GeoCoordinate(116.427185, 39.93682));
    13. geoCoordinateHashMap.put("上海", new GeoCoordinate(121.477665, 31.236176));
    14. geoCoordinateHashMap.put("西安", new GeoCoordinate(108.952789, 34.36515));
    15. geoCoordinateHashMap.put("重庆", new GeoCoordinate(106.454377, 29.581309));
    16. return geoCoordinateHashMap;
    17. }

    关闭Jedis对象 

      jedis.close();

     池案列

     获取连接池对象

    1. JedisPool jedisPool = getJedisPool();
    2. Jedis jedis = jedisPool.getResource();
    3. // 获取Jedispoll对象
    4. private static JedisPool getJedisPool() {
    5. GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    6. poolConfig.setMaxIdle(8);
    7. poolConfig.setMinIdle(2);
    8. poolConfig.setMaxWait(Duration.ofSeconds(30000));
    9. return new JedisPool(poolConfig, "自己的ip", 端口, 100000, "111111");
    10. }

     代码案列

    1. //hash
    2. String hash_key = getKey();
    3. jedis.hset(hash_key, getMapStr());
    4. for (String hkey : jedis.hkeys(hash_key)) {
    5. logger.info(jedis.hget(hash_key, hkey));
    6. }

     关闭Jedis和Pool

    1. try {
    2. if (!Objects.isNull(jedis)) {
    3. jedis.close();
    4. }
    5. } finally {
    6. jedis = null;
    7. }
    8. try {
    9. if (Objects.isNull(jedisPool)){
    10. jedisPool.close();
    11. }
    12. } finally {
    13. jedisPool = null;
    14. }

    总结

    优点缺点
    直连

    1.简单方便new-close

    2.适用于连接数比较少且使用时间较长,可构成长连接的场景(只使用一个Jedis,比如down数据、大量数据更新)

    1.存在每次新建和关闭TCP的开销(三次握手四次挥手)

    2.每次都去new,系统资源可能无法在有效范围内进行控制,会存在连接容易发生泄漏

    3.Jedis对象本身是线程不安全的

    池连接

    1.Jedis是预先生成的,不需要随用随创,随用完随关闭,降低了这些开销

    2.连接池能够更好地保护和控制资源使用,有固定的参数去控制最大连接数或者空闲数目等

    1.相对直连,使用起来麻烦,特别是资源管理上需要非常多的参数来保证,一旦出现规划不合理的情况就会出现问题(比如池满、连接空闲、连接超时等情况)

    Lettuce

    理论

            Lettuce 是一个可伸缩线程安全的 Redis 客户端。多个线程可以共享同一个 RedisConnection。它利用优秀 netty NIO 框架来高效地管理多个连接。 

    引入包

    1. <dependency>
    2. <groupId>io.lettuce</groupId>
    3. <artifactId>lettuce-core</artifactId>
    4. <version>6.2.5.RELEASE</version>
    5. </dependency>

    案列演示

    获取连接对象 

    1. private static StatefulRedisConnection<String, String> getRedis() {
    2. // 链式编程 创建RedisUri
    3. RedisURI build = RedisURI.builder().withHost("120.77.64.190").withPort(6379).withPassword("111111".toCharArray()).build();
    4. //创建客户端
    5. StatefulRedisConnection<String, String> conn = RedisClient.create().connect(build);
    6. return conn;
    7. }
    8. StatefulRedisConnection<String, String> conn = getRedis();

     获取操作命令对象

    1. //链接command
    2. RedisCommands<String, String> jedis = conn.sync();

     案列

    1. //geo
    2. String geo_key = getKey();
    3. jedis.geoadd(geo_key, 103.954887, 30.569293,"成都");
    4. jedis.geoadd(geo_key, 121.477665, 31.236176,"上海");
    5. logger.info(String.valueOf(jedis.geodist(geo_key, "成都", "上海", GeoArgs.Unit.km)));

     关闭对象

    1. private static void closeConn(StatefulRedisConnection<String, String> conn) {
    2. // 关闭
    3. try {
    4. if (!Objects.isNull(conn)){
    5. conn.close();
    6. }
    7. }catch (Exception e){
    8. System.out.println(e);
    9. }finally {
    10. conn = null;
    11. }
    12. }

    总结 

            Lettuce 相比Jedis 客户端,功能更加强大,不仅解决了线程安全的问题,还支持异步和响应式编程,支持集群,Sentinel,管道,编码器等等功能。 


    spring-data-redis

    单机 

    理论

             RedisTemplate 继承自 RedisAccessor , 实现 RedisOperations 和 BeanClassLoaderAware 两个接口。spring-data-redis针对Jedis提供如下功能:

            1. 提供了一个高度封装的“RedisTemplate”类,里面封装了对于Redis的五种数据结构的各种操作

            2. SpringBoot2.x后,RedisTemplate采用是lettuce(基于netty采用异步非阻塞式lO)进行通信,大并发下比jedis效率更高。

            3. RedisTemplate模板使用序列化器操作redis数据

    引入包

    1. org.springframework.boot
    2. spring-boot-starter-data-redis
    3. 3.1.2
    4. org.apache.commons
    5. commons-pool2
    6. 2.11.1

    案列演示

    配置文件 

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. name: mop
    6. redis:
    7. host: 自己的ip
    8. port: 6379
    9. database: 0
    10. password: 111111
    11. lettuce:
    12. pool:
    13. max-active: 8
    14. max-idle: 8
    15. min-idle: 0
    16. max-wait: 3s

    未加序列化配置 

    加入序列化配置

    默认走JDK序列化 

    加入自定义配置

    插入数据后,客户端显示正常

     

    后续案列可自行实践 

     集群

    集群配置可参考 【Redis 7 第八讲 集群模式(cluster)架构篇】,集群搭建如下

    配置文件

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. name: mop
    6. redis:
    7. cluster:
    8. max-redirects: 3
    9. nodes:
    10. - 自己的IP:端口
    11. - 自己的IP:端口
    12. - 自己的IP:端口
    13. - 自己的IP:端口
    14. - 自己的IP:端口
    15. - 自己的IP:端口
    16. database: 0
    17. password: 111111
    18. lettuce:
    19. pool:
    20. max-active: 8
    21. max-idle: 8
    22. min-idle: 0
    23. max-wait: 3s

    案列演示 

    意外模拟6381宕机,从机上位验证代码是否正常

    写入时出现无法连接

    主机宕机,从机上位

     原因分析:

            SpringBoot 客户端无法动态感知到集群最新变化。

            SpringBoot 2.X版本, Redis默认的连接池采用 Lettuce当Redis 集群节点发生变化后,Letture默认是不会刷新节点拓扑

    加入配置参数,动态刷新

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. name: mop
    6. redis:
    7. cluster:
    8. max-redirects: 3
    9. nodes:
    10. - IP:PORT
    11. - IP:PORT
    12. - IP:PORT
    13. - IP:PORT
    14. - IP:PORT
    15. - IP:PORT
    16. database: 0
    17. password: 111111
    18. lettuce:
    19. cluster:
    20. refresh:
    21. adaptive: true
    22. period: 2000
    23. pool:
    24. max-active: 8
    25. max-idle: 8
    26. min-idle: 0
    27. max-wait: -1ms
    1. #支持集群拓扑动态感应码斯,户适应拓扑树新是查使用所有可用的更斯,默认false 关闭spring.redis.lettuce.cluster .refresh,adaptive=true
    2. #定时刷新
    3. spring.redis,lettuce.cluster.refresh.period-2000

    【源码地址】


    1. 🌹 以上分享 Redis 客户端的应用,请指教🤝。
    2. 🌹🌹 如你对技术也感兴趣,欢迎交流。
    3. 🌹🌹🌹 如有需要,请👍点赞💖收藏🐱‍🏍分享

  • 相关阅读:
    PTA 7-190 猴子选大王
    【数智化人物展】同方有云联合创始人兼总经理江琦:云计算,引领数智化升级的动能...
    桥梁结构健康监测系统落地方案
    在windows和linux上玩转Tensorrt
    基于EasyExcel锁定指定列导出数据到excel
    SpringBoot:(六)YAML配置文件
    【数据结构】手撕顺序表
    UG\NX二次开发 获取工作部件的事例 UF_ASSEM_ask_work_occurrence
    TortoiseGit安装教程(Windows)
    头部厂商Q3交付量环比下滑!激光雷达,现实很骨感
  • 原文地址:https://blog.csdn.net/qq_32662595/article/details/132764172