我们在使用springboot搭建微服务的时候,在很多时候还是需要redis的高速缓存来缓存一些数据,存储一些高频率访问的数据,如果直接使用redis的话又比较麻烦,在这里,我们使用jedis来实现redis缓存来达到高效缓存的目的。

但是首先,我们需要了解一下什么是jedis,jedis是redis的客户端。以下介绍几种常用的redis客户端及其对比。

Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html

redisson 官网地址:https://redisson.org/

redisson git项目地址:https://github.com/redisson/redisson

lettuce 官网地址:https://lettuce.io/

lettuce git项目地址:https://github.com/lettuce-io/lettuce-core

首先,在spring boot2之后,对redis连接的支持,默认就采用了lettuce。这就一定程度说明了lettuce 和Jedis的优劣。

概念:

Jedis:是老牌的Redis的Java实现客户端,提供了比较全面的Redis命令的支持,
Redisson:实现了分布式和可扩展的Java数据结构。
Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。

优点:

Jedis:比较全面的提供了Redis的操作特性
Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列
Lettuce:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作

可伸缩:

Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行,不支持异步。Jedis客户端实例不是线程安全的,所以需要通过连接池来使用Jedis。
Redisson:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Redisson的API是线程安全的,所以可以操作单个Redisson连接来完成各种操作
Lettuce:基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作
lettuce能够支持redis4,需要java8及以上。
lettuce是基于netty实现的与redis进行同步和异步的通信。

lettuce和jedis比较:

jedis使直接连接redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个jedis实例增加物理连接 ;
lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,StatefulRedisConnection是线程安全的,所以一个连接实例可以满足多线程环境下的并发访问,当然这也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

总结:

优先使用Lettuce,如果需要分布式锁,分布式集合等分布式的高级特性,添加Redisson结合使用,因为Redisson本身对字符串的操作支持很差。
在一些高并发的场景中,比如秒杀,抢票,抢购这些场景,都存在对核心资源,商品库存的争夺,控制不好,库存数量可能被减少到负数,出现超卖的情况,或者 产生唯一的一个递增ID,由于web应用部署在多个机器上,简单的同步加锁是无法实现的,给数据库加锁的话,对于高并发,1000/s的并发,数据库可能由行锁变成表锁,性能下降会厉害。那相对而言,redis的分布式锁,相对而言,是个很好的选择,redis官方推荐使用的Redisson就提供了分布式锁和相关服务。

在官方网站列一些Java客户端访问,有:Jedis/Redisson/Jredis/JDBC-Redis等,其中官方推荐使用Jedis和Redisson。常用Jedis


SpringBoot整合Jedis

引入Jedis依赖

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

因为 SpringBoot 内默认引用了jedis版本,所以我们直接引入jedis 依赖无需在配置 jedis的版本号了。

application.yml

spring:redis:port: 6379 #端口号password: 123456 #输入redis数据库密码host:     #输入ip地址jedis:pool:max-idle: 6    #最大空闲数max-active: 10 #最大连接数min-idle: 2    #最小空闲数timeout: 2000   #连接超时

编写Config

创建类:com.wpc.config.jedis.JedisConfig

package com.wpc.config.jedis;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** @ClassName JedisConfig* @Description TODO* @Author admin* @Version 1.0*/
@Configuration
public class JedisConfig {private Logger logger = LoggerFactory.getLogger(JedisConfig.class);@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private int port;@Value("${spring.redis.password}")private String password;@Value("${spring.redis.timeout}")private int timeout;@Value("${spring.redis.jedis.pool.max-active}")private int maxActive;@Value("${spring.redis.jedis.pool.max-idle}")private int maxIdle;@Value("${spring.redis.jedis.pool.min-idle}")private int minIdle;@Beanpublic JedisPool  jedisPool(){JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();jedisPoolConfig.setMaxIdle(maxIdle);jedisPoolConfig.setMinIdle(minIdle);jedisPoolConfig.setMaxTotal(maxActive);JedisPool jedisPool=new JedisPool(jedisPoolConfig,host,port,timeout,password);logger.info("JedisPool连接成功:"+host+"\t"+port);return jedisPool;}
}

