概述
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;
}