文章目录
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。 基数估计就是在误差可接受的范围内,快速计算基数。
命令
序号 | 命令 | 描述 |
---|---|---|
1 | PFADD key element [element ...] | 添加指定元素到 HyperLogLog 中。 |
2 | PFCOUNT key [key ...] | 返回给定 HyperLogLog 的基数估算值。 |
3 | PFMERGE destkey sourcekey [sourcekey ...] | 将多个 HyperLogLog 合并为一个 HyperLogLog。 |
Redis 发布订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
命令
序号 | 命令 | 描述 |
---|---|---|
1 | PSUBSCRIBE pattern [pattern ...] | 订阅一个或多个符合给定模式的频道。 |
2 | PUBSUB subcommand [argument [argument ...]] | 查看订阅与发布系统状态。 |
3 | PUBLISH channel message | 将信息发送到指定的频道。 |
4 | PUNSUBSCRIBE [pattern [pattern ...]] | 退订所有给定模式的频道。 |
5 | SUBSCRIBE channel [channel ...] | 订阅给定的一个或多个频道的信息。 |
6 | UNSUBSCRIBE [channel [channel ...]] | 指退订给定的频道。 |
Redis 事务
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
命令
序号 | 命令 | 描述 |
---|---|---|
1 | DISCARD | 取消事务,放弃执行事务块内的所有命令。 |
2 | EXEC | 执行所有事务块内的命令。 |
3 | MULTI | 标记一个事务块的开始。 |
4 | UNWATCH | 取消 WATCH 命令对所有 key 的监视。 |
5 | WATCH key [key ...] | 监视一个(或多个) key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
Redis 连接
Redis 连接命令主要是用于连接 redis 服务。
命令
序号 | 命令 | 描述 |
---|---|---|
1 | AUTH password | 验证密码是否正确 |
2 | ECHO message | 打印字符串 |
3 | PING | 查看服务是否运行 |
4 | QUIT | 关闭当前连接 |
5 | SELECT index | 切换到指定的数据库(索引从 0 开始) |
Java 使用 Redis
1. 通过配置Jedis操作
在Springboot2.X后,我们的原来使用的Jedis已经被替换成了lettuce
a>在pom.xml文件引入jedis的maven依赖
<!--redis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
b>测试redis连接
使用Jedis操作Redis的步骤:
- 获取连接
- 执行操作关闭连接
- 关闭连接
在测试类中运行:
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();
}
}
同理,对数据操作也是一样:
@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();
}
2. Spring Data Redis
a>引入依赖
在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标
<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配置文件:
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>测试类
@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"));
}