概述
Redis(全称 REmote DIctionary Server)是一个开源的内存数据存储系统,它被广泛应用于缓存、消息队列、实时数据存储等场景。Redis 是一个基于内存的数据结构存储,可以作为数据库、缓存和消息中间件使用
优点
- 高性能:支持高并发访问,适合高吞吐量的应用。
- 丰富的数据结构:支持多种数据类型,可以满足不同应用场景的需求。
- 持久化功能:可以将内存数据持久化到磁盘,防止数据丢失。
- 简单易用:易于部署和使用,支持多种客户端语言。
- 高可用与扩展性:支持主从复制、分片、哨兵模式,适合分布式环境。
缺点
- 内存消耗:Redis 是基于内存的存储,虽然支持持久化,但大规模数据集可能会占用大量内存。
- 不适合存储大数据量:Redis 主要适合存储小到中等规模的数据集,对于大规模的持久化数据存储,可能需要结合其他数据库一起使用。
- 单线程:虽然 Redis 使用单线程处理请求,但通过事件驱动的非阻塞 I/O 机制,仍能保持高效的性能。
基本的类与接口
总结
redis_client
:用于进行 Redis 命令操作reply
:封装 Redis 响应数据connection
:用于管理与 Redis 的连接async_client
:异步操作的客户端pipeline
:批量执行 Redis 命令command
:封装 Redis 命令及其参数transaction
:事务管理connection_pool
:连接池管理
redis_client
类
connect()
用于连接 Redis 服务器。支持同步和异步的连接方式
redis_client.connect("tcp://127.0.0.1:6379");
set()
设置一个键值对
client.set("key", "value");
get()
获取键的值
std::string value = client.get("key");
del()
删除指定的键
client.del("key");
exists()
判断键是否存在
bool exists = client.exists("key");
expire()
设置键的过期时间(单位:秒)
client.expire("key", 3600); // 键的过期时间为 1 小时
hset()
设置哈希表中的字段值
client.hset("myhash", "field1", "value");
hget()
获取哈希表中某个字段的值
std::string value = client.hget("myhash", "field1");
reply
类
Redis 服务器返回的响应。所有从 Redis 服务器接收到的数据都会包装成 reply
对象,包含响应的各种类型(字符串、整数、数组等)
is_string()
判断响应是否是字符串类型
if (reply.is_string()) {
std::cout << "Reply is a string: " << reply.as_string() << std::endl;
}
is_integer()
判断响应是否是整数类型
if (reply.is_integer()) {
std::cout << "Reply is an integer: " << reply.as_integer() << std::endl;
}
is_array()
判断响应是否是数组类型
if (reply.is_array()) {
auto elements = reply.as_array();
for (auto &elem : elements) {
std::cout << "Element: " << elem.as_string() << std::endl;
}
}
is_nil()
判断响应是否是空值
if (reply.is_nil()) {
std::cout << "Reply is nil" << std::endl;
}
connection类
connect()
连接 Redis 服务器。支持 TCP、Unix Socket 等协议
redis_client client;
client.connect("tcp://127.0.0.1:6379");
disconnect()
断开与 Redis 服务器的连接
client.disconnect();
is_connected()
检查与 Redis 的连接是否活跃
if (client.is_connected()) {
std::cout << "Connection is active" << std::endl;
}
async_client
类
set_async()
异步设置键值对
async_client.set_async("key", "value");
get_async()
异步获取键的值
auto reply = async_client.get_async("key");
wait_for_reply()
等待异步操作的响应
auto reply = async_client.get_async("key").wait_for_reply();
transaction
类
于封装 Redis 事务。它提供了一种方式,在一个事务中执行多个 Redis 命令,确保它们按顺序执行
multi()
开始一个 Redis 事务
transaction trans(client);
trans.multi();
exec()
提交事务
trans.exec();
connection_pool
类
get()
获取一个 Redis 连接
auto conn = pool.get();
release()
释放一个 Redis 连接
pool.release(conn);
基本使用
#include <sw/redis++/redis.h>
#include <gflags/gflags.h>
#include <iostream>
#include <thread>
DEFINE_string(ip, "127.0.0.1", "这是服务器的IP地址,格式:127.0.0.1");
DEFINE_int32(port, 6379, "这是服务器的端口, 格式: 8080");
DEFINE_int32(db, 0, "库的编号:默认0号");
DEFINE_bool(keep_alive, true, "是否进行长连接保活");
void print(sw::redis::Redis &client)
{
auto user1 = client.get("会话ID1");
if (user1) std::cout << *user1 << std::endl;
auto user2 = client.get("会话ID2");
if (user2) std::cout << *user2 << std::endl;
auto user3 = client.get("会话ID3");
if (user3) std::cout << *user3 << std::endl;
auto user4 = client.get("会话ID4");
if (user4) std::cout << *user4 << std::endl;
auto user5 = client.get("会话ID5");
if (user5) std::cout << *user5 << std::endl;
}
void add_string(sw::redis::Redis &client)
{
client.set("会话ID1", "用户ID1");
client.set("会话ID2", "用户ID2");
client.set("会话ID3", "用户ID3");
client.set("会话ID4", "用户ID4");
client.set("会话ID5", "用户ID5");
client.del("会话ID3");
client.set("会话ID5", "用户ID555"); //数据已存在则进行修改,不存在则新增
print(client);
}
//有效时间控制
void expired_test(sw::redis::Redis &client)
{
client.set("会话ID1", "用户ID1111", std::chrono::milliseconds(1000));
print(client);
std::cout << "------------休眠2s-----------\n";
std::this_thread::sleep_for(std::chrono::seconds(2));
print(client);
}
//列表操作
void list_test(sw::redis::Redis &client)
{
client.rpush("群聊1", "成员1");
client.rpush("群聊1", "成员2");
client.rpush("群聊1", "成员3");
client.rpush("群聊1", "成员4");
client.rpush("群聊1", "成员5");
std::vector<std::string> users;
client.lrange("群聊1", 0, -1, std::back_inserter(users));
for (auto user : users) {
std::cout << user << std::endl;
}
}
int main(int argc , char *argv[])
{
google::ParseCommandLineFlags(&argc, &argv, true);
//1. 构建连接选项、实例化Redis、连接服务器
sw::redis::ConnectionOptions opts;
opts.host = FLAGS_ip;
opts.port = FLAGS_port;
opts.db = FLAGS_db;
opts.keep_alive = FLAGS_keep_alive;
sw::redis::Redis client(opts);
//2.添加、删除、获取键值对
add_string(client);
//3.控制数据的有效时间
expired_test(client);
//4.列表操,主要就是实现数据的插入和获取
std::cout<<"--------------------\n";
list_test(client);
return 0;
}