【redis】安装与使用_redis安装和使用
redis安装与使用
- 1. 介绍
- 2. 安装
-
- 2.1 服务端
- 2.2 客户端
- 3. 接口介绍
- 4. 使用
1. 介绍
Redis(Remote Dictionary Server)是一个开源的高性能键值对(key-value)数据库。它通常用作数据结构服务器,因为除了基本的键值存储功能外,Redis 还支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)以及范围查询、位图、超日志和地理空间索引等
以下是 Redis 的一些主要特性:
- 内存中数据库:Redis 将所有数据存储在内存中,这使得读写速度非常快。
- 持久化:尽管 Redis 是内存数据库,但它提供了持久化选项,可以将内存中的数据保存到磁盘上,以防系统故障导致数据丢失。
- 支持多种数据结构:Redis 不仅支持基本的键值对,还支持列表、集合、有序集合等复杂的数据结构。
- 原子操作:Redis 支持原子操作,这意味着多个操作可以作为一个单独的原子步骤执行,这对于并发控制非常重要。
- 发布/订阅功能:Redis 支持发布订阅模式,允许多个客户端订阅消息,当消息发布时,所有订阅者都会收到消息。
- 高可用性:通过 Redis 哨兵(Sentinel)和 Redis 集群,Redis 可以提供高可用性和自动故障转移。
- 复制:Redis 支持主从复制,可以提高数据的可用性和读写性能。
- 事务:Redis 提供了事务功能,可以保证一系列操作的原子性执行。
- Lua 脚本:Redis 支持使用 Lua 脚本进行复杂的数据处理,可以在服务器端执行复杂的逻辑。
- 客户端库:Redis 拥有丰富的客户端库,支持多种编程语言,如 Python、Ruby、Java、C# 等。
- 性能监控:Redis 提供了多种监控工具和命令,可以帮助开发者监控和优化性能。
- 易于使用:Redis 有一个简单的配置文件和命令行界面,使得设置和使用变得容易。
Redis 广泛用于缓存、会话存储、消息队列、排行榜、实时分析等地方。由于其高性能和灵活性,Redis 成为了现代应用程序中非常流行的数据存储解决方案之一。
总结:Redis是一个内存数据库,存储键值对 – val可以是多种数据类型。
2. 安装
2.1 服务端
sudo apt install redis -y
默认安装只支持本地去连接,当前也可以修改一下配置支持远程连接
支持远程连接
修改 /etc/redis/redis.conf
- 修改 bind 127.0.0.1 为 bind 0.0.0.0
- 修改 protected-mode yes 为 protected-mode n
启动 Redis 服务
service redis-server start
停止 Redis 服务
service redis-server stop
重启 Redis 服务
service redis-server restart
开机启动 Redis 服务
sudo systemctl enable redis-server
2.2 客户端
C++ 操作 redis 的库有很多,我们使用 redis-plus-plus,这个库的功能强大,使用简单。但是redis-plus-plus 是基于 hiredis 实现的。hiredis 是一个 C 语言实现的 redis 客户端。因此需要先安装 hiredis。 直接使用包管理器安装即可。
sudo apt install libhiredis-dev
下载 redis-plus-plus 源码
git clone https://github.com/sewenew/redis-plus-plus.git
编译/安装 redis-plus-plus
使用 cmake 构建
cd redis-plus-plusmkdir buildcd buildcmake -DCMAKE_INSTALL_PREFIX=/usr .. #安装到系统库makemake install # 这一步操作需要管理员权限. 如果是非 root 用户, 使用sudo make install 执行
构建成功后, 会在 /usr/local/include/ 中多出 sw 目录,并且内部包含 redis-plus-plus 的一系列头文件。会在 /usr/local/lib/ 中多出一系列 libredis 库文件。
3. 接口介绍
redis 本身支持很多数据类型的键值对接口特别多,这里简单介绍字符串键值对的操作。
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 &uri) //或者自己在ConnectionOptions配置信息进行连接 explicit Redis(const ConnectionOptions &connection_opts,const ConnectionPoolOptions &pool_opts = {}) // 删除当前库中所有数据 void flushdb(bool async = false); // 删除指定键值对 long long del(const StringView &key); // 判断指定键值对是否存在 long long exists(const StringView &key); // 获取一个 string 键值对 OptionalString get(const StringView &key); // 存放一个 string 键值对,且设置过期时间-毫秒 bool set(const StringView &key, const StringView &val, const std::chrono::milliseconds &ttl = std::chrono::milliseconds(0), // 0 表示不设置超时 UpdateType type = UpdateType::ALWAYS); void setex(const StringView &key, long long ttl, const StringView &val); // 向一个列表中尾插/头插 string 键值对,它的val是一个列表 long long rpush(const StringView &key, const StringView&val); long long lpush(const StringView &key, const StringView&val); long long rpush(const StringView &key,Input first, Input last); //获取列表数据 // std::vector elements; // redis.lrange(\"list\", 0, -1,std::back_inserter(elements)); void lrange(const StringView &key,long long start, long long stop, Output output); } }}
4. 使用
这里只进行字符串键值对的增删改查操作以及数据的生命周期设置
#include#include#includevoid print(sw::redis::Redis& client){ auto user1 = client.get(\"会话1\"); if(user1) std::cout<<*user1<<std::endl; auto user2 = client.get(\"会话2\"); if(user2) std::cout<<*user2<<std::endl; auto user3 = client.get(\"会话3\"); if(user3) std::cout<<*user3<<std::endl; auto user4 = client.get(\"会话4\"); if(user4) std::cout<<*user4<<std::endl;}void add_string(sw::redis::Redis& 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& client){ //这次的新增,数据其实已经有了,因此本次是修改 //不仅仅修改了val,而且还给键值对新增了过期时间 client.set(\"会话1\",\"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\"); std::vector<std::string> users; client.lrange(\"群聊1\",0,-1,std::back_insert_iterator(users)); for(auto& user : users) { std::cout<< user << 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 << \"--------------------------\\n\"; list_test(client); return 0;}