持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情 本期我们继续跟着黑马学习redis,下面是我整理的课堂笔记。
引言
上期我们了解到了Redis的数据结构以及在linux下的用法,在实际开发中,我们需要基于语言的客户端实现,在Redis官网中提供了各种语言的客户端,官网地址:redis.io/clients
下面我们来认识redis的两个常用JAVA客户端即Jedis与SpringDataRedis
Jedis
官网地址: github.com/redis/jedis 在Maven工程中直接导入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.0</version>
</dependency>
快速上手并测试
private Jedis jedis;
//在执行前加载配置
@BeforeEach
public void setUp() {
// 建立连接
jedis = new Jedis("127.0.0.1", 6379);
// 设置密码
jedis.auth("123321");
// 选择库
jedis.select(0);
}
@Test
public void testString() {
// 插入数据,方法名与Redis命令一致
String result = jedis.set("name", "zs");
System.out.println("result = " + result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = " + name);
}
//需要在执行后释放资源
@AfterEach
public void tearDown() {
// 释放资源
if (jedis != null) {
jedis.close();
}
}
可以看到Jedis 使用不难只需要
- 到jedis官网上引入依赖
- 创建Jedis对象,建立连接
- 使用Jedis,调用与redis相同名字的方法
- 释放资源
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐大家使用Jedis连接池代替Jedis的直连方式。在SpringBoot下直接集成就好
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接
jedisPoolConfig.setMaxTotal(8);
// 最大空闲连接
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接
jedisPoolConfig.setMinIdle(0);
// 设置最长等待时间 ms为单位
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379,1000, "Password");
}
// 获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
SpringDataRedis
spring-data-redis提供了redis的java客户端的抽象,在开发中可以忽略掉切换具体的客户端所带来的影响,而且他本身就属于spring的一部分,比起单纯的使用jedis,更加稳定,管理起来更加自动化和快捷。(当然jedis的缺点不止这些) 官网地址:spring.io/projects/sp…
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection实现
spring-data-redis的特性
- 自动管理连接池,提供了一个高度封装的RedisTemplate类,以及内部还有一个StringRedisTemplate
- 针对jedis客户端的大量api进行了归类封装,把同一类型的操作封装成了operation接口.支持redis中的五种数据类型的操作,详见黑马视频里老师的总结
- 可以定制化针对数据的"序列化与反序列化"
使用
引入依赖
<!-- spring boot redis缓存引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- lecttuce 缓存连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
在SpringBoot中配置Application.yaml
spring:
redis:
host: 127.0.0.1
port: 6379
database: 2
password: password
lettuce:
pool:
max-active: 20 #最大连接数,负值表示没有限制,默认8
max-wait: -1 #最大阻塞等待时间,负值表示没限制,默认-1,即无限等待
max-idle: 8 #最大空闲连接,默认8
min-idle: 0 #最小空闲连接,默认0
这样,我们就可以很容易在idea中去使用redis了
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class test {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedis(){
for (int i = 0; i < 10; i++) {
redisTemplate.opsForList().rightPush("key",i);
}
//-1则表示所有数据
List keys = redisTemplate.opsForList().range("key", 0, -1);
System.out.println(keys.size());
}
}
总结
直接使用SpringDataRedis,既简洁又稳定,在application.yaml里面配置,还能省去许多配置东西,直接速用。