我是章鱼生生 發表於 2025-11-27 10:36:07

redis安装与使用方法示例讲解

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 介绍</a></li><li><a href="#_label1">2. 安装</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">2.1 服务端</a></li><li><a href="#_lab2_1_1">2.2 客户端</a></li></ul><li><a href="#_label2">3. 接口介绍</a></li><ul class="second_class_ul"></ul><li><a href="#_label3">4. 使用</a></li><ul class="second_class_ul"></ul><li><a href="#_label4">总结&nbsp;</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 介绍</h2>
<p>Redis(Remote Dictionary Server)是一个开源的高性能键值对(key-value)数据库。它通常用作数据结构服务器,因为除了基本的键值存储功能外,Redis 还支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)以及范围查询、位图、超日志和地理空间索引等</p>
<p>以下是 Redis 的一些主要特性:</p>
<ol><li><strong>内存中数据库</strong>:Redis 将所有数据存储在内存中,这使得读写速度非常快。</li><li><strong>持久化</strong>:尽管 Redis 是内存数据库,但它提供了持久化选项,可以将内存中的数据保存到磁盘上,以防系统故障导致数据丢失。</li><li><strong>支持多种数据结构</strong>:Redis 不仅支持基本的键值对,还支持列表、集合、有序集合等复杂的数据结构。</li><li><strong>原子操作</strong>:Redis 支持原子操作,这意味着多个操作可以作为一个单独的原子步骤执行,这对于并发控制非常重要。</li><li><strong>发布/订阅功能</strong>:Redis 支持发布订阅模式,允许多个客户端订阅消息,当消息发布时,所有订阅者都会收到消息。</li><li><strong>高可用性</strong>:通过 Redis 哨兵(Sentinel)和 Redis 集群,Redis 可以提供高可用性和自动故障转移。</li><li><strong>复制</strong>:Redis 支持主从复制,可以提高数据的可用性和读写性能。</li><li><strong>事务</strong>:Redis 提供了事务功能,可以保证一系列操作的原子性执行。</li><li><strong>Lua 脚本</strong>:Redis 支持使用 Lua 脚本进行复杂的数据处理,可以在服务器端执行复杂的逻辑。</li><li><strong>客户端库</strong>:Redis 拥有丰富的客户端库,支持多种编程语言,如 Python、Ruby、Java、C# 等。</li><li><strong>性能监控</strong>:Redis 提供了多种监控工具和命令,可以帮助开发者监控和优化性能。</li><li><strong>易于使用</strong>:Redis 有一个简单的配置文件和命令行界面,使得设置和使用变得容易。</li></ol>
<p>Redis 广泛用于缓存、会话存储、消息队列、排行榜、实时分析等领域。由于其高性能和灵活性,Redis 成为了现代应用程序中非常流行的数据存储解决方案之一。</p>
<p>总结:Redis是一个内存数据库,存储键值对 &ndash; val可以是多种数据类型。</p>
<p class="maodian"><a name="_label1"></a></p><h2>2. 安装</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>2.1 服务端</h3>
<div class="jb51code"><pre class="brush:ps;">sudo apt install redis -y
</pre></div>
<p>默认安装只支持本地去连接,当前也可以修改一下配置支持远程连接</p>
<p><strong>支持远程连接</strong></p>
<p>修改 /etc/redis/redis.conf</p>
<ul><li>修改 bind 127.0.0.1 为 bind 0.0.0.0</li><li>修改 protected-mode yes 为 protected-mode n</li></ul>
<p><strong>启动 Redis 服务</strong></p>
<div class="jb51code"><pre class="brush:ps;">service redis-server start
</pre></div>
<p><strong>停止 Redis 服务</strong></p>
<div class="jb51code"><pre class="brush:ps;">service redis-server stop
</pre></div>
<p><strong>重启 Redis 服务</strong></p>
<div class="jb51code"><pre class="brush:ps;">service redis-server restart
</pre></div>
<p><strong>开机启动 Redis 服务</strong></p>
<div class="jb51code"><pre class="brush:ps;">sudo systemctl enable redis-server
</pre></div>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.2 客户端</h3>
<p>C++ 操作 redis 的库有很多,我们使用 redis-plus-plus,这个库的功能强大,使用简单。但是redis-plus-plus 是基于 hiredis 实现的。hiredis 是一个 C 语言实现的 redis 客户端。因此需要先安装 hiredis。 直接使用包管理器安装即可。</p>
<div class="jb51code"><pre class="brush:ps;">sudo apt install libhiredis-dev
</pre></div>
<p><strong>下载 redis-plus-plus 源码</strong></p>
<div class="jb51code"><pre class="brush:ps;">git clone https://github.com/sewenew/redis-plus-plus.git
</pre></div>
<p><strong>编译/安装 redis-plus-plus</strong></p>
<p>使用 cmake 构建</p>
<div class="jb51code"><pre class="brush:ps;">cd redis-plus-plus
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr .. #安装到系统库
make
make install # 这一步操作需要管理员权限. 如果是非 root 用户, 使用sudo make install 执行
</pre></div>
<p>构建成功后, 会在 /usr/local/include/ 中多出 sw 目录,并且内部包含 redis-plus-plus 的一系列头文件。会在 /usr/local/lib/ 中多出一系列 libredis 库文件。</p>
<p class="maodian"><a name="_label2"></a></p><h2>3. 接口介绍</h2>
<p>redis 本身支持很多数据类型的键值对接口特别多,这里简单介绍字符串键值对的操作。</p>
<div class="jb51code"><pre class="brush:java;">namespace sw
{
    namespace redis
    {
   
      struct ConnectionOptions
      {
            std::string host;//ip
            int port = 6379;//port
            std::string path;
            std::string user = "default";//用户名
            std::string password;//密码
            int db = 0; // 默认 0 号库
            bool keep_alive = false;//长连接/短连接
      }
      //连接池
      struct ConnectionPoolOptions
      {
            std::size_t size = 1; // 最大连接数量
      }
      class Redis
      {       
              //直接给Redis服务器ip+port构造,各种配置信息采用默认的进行连接
            // uri e.g 'tcp://127.0.0.1:6379'
            explicit Redis(const std::string &amp;uri)
            //或者自己在ConnectionOptions配置信息进行连接
            explicit Redis(const ConnectionOptions &amp;connection_opts,const ConnectionPoolOptions &amp;pool_opts = {})
            // 删除当前库中所有数据
            void flushdb(bool async = false);
            // 删除指定键值对
            long long del(const StringView &amp;key);
            // 判断指定键值对是否存在
            long long exists(const StringView &amp;key);
            // 获取一个 string 键值对
            OptionalString get(const StringView &amp;key);
            // 存放一个 string 键值对,且设置过期时间-毫秒
            bool set(const StringView &amp;key,
                     const StringView &amp;val,
                     const std::chrono::milliseconds &amp;ttl =
                         std::chrono::milliseconds(0), // 0 表示不设置超时
                         UpdateType type = UpdateType::ALWAYS);
            void setex(const StringView &amp;key,
                     long long ttl,
                     const StringView &amp;val);
            // 向一个列表中尾插/头插 string 键值对,它的val是一个列表
            long long rpush(const StringView &amp;key, const StringView&amp;val);
            long long lpush(const StringView &amp;key, const StringView&amp;val);
            long long rpush(const StringView &amp;key,Input first, Input last);
            //获取列表数据
            // std::vector&lt;std::string&gt; elements;
            // redis.lrange("list", 0, -1,std::back_inserter(elements));
            void lrange(const StringView &amp;key,long long start, long long stop, Output output);
      }
    }
}
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 使用</h2>
<p>这里只进行字符串键值对的增删改查操作以及数据的生命周期设置</p>
<div class="jb51code"><pre class="brush:cpp;">#include&lt;iostream&gt;
#include&lt;sw/redis++/redis++.h&gt;
#include&lt;thread&gt;

