说明:本文章是看b站狂神的Redis视频做的笔记,想了解详细内容可以移步→https://www.bilibili.com/video/BV1S54y1R7SB?p=1
Jedis
使用Java操作Redis
Jedis是Redis官方推荐的java连接开发工具,使用java操作Redis中间件。
基本使用
1、导入对应的依赖
<dependencies>
<!--导入jedis的依赖-->
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<!--fastjson-->
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
</dependencies>
2、编码测试
-
连接数据库
public class TestPing { public static void main(String[] args) { //1、new Jedis对象即可 Jedis jedis = new Jedis("127.0.0.1",6379); //2、jedis所有的命令就是Redis中的命令,在Redis是命令,在jedis中是方法 System.out.println(jedis.ping()); //测试连接,输出为pong表示连接成功 } }
输出:
-
操作命令
Jedis的操作命令同Redis中的命令一样
jedis.flushDB(); //清空数据 System.out.println("判断username是否存在:"+jedis.exists("username")); jedis.set("username","maize"); jedis.set("password","123465"); System.out.println("系统中所有的键如下:"); Set<String> keys = jedis.keys("*"); System.out.println(keys); ...
-
断开连接
jedis.close();
事务
在Jedis中操作事务,其步骤和在Redis中直接操作事务一样,
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.flushDB();
JSONObject jsonObject = new JSONObject();
jsonObject.put("username","maize");
jsonObject.put("password","123456");
String s = jsonObject.toJSONString();
//开启事务
Transaction multi = jedis.multi();
//jedis.watch("user1");//乐观锁
try {
multi.set("user1",s);
multi.set("user2",s);
//int i = 1/0; //模拟运行时错误
//执行事务
multi.exec();
} catch (Exception e) {
multi.discard(); //放弃事务
e.printStackTrace();
}finally {
System.out.println(jedis.get("user1"));
System.out.println(jedis.get("user2"));
//关闭连接
jedis.close();
}
当正常运行时,结果如下:
将模拟运行时错误的注释打开,在事务未执行时,会抛出异常, 并在catch块中放弃事务,因此事务队列中的事务均未执行成功。
SpringBoot整合Redis
说明:在Spring Boot2.x之后,原来使用的jedis被替换成为lettuce
jedis:底层采用的是直连,多个线程操作的话,是不安全的,如果要避免不安全的额情况,可以使用jedis pool(更像BIO模式)
lettuce:底层采用的是netty,实例可以在多个线程中共享,不存在线程不安全的情况,可以减少线程数量,更像NIO模式
源码分析:
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
//我们可以自己定义一个RedisTemplate来替换默认的RedisTemplate,@ConditionalOnMissingBean注解的意思是redisTemplate对象不存在时就加入容器,存在时不加入
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
//默认的RedisTemplate没有过多的设置,redis对象都是需要序列化的
//两个泛型都是Object类型,在使用时需要强制类型转换,比如我们常用的<String, Object>
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean //由于String类型是常用的,因此单独封装了一个Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
整合测试
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置连接
#配置redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
3、测试
@Autowired
RedisTemplate redisTemplate;
@Test
void testRedisTemplate() {
//redisTemplate的方法,opsForValue表示操