测试配置

@SpringBootTest
public class JedisApplicationTests {@Autowiredprivate JedisPool jedisPool;@Testpublic   void contextLoads() {System.out.println(jedisPool);//在连接池中得到Jedis连接Jedis jedis=jedisPool.getResource();jedis.set("haha","你好");jedis.set("name","wangpengcheng");//关闭当前连接jedis.close();}

封装工具类

JedisUtil

package com.wpc.config.jedis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
/*** @ClassName JedisUtils* @Description TODO* @Author admin* @Version 1.0*/
@Component
public class JedisUtils {@Autowiredprivate JedisPool jedisPool;/*** 获取Jedis资源*/public Jedis getJedis(){return jedisPool.getResource();}/*** 释放Jedis连接*/public void close(Jedis jedis){if(jedis!=null){jedis.close();}}.......................}

测试

Jedis操作String类型

业务JedisServiceImpl类

/*** @ClassName JedisServiceImpl* @Description TODO* @Author wpc* @Version 1.0*/
@Service
@Log  //日志的处理
public class JedisServiceImpl {@Autowiredprivate JedisUtils jedisUtils;/*** 测试String* 根据key 查询value值*/public String  getString(String key){Jedis jedis=jedisUtils.getJedis();String val=null;if(!jedis.exists(key)){val="南京";log.info(key+"在MYSQL数据库中进行查询的结果是:"+val);jedis.set(key,val);log.info(key+"存入Redis中。值是:"+val);}else{val=jedis.get(key);log.info(key+"是在Redis中查询的数据。值是:"+val);}jedisUtils.close(jedis); //释放资源return val;}
}    

单元测试

@SpringBootTest
public class JedisTests {@Autowiredprivate JedisServiceImpl jedisService;@Testvoid t1(){String val= jedisService.getString("name");System.out.println(val);}
}

Jedis操作Hash类型

业务JedisServiceImpl类

@Service
@Log
public class JedisServiceImpl {@Autowiredprivate JedisUtils jedisUtils;
/*** 测试 jedis 操作hash类型* 根据用户ID查询用户信息* 先判断Redis中是否存在,* 如果不存在,数据库中查询。并存到Redis中* 如果存在,直接查询Redis 并返回*/public User selectBy(String id){String key="user:id"; //根据规则生成相同规范的keyUser user=new User();;Jedis jedis=jedisUtils.getJedis();if(!jedis.exists(key)){//数据库中查询,并进行存user.setId(id);user.setName("JAVA");user.setAge(20);log.info("数据库中查询的用户信息是:"+user);Map<String,String> map=new  HashMap();map.put("id",user.getId());map.put("name",user.getName());jedis.hset(key,map);log.info(key+"成功存入Redis:"+user);}else{Map<String,String> map= jedis.hgetAll(key);user.setId(map.get("id"));user.setName(map.get("name"));log.info(key+"Redis中查询出来的是:"+map);}jedisUtils.close(jedis);return user;}
}

单元测试

@SpringBootTest
public class JedisTests {@Autowiredprivate JedisServiceImpl jedisService;@Testvoid hash(){User user= jedisService.selectBy("101");System.out.println(user);}
}

SpringBoot整合Jedis相关推荐

  1. redis客户端Jedis和Luttuce的区别,并使用springboot整合

    Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server.也就是说这两种都可以是redis的客户端. Jedis Jedis在实现上是直接连 ...

  2. 【七】springboot整合redis(超详细)

