1 前言
通常程序员在学习Redis的安装到使用是非常快速的,因为Redis的大部分操作都等同于Map的操作逻辑,只要了解大部分api结合百度能够快速的投入到CRUD的工作中去,所以今天来一期Redis不常用操作指南,当然这里的不常用更多是不会天天用,但是在项目中还是会有应用到的地方。
2 安装Redis
3 SpringBoot2整合Redis(有现成环境的可以略过)
3.1 相关依赖
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 连接池 --》
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.17</version>
</dependency>
复制代码
3.2 配置文件
spring:
redis:
host: 127.0.0.1 # 服务地址
port: 6379 # 服务端口
timeout: 10000 # 连接超时时间(毫秒)
lettuce:
pool:
max-active: 8 # 最大连接数
max-wait: -1ms # 阻塞最大等待时长(负值代表没有限制)
min-idle: 0 # 最小空闲连接
max-idle: 8 # 最大空闲连接
复制代码
3.3 配置代码(放在启动类中即可)
@Bean
public <T> RedisTemplate<String, T> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, T> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
复制代码
添加此配置解决乱码问题
4 不常用操作
省流助手:先看目录,如果都会可以略过~
4.1 SCAN(必知必会)
通常我们使用scan是为了替换keys,keys命令执行时候会引发Redis锁,导致Redis操作大面积阻塞,所以Redis提供scan命令,不会阻塞主线程,支持按游标分批次返回数据,是比较理想的选择,缺点就是scan有可能返回重复数据,我们需要进行去重,这个在java里面使用Set接收返回值就ok了。
4.1.1 代码实现
package com.example.demo.redis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@Component
public class RedisScan {
/**
* 获取一批指定前缀的key eg: key:* 获取所有key:开头的key
*
* @param pattern key匹配正则
* @param count 一次获取数目
* @return
*/
public Set<String> scan(String pattern, int count) {
return redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Set<String> keysTmp = new HashSet<>();
try (Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()
.match(pattern)
.count(count).build())) {
while (cursor.hasNext()) {
keysTmp.add(new String(cursor.next(), StandardCharsets.UTF_8));
}
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
return keysTmp;
});
}
/**
* 批量删除
*
* @param pattern key匹配正则
* @param step 阶梯删除的数目
*/
public