Redis

概述

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 服务器。支持同步和异步的连接方式

bash 复制代码
redis_client.connect("tcp://127.0.0.1:6379");

set() 设置一个键值对

bash 复制代码
client.set("key", "value");

get() 获取键的值

bash 复制代码
std::string value = client.get("key");

del() 删除指定的键

bash 复制代码
client.del("key");

exists() 判断键是否存在

bash 复制代码
bool exists = client.exists("key");

expire() 设置键的过期时间(单位:秒)

bash 复制代码
client.expire("key", 3600);  // 键的过期时间为 1 小时

hset() 设置哈希表中的字段值

bash 复制代码
client.hset("myhash", "field1", "value");

hget() 获取哈希表中某个字段的值

bash 复制代码
std::string value = client.hget("myhash", "field1");

reply

Redis 服务器返回的响应。所有从 Redis 服务器接收到的数据都会包装成 reply 对象,包含响应的各种类型(字符串、整数、数组等)

is_string() 判断响应是否是字符串类型

bash 复制代码
if (reply.is_string()) {
    std::cout << "Reply is a string: " << reply.as_string() << std::endl;
}

is_integer() 判断响应是否是整数类型

cpp 复制代码
if (reply.is_integer()) {
    std::cout << "Reply is an integer: " << reply.as_integer() << std::endl;
}

is_array() 判断响应是否是数组类型

cpp 复制代码
if (reply.is_array()) {
    auto elements = reply.as_array();
    for (auto &elem : elements) {
        std::cout << "Element: " << elem.as_string() << std::endl;
    }
}

is_nil() 判断响应是否是空值

cpp 复制代码
if (reply.is_nil()) {
    std::cout << "Reply is nil" << std::endl;
}

connection类

connect() 连接 Redis 服务器。支持 TCP、Unix Socket 等协议

cpp 复制代码
redis_client client;
client.connect("tcp://127.0.0.1:6379");

disconnect() 断开与 Redis 服务器的连接

cpp 复制代码
client.disconnect();

is_connected() 检查与 Redis 的连接是否活跃

cpp 复制代码
if (client.is_connected()) {
    std::cout << "Connection is active" << std::endl;
}

async_client

set_async() 异步设置键值对

cpp 复制代码
async_client.set_async("key", "value");

get_async() 异步获取键的值

cpp 复制代码
auto reply = async_client.get_async("key");

wait_for_reply() 等待异步操作的响应

cpp 复制代码
auto reply = async_client.get_async("key").wait_for_reply();

transaction

于封装 Redis 事务。它提供了一种方式,在一个事务中执行多个 Redis 命令,确保它们按顺序执行

multi() 开始一个 Redis 事务

cpp 复制代码
transaction trans(client);
trans.multi();

exec() 提交事务

cpp 复制代码
trans.exec();

connection_pool

get() 获取一个 Redis 连接

cpp 复制代码
auto conn = pool.get();

release() 释放一个 Redis 连接

cpp 复制代码
pool.release(conn);

基本使用

cpp 复制代码
#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;
}
相关推荐
Lalolander1 小时前
2024信创数据库TOP30之华为Gauss DB
大数据·数据库·科技·华为·系统架构
莳花微语3 小时前
Oracle 11G DataGuard GAP 修复过程(通过主库scn增备恢复)
数据库·oracle
petaexpress3 小时前
云原生和数据库哪个好一些?
数据库·云原生·云原生和数据库哪个好·云原生和数据库
Cristiano永远是goat3 小时前
数据库原理-期末复习基础知识第二弹
数据库
MXsoft6184 小时前
智能运维视角下的网络设备监测与数据分析
大数据·运维·数据库
冧轩在努力4 小时前
redis的应用--分布式锁
数据库·redis·分布式
2021-5-54 小时前
利用 Redis 与 Lua 脚本解决秒杀系统中的高并发与库存超卖问题
数据库·redis·lua
都要好好的O4 小时前
2.mysql 中一条更新语句的执行流程是怎样的呢?
数据库·mysql
夏子曦5 小时前
Redis——主从复制原理
数据库·redis·缓存
zxrhhm6 小时前
SQLServer中使用ISNULL替换为指定的替换值
数据库·sqlserver