void print(sw::redis::Redis&amp; client)
{
    auto user1 = client.get("会话1");
    if(user1) std::cout&lt;&lt;*user1&lt;&lt;std::endl;
    auto user2 = client.get("会话2");
    if(user2) std::cout&lt;&lt;*user2&lt;&lt;std::endl;
    auto user3 = client.get("会话3");
    if(user3) std::cout&lt;&lt;*user3&lt;&lt;std::endl;
    auto user4 = client.get("会话4");
    if(user4) std::cout&lt;&lt;*user4&lt;&lt;std::endl;

}

void add_string(sw::redis::Redis&amp; client)
{
    client.set("会话1","ID1");
    client.set("会话2","ID2");
    client.set("会话3","ID3");
    client.set("会话4","ID4");


    client.del("会话2");

    //数据已存在则进行修改,不存在则新增
    client.set("会话3","ID33333");

    print(client);
}

void expired_test(sw::redis::Redis&amp; client)
{
    //这次的新增,数据其实已经有了,因此本次是修改
    //不仅仅修改了val,而且还给键值对新增了过期时间
    client.set("会话1","ID1111",std::chrono::milliseconds(1000));

    print(client);
    std::cout &lt;&lt; "------------休眠2s-----------\n";
    std::this_thread::sleep_for(std::chrono::seconds(2));
    print(client);

}

void list_test(sw::redis::Redis&amp; client)
{
    client.rpush("群聊1","用户1");
    client.rpush("群聊1","用户2");
    client.rpush("群聊1","用户3");
    client.rpush("群聊1","用户4");


    std::vector&lt;std::string&gt; users;
    client.lrange("群聊1",0,-1,std::back_insert_iterator(users));

    for(auto&amp; user : users)
    {
      std::cout&lt;&lt; user &lt;&lt; std::endl;
    }


}


int main()
{
    //1. 构造连接选项,实例化Redis对象,连接服务器
    sw::redis::ConnectionOptions opts;
    //库IP地址
    opts.host = "127.0.0.1";
    //库的端口
    opts.port = 6379;
    //库的编号:默认0号
    opts.db = 0;
    //是否进行长连接保活
    opts.keep_alive = true;
    sw::redis::Redis client(opts);
    //2. 添加字符串键值对,删除字符串键值对,获取字符串键值对
    add_string(client);
    //3. 实践控制数据有效时间的操作
    expired_test(client);
    //4. 列表的操作,主要实现数据的右插,左获取
    std::cout &lt;&lt; "--------------------------\n";
    list_test(client);
    return 0;
}
</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>总结&nbsp;</h2>
頁: [1]
查看完整版本: redis安装与使用方法示例讲解