標籤

顯示具有 Redis 標籤的文章。 顯示所有文章
顯示具有 Redis 標籤的文章。 顯示所有文章

2015年10月8日 星期四

Redis筆記-數據類型-String

Redis 數據類型 String


  1. 介紹

  2. String是redis最基本的類型,而且string類型是二進位安全的。

    也就是說String可以包含任何數據。

     比如jpg圖片或者序列化的對象。

    從內部實現來看其實string可以看作byte數組,最大上限是1G位元組。

    下面為string類型的定義。
       
    struct sdshdr {
        long len;
        long free;
        char buf[];
    };
    

    buf是個char數組用於存貯實際的字串內容。

    其實char和c#中的byte是等價的,都是一個位元組len是buf數組的長度,free是數組中剩餘可用位元組數。

    由此可以理解為什麼string類型是二進位安全的了。

    因為它本質上就是個byte數組。

    當然可以包含任何數據了。

    另外string類型可以被部分命令按int處理.比如incr等命令,下面詳細介紹。

    還有redis的其他類型像list,set,sorted set ,hash它們包含的元素與都只能是string類型。

  3. 指令對應說明

  4. 指令說明
    APPEND拼接字串
    BITCOUNT計算字串中的二進位值被設成1的個數
    BITOP字串中的二進位值的位元操作
    DECR遞減值一
    DECRBY遞減指定的值
    GET取得指定鍵值的內容
    GETBIT取得指定鍵值的二進位內容
    GETRANGE取得指定鍵值的資料特定位置的內容
    GETSET設定指定鍵值的內容,並返回舊值
    INCR遞增值一
    INCRBY遞增指定的值
    INCRBYFLOAT遞增指定的浮點數值
    MGET一次取回多組指定的key value
    MSET一次設定多組key value
    MSETNX一次設定多組key value,並且所有設定的key都不存在才成功
    PSETEX設定key value,並指定過期時間,單位是毫秒
    SET設定key value
    配合ex參數設定過期時間,單位是秒
    配合px參數設定過期時間,單位是毫秒
    配合nx參數只有key不存在時才成功
    配合xx參數只有key已存在時才成功
    SETBIT設定指定鍵值的二進位資料
    SETEX設定key value,並指定過期時間,單位是秒
    SETNX設定key value,並只有在key不存在時才成功
    SETRANGE更改特定位置的資料內容
    STRLEN取得指定鍵值的內容長度

2015年3月19日 星期四

Redis筆記-數據類型-Hash

hash是一個string類型的field和value的映射表.

它的添加,刪除操作都是O(1)(平均).hash特別適合用於存儲結構對象。

相較於將結構的每個字段存成單個string類型。

將一個結構存儲在hash類型中會佔用更少的記憶體,並且可以更方便的存取整個結構。

省內存的原因是新建一個hash對象時開始是用zipmap(又稱為small hash)來存儲的。

這個zipmap其實並不是hash table,但是zipmap相比正常的hash實現可以節省不少hash本身需要的一些元數據存儲開銷。

儘管zipmap的添加,刪除,查找都是O(n),但是由於一般結構的field數量都不太多。

所以使用zipmap也是很快的,也就是說添加刪除平均還是O(1)。

如果field或者value的大小超出一定限制後,redis會在內部自動將zipmap替換成正常的hash實現.

這個限制可以在配置檔中指定
hash-max-zipmap-entries 64 #配置字段最多64個
hash-max-zipmap-value 512 #配置value最大為512位元組

下表為指令對應說明
指令說明
HDEL刪除指定的鍵值裡面的欄位
HEXISTS檢查指定的鍵值欄位是否存在
HGET取得指定的鍵值欄位內容
HGETALL取得指定的鍵值所有欄位內容
HINCRBY指定的鍵值欄位內容遞增加一
HINCRBYFLOAT指定的鍵值欄位內容遞指定的浮點數
HKEYS取得指定鍵值的所有欄位名稱
HLEN取得指定鍵值的欄位數量
HMGET同時取得多組指定鍵值的欄位內容
HMSET同時設定多組指定鍵值的欄位內容
HSET設定指定鍵值的欄位內容
HSETNX設定指定鍵值的欄位內容
HVALS取得指定鍵值的所有欄位的內容
HSCAN查詢指定鍵值的欄位名稱

