redis安裝與使用方法示例講解
1. 介紹
Redis(Remote Dictionary Server)是一個(gè)開源的高性能鍵值對(duì)(key-value)數(shù)據(jù)庫(kù)。它通常用作數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因?yàn)槌嘶镜逆I值存儲(chǔ)功能外,Redis 還支持多種類型的數(shù)據(jù)結(jié)構(gòu),如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)以及范圍查詢、位圖、超日志和地理空間索引等
以下是 Redis 的一些主要特性:
- 內(nèi)存中數(shù)據(jù)庫(kù):Redis 將所有數(shù)據(jù)存儲(chǔ)在內(nèi)存中,這使得讀寫速度非???。
- 持久化:盡管 Redis 是內(nèi)存數(shù)據(jù)庫(kù),但它提供了持久化選項(xiàng),可以將內(nèi)存中的數(shù)據(jù)保存到磁盤上,以防系統(tǒng)故障導(dǎo)致數(shù)據(jù)丟失。
- 支持多種數(shù)據(jù)結(jié)構(gòu):Redis 不僅支持基本的鍵值對(duì),還支持列表、集合、有序集合等復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
- 原子操作:Redis 支持原子操作,這意味著多個(gè)操作可以作為一個(gè)單獨(dú)的原子步驟執(zhí)行,這對(duì)于并發(fā)控制非常重要。
- 發(fā)布/訂閱功能:Redis 支持發(fā)布訂閱模式,允許多個(gè)客戶端訂閱消息,當(dāng)消息發(fā)布時(shí),所有訂閱者都會(huì)收到消息。
- 高可用性:通過 Redis 哨兵(Sentinel)和 Redis 集群,Redis 可以提供高可用性和自動(dòng)故障轉(zhuǎn)移。
- 復(fù)制:Redis 支持主從復(fù)制,可以提高數(shù)據(jù)的可用性和讀寫性能。
- 事務(wù):Redis 提供了事務(wù)功能,可以保證一系列操作的原子性執(zhí)行。
- Lua 腳本:Redis 支持使用 Lua 腳本進(jìn)行復(fù)雜的數(shù)據(jù)處理,可以在服務(wù)器端執(zhí)行復(fù)雜的邏輯。
- 客戶端庫(kù):Redis 擁有豐富的客戶端庫(kù),支持多種編程語言,如 Python、Ruby、Java、C# 等。
- 性能監(jiān)控:Redis 提供了多種監(jiān)控工具和命令,可以幫助開發(fā)者監(jiān)控和優(yōu)化性能。
- 易于使用:Redis 有一個(gè)簡(jiǎn)單的配置文件和命令行界面,使得設(shè)置和使用變得容易。
Redis 廣泛用于緩存、會(huì)話存儲(chǔ)、消息隊(duì)列、排行榜、實(shí)時(shí)分析等領(lǐng)域。由于其高性能和靈活性,Redis 成為了現(xiàn)代應(yīng)用程序中非常流行的數(shù)據(jù)存儲(chǔ)解決方案之一。
總結(jié):Redis是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),存儲(chǔ)鍵值對(duì) – val可以是多種數(shù)據(jù)類型。
2. 安裝
2.1 服務(wù)端
sudo apt install redis -y
默認(rèn)安裝只支持本地去連接,當(dāng)前也可以修改一下配置支持遠(yuǎn)程連接
支持遠(yuǎn)程連接
修改 /etc/redis/redis.conf
- 修改 bind 127.0.0.1 為 bind 0.0.0.0
- 修改 protected-mode yes 為 protected-mode n
啟動(dòng) Redis 服務(wù)
service redis-server start
停止 Redis 服務(wù)
service redis-server stop
重啟 Redis 服務(wù)
service redis-server restart
開機(jī)啟動(dòng) Redis 服務(wù)
sudo systemctl enable redis-server
2.2 客戶端
C++ 操作 redis 的庫(kù)有很多,我們使用 redis-plus-plus,這個(gè)庫(kù)的功能強(qiáng)大,使用簡(jiǎn)單。但是redis-plus-plus 是基于 hiredis 實(shí)現(xiàn)的。hiredis 是一個(gè) C 語言實(shí)現(xiàn)的 redis 客戶端。因此需要先安裝 hiredis。 直接使用包管理器安裝即可。
sudo apt install libhiredis-dev
下載 redis-plus-plus 源碼
git clone https://github.com/sewenew/redis-plus-plus.git
編譯/安裝 redis-plus-plus
使用 cmake 構(gòu)建
cd redis-plus-plus mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX=/usr .. #安裝到系統(tǒng)庫(kù) make make install # 這一步操作需要管理員權(quán)限. 如果是非 root 用戶, 使用sudo make install 執(zhí)行
構(gòu)建成功后, 會(huì)在 /usr/local/include/ 中多出 sw 目錄,并且內(nèi)部包含 redis-plus-plus 的一系列頭文件。會(huì)在 /usr/local/lib/ 中多出一系列 libredis 庫(kù)文件。
3. 接口介紹
redis 本身支持很多數(shù)據(jù)類型的鍵值對(duì)接口特別多,這里簡(jiǎn)單介紹字符串鍵值對(duì)的操作。
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; // 默認(rèn) 0 號(hào)庫(kù)
bool keep_alive = false;//長(zhǎng)連接/短連接
}
//連接池
struct ConnectionPoolOptions
{
std::size_t size = 1; // 最大連接數(shù)量
}
class Redis
{
//直接給Redis服務(wù)器ip+port構(gòu)造,各種配置信息采用默認(rèn)的進(jìn)行連接
// uri e.g 'tcp://127.0.0.1:6379'
explicit Redis(const std::string &uri)
//或者自己在ConnectionOptions配置信息進(jìn)行連接
explicit Redis(const ConnectionOptions &connection_opts,const ConnectionPoolOptions &pool_opts = {})
// 刪除當(dāng)前庫(kù)中所有數(shù)據(jù)
void flushdb(bool async = false);
// 刪除指定鍵值對(duì)
long long del(const StringView &key);
// 判斷指定鍵值對(duì)是否存在
long long exists(const StringView &key);
// 獲取一個(gè) string 鍵值對(duì)
OptionalString get(const StringView &key);
// 存放一個(gè) string 鍵值對(duì),且設(shè)置過期時(shí)間-毫秒
bool set(const StringView &key,
const StringView &val,
const std::chrono::milliseconds &ttl =
std::chrono::milliseconds(0), // 0 表示不設(shè)置超時(shí)
UpdateType type = UpdateType::ALWAYS);
void setex(const StringView &key,
long long ttl,
const StringView &val);
// 向一個(gè)列表中尾插/頭插 string 鍵值對(duì),它的val是一個(gè)列表
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);
//獲取列表數(shù)據(jù)
// std::vector<std::string> elements;
// redis.lrange("list", 0, -1,std::back_inserter(elements));
void lrange(const StringView &key,long long start, long long stop, Output output);
}
}
}
4. 使用
這里只進(jìn)行字符串鍵值對(duì)的增刪改查操作以及數(shù)據(jù)的生命周期設(shè)置
#include<iostream>
#include<sw/redis++/redis++.h>
#include<thread>
void print(sw::redis::Redis& client)
{
auto user1 = client.get("會(huì)話1");
if(user1) std::cout<<*user1<<std::endl;
auto user2 = client.get("會(huì)話2");
if(user2) std::cout<<*user2<<std::endl;
auto user3 = client.get("會(huì)話3");
if(user3) std::cout<<*user3<<std::endl;
auto user4 = client.get("會(huì)話4");
if(user4) std::cout<<*user4<<std::endl;
}
void add_string(sw::redis::Redis& client)
{
client.set("會(huì)話1","ID1");
client.set("會(huì)話2","ID2");
client.set("會(huì)話3","ID3");
client.set("會(huì)話4","ID4");
client.del("會(huì)話2");
//數(shù)據(jù)已存在則進(jìn)行修改,不存在則新增
client.set("會(huì)話3","ID33333");
print(client);
}
void expired_test(sw::redis::Redis& client)
{
//這次的新增,數(shù)據(jù)其實(shí)已經(jīng)有了,因此本次是修改
//不僅僅修改了val,而且還給鍵值對(duì)新增了過期時(shí)間
client.set("會(huì)話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. 構(gòu)造連接選項(xiàng),實(shí)例化Redis對(duì)象,連接服務(wù)器
sw::redis::ConnectionOptions opts;
//庫(kù)IP地址
opts.host = "127.0.0.1";
//庫(kù)的端口
opts.port = 6379;
//庫(kù)的編號(hào):默認(rèn)0號(hào)
opts.db = 0;
//是否進(jìn)行長(zhǎng)連接保活
opts.keep_alive = true;
sw::redis::Redis client(opts);
//2. 添加字符串鍵值對(duì),刪除字符串鍵值對(duì),獲取字符串鍵值對(duì)
add_string(client);
//3. 實(shí)踐控制數(shù)據(jù)有效時(shí)間的操作
expired_test(client);
//4. 列表的操作,主要實(shí)現(xiàn)數(shù)據(jù)的右插,左獲取
std::cout << "--------------------------\n";
list_test(client);
return 0;
}
總結(jié)
到此這篇關(guān)于redis安裝與使用方法的文章就介紹到這了,更多相關(guān)redis安裝與使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Redis進(jìn)行數(shù)據(jù)緩存的項(xiàng)目實(shí)踐
在實(shí)際的業(yè)務(wù)場(chǎng)景中,Redis 一般和其他數(shù)據(jù)庫(kù)搭配使用,用來減輕后端數(shù)據(jù)庫(kù)的壓力,本文就介紹了利用Redis進(jìn)行數(shù)據(jù)緩存的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2022-06-06
redis實(shí)現(xiàn)多級(jí)緩存同步方案詳解
這篇文章主要介紹了redis實(shí)現(xiàn)多級(jí)緩存同步方案詳解,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
Redis 出現(xiàn)錯(cuò)誤1067的解決辦法
這篇文章主要介紹了Redis 出現(xiàn)錯(cuò)誤1067的解決辦法的相關(guān)資料,Redis 錯(cuò)誤1067:進(jìn)程意外終止,Redis不能啟動(dòng),Redis啟動(dòng)不了,需要的朋友可以參考下2017-07-07
如何高效地向Redis插入大量的數(shù)據(jù)(推薦)
本篇文章主要介紹了如何高效地向Redis插入大量的數(shù)據(jù),現(xiàn)在分享給大家,感興趣的小伙伴們可以參考一下。2016-11-11
高并發(fā)下Redis如何保持?jǐn)?shù)據(jù)一致性(避免讀后寫)
本文主要介紹了高并發(fā)下Redis如何保持?jǐn)?shù)據(jù)一致性(避免讀后寫),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

