Redis基础知识学习笔记(最终篇)

Redis命令

Redis HyperLogLog命令

Redis 在 2.8.9 版本添加了 HyperLogLog 结构。

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

命令

序号命令描述
1PFADD key element [element ...]添加指定元素到 HyperLogLog 中。
2PFCOUNT key [key ...]返回给定 HyperLogLog 的基数估算值。
3PFMERGE destkey sourcekey [sourcekey ...]将多个 HyperLogLog 合并为一个 HyperLogLog。

Redis 发布订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
20240903163248

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
20240903163331

命令

序号命令描述
1PSUBSCRIBE pattern [pattern ...]订阅一个或多个符合给定模式的频道。
2PUBSUB subcommand [argument [argument ...]]查看订阅与发布系统状态。
3PUBLISH channel message将信息发送到指定的频道。
4PUNSUBSCRIBE [pattern [pattern ...]]退订所有给定模式的频道。
5SUBSCRIBE channel [channel ...]订阅给定的一个或多个频道的信息。
6UNSUBSCRIBE [channel [channel ...]]指退订给定的频道。

Redis 事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  1. 批量操作在发送 EXEC 命令前被放入队列缓存。
  2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  1. 开始事务。
  2. 命令入队。
  3. 执行事务。

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

命令

序号命令描述
1DISCARD取消事务,放弃执行事务块内的所有命令。
2EXEC执行所有事务块内的命令。
3MULTI标记一个事务块的开始。
4UNWATCH取消 WATCH 命令对所有 key 的监视。
5WATCH key [key ...]监视一个(或多个) key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

Redis 连接

Redis 连接命令主要是用于连接 redis 服务。

命令

序号命令描述
1AUTH password验证密码是否正确
2ECHO message打印字符串
3PING查看服务是否运行
4QUIT关闭当前连接
5SELECT index切换到指定的数据库(索引从 0 开始)

Java 使用 Redis

1. 通过配置Jedis操作

在Springboot2.X后,我们的原来使用的Jedis已经被替换成了lettuce

a>在pom.xml文件引入jedis的maven依赖

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

b>测试redis连接

使用Jedis操作Redis的步骤:

  1. 获取连接
  2. 执行操作关闭连接
  3. 关闭连接

在测试类中运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.nianxi.spring_redis;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;

@SpringBootTest
class SpringRedisApplicationTests {

@Test
void contextLoads() {

//1. 获取连接
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
//2. 执行操作关闭连接
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping());
//3. 关闭连接
jedis.close();
}

}

20240903165935

同理,对数据操作也是一样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Test
void contextLoads1() {

//1. 获取连接
Jedis jedis = new Jedis("localhost", 6379);
//2. 执行操作关闭连接
jedis.set("name", "mannor");//设置
String name = jedis.get("name");//获取
System.out.println(name);
jedis.del("name");//删除

jedis.hset("myhash","addr","beijing");//设置哈希表值
String hget = jedis.hget("myhash", "addr");//获取哈希表
System.out.println(hget);

Set<String> keys = jedis.keys("*");//获取所有Redis的数据
for(String key:keys){
System.out.println(key);
}
//3. 关闭连接
jedis.close();
}

20240903170121

2. Spring Data Redis

a>引入依赖

在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Spring Data Redis中提供了一个高度封装的类: RedisTemplate,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

ValueOperations:简单K-V操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作

b>使用之前我们需要配置一下redis文件

yml配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
application:
name: spring_redis
#Redis相关配置
redis:
host: localhost
port: 6379
#password: 123456
database: 0 #操作的是0号数据库(redis存在0-15号数据库(默认),在命令中使用select来切换)
jedis:
#Redis连接池配置
pool:
max-active: 8 #最大连接数
max-wait: 1ms #连接池最大阻塞等待时间
max-idle: 4 #连接池中的最大空闲连接
min-idle: 0 #连接池中的最小空闲连接

c>测试类

1
2
3
4
5
6
7
8
9
10
@Autowired
private RedisTemplate redisTemplate;

@Test
public void test() {
// 使用ping方法检测是否连接成功
System.out.println(redisTemplate.getConnectionFactory().getConnection().ping());
redisTemplate.opsForValue().set("name", "mannor");
System.out.println(redisTemplate.opsForValue().get("name"));
}

20240903171448

❤️❤️❤️完结❤️❤️❤️