其他資源:
使用範例文章

Redis筆記-數據類型-Hash 使用範例

介紹簡單的使用
語言:c#
使用函式庫:StackExchange.Redis
//設定連線字串
using (ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("127.0.0.1:10001"))
{
    // 取得操作介面
    IDatabase cache = conn.GetDatabase();

    const string custKey1 = "Key1";

    // 先刪除該Key以確保這個key對應資料型態是全新的
    cache.KeyDeleteAsync(custKey1);

    // 設定值
    cache.HashSetAsync(custKey1, "abc", "def");
    cache.HashSetAsync(custKey1, "ghi", "jkl");
    cache.HashSetAsync(custKey1, "mno", "pqr");

    // 依照custKey1取得對應hash值
    HashEntry[] tResult = cache.HashGetAll(custKey1);
    foreach (HashEntry tHE in tResult)
    {
        Console.WriteLine(tHE.Name + ":" + tHE.Value);
    }
}

我們也可以使用HashSet() 一次設定好Hash的值
//設定連線字串
using (ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("127.0.0.1:10001"))
{
    // 取得操作介面
    IDatabase cache = conn.GetDatabase();

    const string custKey1 = "Key1";

    // 先刪除該Key以確保這個key對應資料型態是全新的
    cache.KeyDeleteAsync(custKey1);

    // 設定值
    HashEntry[] hashEntries =
        {
            new HashEntry("abc", "def"),
            new HashEntry("ghi", "jkl"),
            new HashEntry("mno", "pqr"),
        };
    cache.HashSet(custKey1, hashEntries);

    // 依照custKey1取得對應hash值
    HashEntry[] tResult = cache.HashGetAll(custKey1);
    foreach (HashEntry tHE in tResult)
    {
        Console.WriteLine(tHE.Name + ":" + tHE.Value);
    }
}

以下為使用搜索範例
// 搜索這個key的所有內容
IEnumerable t1 = cache.HashScan(custKey1);
HashEntry[] v1 = t1.ToArray();
                
Console.WriteLine("==HashScan(custKey1)==");
foreach (HashEntry tHE in v1)
{
    Console.WriteLine(tHE.Name + ":" + tHE.Value);
}
條件過濾
// 加條件的過濾搜索
IEnumerable t2 = cache.HashScan(custKey1, "*h*");
HashEntry[] v2 = t2.ToArray();

Console.WriteLine("==HashScan(custKey1,'*h*')==");
foreach (HashEntry tHE in v2)
{
    Console.WriteLine(tHE.Name + ":" + tHE.Value);
}


2015年3月18日 星期三

Redis筆記-EVAL 使用if判斷對應欄位值範例

語言: c#
使用函式庫: StackExchange.Redis

//設定連線字串
using ( ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("127.0.0.1:10001"))
{
 // 取得操作介面
 IDatabase cache = conn.GetDatabase();

 RedisKey custKey1 = "Key1";
 RedisValue newTest1 = "first";

 // 設定Script 字串
 string tEval = @"local res = redis.call('get', KEYS[1]) 
    if res  == ""value1"" then 
     return ARGV[1] 
    else
     return res
    end";

 // 設定 custKey1 的值為 "value1"
 cache.StringSet(custKey1, "value1");

 // 呼叫執行Script (Eval)
 RedisResult tResult = cache.ScriptEvaluate(tEval
  , new RedisKey[] { custKey1 }, new RedisValue[] { newTest1 });

 if (tResult.IsNull == false)
 {
  Console.WriteLine(tResult.ToString());
 }
}

Redis C# Client - StackExchange.Redis 安裝教學

先透過NuGet安裝StackExchange.Redis這個套件
如果需要簽署的元件,可以安裝StackExchange.Redis.StrongName這個套件



透過ConnectionMultiplexer這個類別來產生連線,並重覆使用
再透過GetDatabase來取得要IDatabase介面,就可以存取Redis了


namespace ConsoleApplication1
{
    using System;
    using StackExchange.Redis;

    class Program
    {
        static void Main(string[] args)
        {
            ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("127.0.0.1:6379");
            IDatabase cache = conn.GetDatabase();
            cache.StringSet("key1", "value1");
            string data = cache.StringGet("key1");
            Console.WriteLine(data);
        }
    }
}