    springboot篇章整体栏目: [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合token(超 ...

  3. 8分钟带你学会SpringBoot整合Redis来实现缓存技术

    1.概述 随着互联网技术的发展,对技术要求也越来越高,所以在当期情况下项目的开发中对数据访问的效率也有了很高的要求,所以在项目开发中缓存技术使用的也越来越多,因为它可以极大的提高系统的访问速度,关于缓 ...

  4. Jedis的使用及SpringBoot整合Redis

    1.导入对应的依赖 <!--jedis--><dependency><groupId>redis.clients</groupId><artifa ...

  5. 跟着狂神学Redis(NoSql+环境配置+五大数据类型+三种特殊类型+Hyperloglog+Bitmap+事务+Jedis+SpringBoot整合+Redis持久化+...)

    跟着狂神学Redis 狂神聊Redis 学习方式:不是为了面试和工作学习!仅仅是为了兴趣!兴趣才是最好的老师! 基本的理论先学习,然后将知识融汇贯通! 狂神的Redis课程安排: nosql 讲解 阿 ...

  6. Redis学习篇3_事务及其监控(锁)、Jedis、SpringBoot整合Redis、RedisTemplate的json序列化、RedisUtil工具类

    目录 事务及其监控(锁) Jedis SpringBoot整合Redis RedisTemplate 默认RedisTemplate来源 关于中文序列化问题 RedisUtil工具类 一.事务及其监控 ...

  7. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

  8. Springboot整合redis(lettuce)

    springboot 整合redis(lettuce) 首先确保电脑上装了redis.最好能用redisDesktop查看一下数据情况 redis是一款非常流行的Nosql数据库.redis的功能非常 ...

  9. 搭建第一个SpringBoot工程;SpringBoot整合mybatis;SpringBoot整合Redis-cluster集群;SpringBoot整合EhCache;

    写在前头,以下内容主要是为了自己复习之用,如果你有幸看到这篇文章,请不要嫌弃某些地方有所跳跃或省略. 1. 搭建第一个SpringBoot工程 1.1 创建工程 1.2 初始pom.xml文件内容 1 ...

最新文章

  1. Zeal编程查询,离线文档浏览器
  2. 可持久化链表(链式前向星)
  3. java get post 区别详解_[Java教程]GET 与 POST 其实没有什么区别
  4. parted--大于2T的分区工具
  5. 计算机基础算术加法,2011年自考计算机基础知识精选部分及答案(一)-2
  6. 无法访问此网站刷新又好了_一键突破或加速网站访问
  7. JSON Web Tokens(JWT)
  8. ubuntu18.04安装mysql8.0.16
  9. 《自卑与超越》读书笔记(part6)--职业有些时候成为了人们逃避爱情和社会问题的借口
  10. java合并单元格同时导出excel
  11. 剑指OFFER之包含min函数的栈(九度OJ1522)
  12. html5用户输入后自动显示用户名已重复_lt;inputgt; | HTML输入框标签
  13. 加固社交关系 派派“场景+娱乐”模式异军突起
  14. python 通过ftplib 实现上传下载
  15. 本地邮件服务器 易邮 使用
  16. 博途wincc 与 sql 连接操作(博途V14 wincc advanced)
  17. 软件测试的重要性与必要性,软件测试的目的和意义
  18. pdf合并成一个文件,pdf合并方法
  19. win10和win11系统,手机或者其他设备连接不上电脑热点,一直在转圈圈的解决方法
  20. python pptx 替换图片_python win32com批量导出.ppt/.pptx文件所有图片

热门文章

  1. 妲己机器人怎么升级固件_喵驾车机版怎么升级 固件升级方法
  2. 中忻嘉业电商:什么是冷启动,抖音直播冷启动怎么做
  3. linux下复制光盘映像
  4. 你真的懂优惠券吗?聊聊京东因为它,被薅羊毛7000万背后的玄机
  5. 花最少的钱用最多的流量?告诉你,保底套餐+流量卡才是最佳拍档
  6. Java 对 PDF 文件进行电子签章 如何生成PKCS12证书
  7. 【四圣龙神录的编程教室】第3章、使用全局变量看看吧
  8. Mysql数据库高级、sql优化
  9. python贴天盖地广告_为什么铺天盖地都是 Python 的广告?
  10. 记录-安装cuda与cudnn 及对应版本的tensorflow|pytorch