客户端
命令行客户端
redis-cli 是 Redis 的命令行界面工具,它允许用户通过命令行与 Redis 服务器进行交互。使用 redis-cli,你可以执行各种 Redis 命令来管理数据、监控服务器状态以及执行其他高级操作。
基本用法
连接到 Redis 服务器
默认情况下,
redis-cli会尝试连接到运行在本地主机(localhost)上、默认端口(6379)的 Redis 服务器。如果你需要连接到不同的主机或端口,可以使用-h和-p选项:bashbash复制代码 redis-cli -h <hostname> -p <port>如果 Redis 服务器设置了密码保护,你可以使用
-a选项来提供密码:bashbash复制代码 redis-cli -h <hostname> -p <port> -a <password>执行 Redis 命令
一旦连接到 Redis 服务器,你就可以在
redis-cli提示符下输入 Redis 命令。例如,要设置一个键值对,你可以使用SET命令:bashbash复制代码 SET mykey "Hello, Redis!"要获取这个键的值,你可以使用
GET命令:bashbash复制代码 GET mykey退出
redis-cli要退出
redis-cli,你可以输入exit命令或按Ctrl+D。
高级用法
批处理模式
redis-cli支持从标准输入读取命令并执行。这允许你将一系列命令写入一个文件,并通过重定向的方式一次性执行这些命令:bashbash复制代码 cat commands.txt | redis-cli或者,你也可以使用
-x选项,让redis-cli从标准输入读取最后一个参数指定的文件内容作为命令:bashbash复制代码 redis-cli -x < commands.txt交互式模式与非交互式模式
在默认情况下,
redis-cli会进入交互式模式,等待用户输入命令。但你也可以通过提供命令作为命令行参数的方式,让redis-cli在非交互式模式下执行这些命令并立即退出:bashredis-cli SET mykey "Hello, Redis!" redis-cli GET mykey注意,在非交互式模式下,每个命令都需要单独运行一个
redis-cli实例。脚本支持
redis-cli支持通过--eval选项执行 Lua 脚本。这对于需要在 Redis 中执行复杂逻辑的场景非常有用:bashbash复制代码 redis-cli --eval myscript.lua mykey , arg1 arg2 ...在这里,
myscript.lua是包含 Lua 脚本的文件名,mykey是传递给 Lua 脚本的第一个键参数(在 Lua 脚本中可以通过KEYS[1]访问),arg1 arg2 ...是传递给 Lua 脚本的其他参数(在 Lua 脚本中可以通过ARGV[1],ARGV[2], ... 访问)。原始模式
使用
--raw选项,redis-cli会以原始格式输出数据,而不是尝试对数据进行转义或格式化。这对于处理二进制数据或需要精确控制输出格式的场景非常有用。扫描模式
redis-cli还提供了--scan和--pattern选项,用于以更高效的方式扫描键空间。这些选项通常与KEYS命令的替代者SCAN命令一起使用。
注意事项
- 在使用
redis-cli时,请确保你有权访问目标 Redis 服务器,并且你知道如何安全地处理敏感信息(如密码)。 redis-cli提供了许多选项和参数,用于定制其行为。你可以通过运行redis-cli --help命令来查看所有可用的选项和参数。- 在生产环境中,谨慎使用可能导致大量数据移动或服务器负载增加的命令(如
KEYS、FLUSHALL等)。在执行这些命令之前,最好先了解它们的潜在影响。
使用 ping 探测服务是否已启动
redis-cli ping如果服务已启动会响应 PONG
在 redis 集群中切换 master
使用 redis-cli 集群模式连接到 redis 集群中任意一个节点
redis-cli -c通过 get 不同的 key 自动 redirect 到不同的 master 节点
get 0
get 1
get 2
get 3
...图形化桌面客户端
AnotherRedisDesktopManager
https://github.com/qishibo/AnotherRedisDesktopManager/
ubuntu 系统配置
访问https://github.com/qishibo/AnotherRedisDesktopManager/releases下载客户端
移动客户端到 /usr/local 目录
sudo mv ~/Downloads/Another-Redis-Desktop-Manager-linux-1.7.1-x86_64.AppImage /usr/local/客户端新增可执行权限
sudo chmod +x /usr/local/Another-Redis-Desktop-Manager-linux-1.7.1-x86_64.AppImage新建 /usr/share/applications/another-redis-desktop-manager.desktop 文件内容如下:
[Desktop Entry]
Encoding=UTF-8
Name=Another Redis Desktop Manager
Exec=/usr/local/Another-Redis-Desktop-Manager-linux-1.7.1-x86_64.AppImage
Terminal=false
Type=Application
StartupNotify=true在应用中心中输入 redis 打开客户端
RedisInsight
如果您不想保留 Redis Insight 数据:
docker run --rm --name redisinsight -p 5540:5540 redis/redisinsight:latest如果要保留 Redis Insight 数据,请先将 Docker 卷附加到 /data 路径,然后运行以下命令:
docker run --rm --name redisinsight -p 5540:5540 redis/redisinsight:latest -v redisinsight:/data接下来,将浏览器指向 http://localhost:5540。根据提示添加 Redis 服务器链接即可。
Redis Insight 还在 http://localhost:5540/api/health/ 提供了健康检查端点,以监控正在运行的容器的健康状况。
编程客户端
Jedis
https://github.com/redis/jedis
Lettuce
介绍
Lettuce 是一款可扩展的线程安全 Redis 客户端,可用于同步、异步和反应式使用。如果多个线程避免阻塞和事务操作(例如 BLPOP 和 MULTI/EXEC),则它们可以共享一个连接。Lettuce 是用 netty 构建的。支持高级 Redis 功能,例如 Sentinel、Cluster、Pipelining、Auto-Reconnect 和 Redis 数据模型。
用法
详细用法请参考本站 示例
建立连接
单机连接
@SpringBootTest(classes = {Application.class})
@Slf4j
public class ApplicationStandaloneTests {
RedisClient client;
StatefulRedisConnection<String, String> connection;
@BeforeEach
public void before() {
// 单机版 Redis 连接
client = RedisClient.create("redis://123456@localhost:6379");
connection = client.connect();
}
@AfterEach
public void after() {
if (this.connection != null) {
this.connection.close();
this.connection = null;
}
if (client != null) {
client.shutdown();
client = null;
}
}
}集群连接
@SpringBootTest(classes = {Application.class})
@Slf4j
public class ApplicationClusterTests {
RedisClusterClient clusterClient;
StatefulRedisClusterConnection<String, String> clusterConnection;
@BeforeEach
public void before() {
// 集群版 Redis 连接
RedisURI node1 = RedisURI.create("localhost", 6380);
RedisURI node2 = RedisURI.create("localhost", 6381);
RedisURI node3 = RedisURI.create("localhost", 6382);
clusterClient = RedisClusterClient.create(Arrays.asList(node1, node2, node3));
clusterConnection = clusterClient.connect();
}
@AfterEach
public void after() {
if (clusterConnection != null) {
clusterConnection.close();
clusterConnection = null;
}
if (clusterClient != null) {
clusterClient.shutdown();
clusterClient = null;
}
}
}同步 API
@Test
public void test() throws InterruptedException {
// 同步阻塞
RedisStringCommands<String, String> sync = connection.sync();
String key = UUID.randomUUID().toString();
sync.set(key, key);
String value = sync.get(key);
Assertions.assertEquals(key, value);
}异步 API
@Test
public void test() throws InterruptedException {
// 异步非阻塞
RedisAsyncCommands<String, String> async = connection.async();
key = UUID.randomUUID().toString();
RedisFuture<String> redisFuture = async.set(key, key);
String finalKey = key;
CountDownLatch latch = new CountDownLatch(1);
redisFuture.whenComplete((data, exception) -> {
async.get(finalKey).whenComplete((dataInternal, exceptionInternal) -> {
if (finalKey.equals(dataInternal)) {
latch.countDown();
}
});
});
Assertions.assertTrue(latch.await(1, TimeUnit.SECONDS));
}spring-data-redis
https://spring.io/projects/spring-data-redis
和 SpringBoot 应用集成
注意:关于使用 RedisTemplate 执行 Lua 脚本提醒
DefaultRedisScript defaultRedisScript = new DefaultRedisScript<>();
// 每次请求 redis 都到 test.lua 文件读取 Lua 脚本,导致性能急剧下降
defaultRedisScript.setLocation(new ClassPathResource("test.lua"));
defaultRedisScript.setResultType(String.class);
// 下面是推荐写法
DefaultRedisScript defaultRedisScript = new DefaultRedisScript<>();
ClassPathResource classPathResource = new ClassPathResource("test.lua");
String script = StreamUtils.copyToString(classPathResource.getInputStream(), StandardCharsets.UTF_8);
classPathResource.getInputStream().close();
defaultRedisScript.setScriptText(script);
defaultRedisScript.setResultType(String.class);pom 依赖配置如下:
<!-- SpringBoot Redis 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Redis 连接池依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>Standalone 模式配置如下:
详细用法请参考示例
https://gitee.com/dexterleslie/demonstration/tree/master/demo-redis/redistemplate/redistemplate-standalone
application.properties 配置如下:
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456Sentinel 模式配置如下:
详细用法请参考示例
https://gitee.com/dexterleslie/demonstration/tree/master/demo-redis/redistemplate/redistemplate-sentinel
@Configuration
public class RedisConfiguration {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(256);
LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
// 在所有节点负载均衡读取
// .readFrom(ReadFrom.ANY)
// 从所有slave节点负载均衡读取
.readFrom(ReadFrom.ANY_REPLICA)
// 随机选择一个slave节点读取
// .readFrom(ReadFrom.REPLICA)
// .readFrom(ReadFrom.REPLICA_PREFERRED)
.poolConfig(poolConfig)
.clientResources(ClientResources.builder().build())
.clientOptions(ClientOptions.builder().build())
.build();
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("localhost", 26381)
.sentinel("localhost", 26380)
.sentinel("localhost", 26379);
return new LettuceConnectionFactory(sentinelConfig, clientConfig);
}
}Replication 模式配置如下:
详细用法请参考示例
https://gitee.com/dexterleslie/demonstration/tree/master/demo-redis/redistemplate/redistemplate-replication
@Configuration
public class RedisConfiguration {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(256);
LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
// 在所有节点负载均衡读取
// .readFrom(ReadFrom.ANY)
// 从所有slave节点负载均衡读取
.readFrom(ReadFrom.ANY_REPLICA)
// 随机选择一个slave节点读取
// .readFrom(ReadFrom.REPLICA)
// .readFrom(ReadFrom.REPLICA_PREFERRED)
.poolConfig(poolConfig)
.clientResources(ClientResources.builder().build())
.clientOptions(ClientOptions.builder().build())
.build();
RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("localhost", 6379);
return new LettuceConnectionFactory(serverConfig, clientConfig);
}
}Cluster 模式配置如下:
详细用法请参考示例
https://gitee.com/dexterleslie/demonstration/tree/master/demo-redis/redistemplate/redistemplate-cluster
application.properties 配置如下:
# 配置redis集群节点,可以是全部或者部分节点(客户端会自动发现其他节点)
spring.redis.cluster.nodes=localhost:6380,localhost:6381,localhost:6382,localhost:6383,localhost:6384,localhost:6385
# 指定了 Redis 客户端在与 Redis 集群进行通信时,允许执行的重定向操作的最大次数。
# 当 Redis 客户端尝试在集群中执行某个操作时,可能会因为数据分布的原因而遇到节点的重定向操作。例如,客户端尝试访问一个 key,但该 key 并不在当前节点上,此时节点会告诉客户端去哪个节点上查找该 key。
# 用来定义这种重定向操作的最大次数。如果超过了这个限制次数,客户端将不再进行重定向,并且会报错。
spring.redis.cluster.max-redirects=6在代码中注入并引用 StringRedisTemplate,参考 key string 序列化https://blog.csdn.net/Muscleheng/article/details/135323270
@Autowired
StringRedisTemplate redisTemplate = null;