Redis實戰之Redis 在 Win7 64bit + VS2013 使用
簡介
Redis是一個高效能的key-value資料庫,所支援的value型別包括string(字串)、list(連結串列)、set(集合)、zset(sorted set,有序集合)和hash(雜湊型別)等,資料操作具有原子性。
為了保證效率,資料都是快取在記憶體中,此外Redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。環境
Win7 64bit,VS2013,Reids-2.6。下載
Redis官網不支援Windows,但可以從 GitHub上下載Microsoft Open Tech group開發的Win64的版本。
測試過程中,最先採用 redis-3.0,編譯lib庫成功,但將lib連結到自己程式時編譯失敗,最後改用reids-2.6。
編譯
1)進入redis-2.6目錄\msvs,用vs2013開啟RedisServer.sln。
2)工程列表顯示有8個工程。3)依次編譯各工程,最終生成2個lib檔案和5個exe檔案:
註冊Windows服務
1)將RedisServer.sln編譯生成的5個exe檔案拷貝至Redis根目錄。
2)啟動cmd.exe,切換至Redis根目錄後,執行命令:
redis-server.exe –service-install redis.conf –loglevel verbose sc start Redis注:
命令1:建立Windows服務。
命令2:啟動Redis服務。
若需刪除Windows服務,則以管理員身份執行cmd.exe後,執行命令“sc delete 服務名稱”即可。-
安裝後,啟動Redis Desktop Manager,設定資料庫連線選項:
注:
Auth表示登入密碼,對應於配置檔案redis.conf中選項requirepass的值,去掉requirepass前的“#”並指定值,即可設定登入密碼(預設不需要登入密碼)。Redis資料庫結構:
Redis命令
7.1. 字串(string)
語法:redis 127.0.0.1:6379> SET KEY_NAME VALUE
簡介:設定給定 key 的值。如果 key 已經儲存其他值, SET 就覆寫舊值,且無視型別。
例項:
通過SET命令設定key對應的value,並通過GET命令獲取key對應的value。redis 127.0.0.1:6379> SET key "value" OK redis 127.0.0.1:6379> GET key "value" # 對已存在的鍵進行設定 redis 127.0.0.1:6379> SET key "new-value" OK redis 127.0.0.1:6379> GET key "new-value"
7.2. 雜湊(hash)
語法:redis 127.0.0.1:6379> HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN
簡介:用於同時將多個 field-value (欄位-值)對設定到雜湊表中。
注:
此命令會覆蓋雜湊表中已存在的欄位。如果雜湊表不存在,會建立一個空雜湊表,並執行 HMSET 操作。即:
若key不存在,則新建key;若key存在且field不存在,則原key中增加value;若key存在且field存在,則修改原key中field對應的value。例項:
通過HMSET命令向名為myhash的雜湊表中插入兩個元素,並通過HGET獲取指定field對應的value。redis 127.0.0.1:6379> HMSET myhash field1 "Hello" field2 "World" OK redis 127.0.0.1:6379> HGET myhash field1 "Hello" redis 127.0.0.1:6379> HGET myhash field2 "World"
7.3. 列表(list)
語法:redis 127.0.0.1:6379> LPUSH KEY_NAME VALUE1.. VALUEN
簡介:一個或多個值插入到列表頭部。 如果 key 不存在,一個空列表會被建立並執行 LPUSH 操作。 當 key 存在但不是列表型別時,返回一個錯誤。
例項:
通過LPUSH命令向名為list1的列表插入三個元素,並通過LRANGE返回列表指定索引區間內元素。127.0.0.1:6379> LPUSH list1 "foo" (integer) 1 127.0.0.1:6379> LPUSH list1 "bar" (integer) 2 127.0.0.1:6379> LRANGE list1 0 -1 1) "bar" 2) "foo"
7.4. 無序集合(set)
語法:redis 127.0.0.1:6379> SADD KEY_NAME VALUE1..VALUEN
簡介:用於將一個或多個成員元素加入到集合中。(成員元素必須唯一)
例項:
通過SADD命令向名為runoobkey的集合插入三個元素,並通過SMENBERS命令返回集合內元素。redis 127.0.0.1:6379> SADD runoobkey redis (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mongodb (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mysql (integer) 1 redis 127.0.0.1:6379> SADD runoobkey mysql (integer) 0 redis 127.0.0.1:6379> SMEMBERS runoobkey 1) "mysql" 2) "mongodb" 3) "redis"
7.5. 有序集合(sorted set)
語法:redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
簡介:將一個或多個成員元素及其分數值加入到有序集當中。每個元素都會關聯一個double型別的分數。Redis正是通過分數來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數(score)卻可以重複。
例項:
通過ZADD命令向名為sunoobkey的集合中插入四個元素,並通過ZRANGE命令返回指定索引區間內元素。redis 127.0.0.1:6379> ZADD runoobkey 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD runoobkey 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD runoobkey 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
7.6. 使用者驗證
Redis未實現訪問控制功能,但它提供了一個輕量級的認證方式。語法:
redis 127.0.0.1:6379> redis 127.0.0.1:6379> config set requirepass password
簡介:設定Redis訪問密碼。
例項:
通過config set requirepass命令設定Redis訪問密碼後,必須通過auth命令驗證密碼後,才可對Redis進行操作。redis 127.0.0.1:6379> SET key "value" ok redis 127.0.0.1:6379> config set requirepass test123 ok redis 127.0.0.1:6379> SET key "value2" (error) NOAUTH Authentication required. redis 127.0.0.1:6379> auth test123 ok redis 127.0.0.1:6379> SET key "value2" ok
Redis在C++中應用
8.1設定工程屬性
1)將hiredis.lib和redis-2.6\src、redis-2.6\deps\hiredis路徑新增至新工程。
2)工程前處理器中增加:WIN32_LEAN_AND_MEAN _LIB _WIN32 _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE _CRT_SECURE_NO_DEPRECATE
8.2. VS2013測試
#include "hiRedis\hiredis.h"
#define NO_QFORKIMPL///這一行必須加上 且必須放在 #include "Redis\win32fixes.h" 之前才能正常使用
#include "Redis\win32fixes.h"
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 1), &wsaData);
///1、連線Redis資料庫
redisReply *reply;
struct timeval timeout = {1, 500000}; /// 1.5 seconds
QSharedPointer<redisContext> pRedisContext = QSharedPointer<redisContext>(redisConnectWithTimeout((char*)"127.0.0.1", 6379, timeout));
if (pRedisContext.isNull())
{
strLastError = QString("Redis資料庫連線失敗");
return false;
}
if (pRedisContext->err)
{
strLastError = QString("Redis資料庫連線失敗,錯誤資訊:%1").arg(pRedisContext->errstr);
return false;
}
///2、設定key-value
redisReply *pRedisReply = (redisReply *)redisCommand(pRedisContext.data(), "SET %s %s", "DataBase","Redis");
if (pRedisReply == NULL || QString::compare("ok", pRedisReply->str, Qt::CaseInsensitive) != 0)
{
strLastError = QString("Redis資料庫SET操作失敗");
return false;
}
///3、獲取key-value
pRedisReply = (redisReply *)redisCommand(pRedisContext.data(), "GET %s", strKey.toStdString().data());
if (pRedisReply == NULL)
{
strLastError = QString("Redis資料庫GET操作失敗");
return false;
}
return EXIT_SUCCESS;
}