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月25日 星期三

StyleCop 所有規則翻譯對照

所有規則的翻譯(基於版本4.7.44.0):


1、SA1600:ElementsMustBeDocumented元素必須添加注釋
2、SA1601: PartialElementsMustBeDocumented   Partial修飾的成員必須添加注釋
3、SA1602:EnumerationItemsMustBeDocumented 枚舉必須添加注釋
4、SA1603: DocumentationMustContainValidXml  注釋必須合法(注釋中的關鍵字不能有錯誤)
5、SA1604: ElementDocumentationMustHaveSummary 元素注釋必須包含Summary關鍵字
6、SA1605:PartialElementDocumentationMustHaveSummary   Partial修飾的成員注釋必須包含Summary關鍵字
7、SA1606:ElementDocumentationMustHaveSummaryText   Summary節點內部必須添加文本
8、SA1607:PartialElementDocumentationMustHaveSummaryText  Partial修飾的成員注釋Summary節點內部必須添加文本
9、SA1608:ElementDocumentationMustNotHaveDefaultSummary  Summary注釋不能使用編譯器自帶的注釋文本
10、SA1609:PropertyDocumentationMustHaveValue   屬性的注釋中必須包含<Value>節點
11、SA1610:PropertyDocumentationMustHaveValueText  屬性的注釋<Value>節點必須包含文本值
12、SA1611:ElementParametersMustBeDocumented   参數必須注釋
13、SA1612:ElementParameterDocumentationMustMatchElementParameters  参數的個數必須與注釋裏的個數一致
14、SA1613:ElementParameterDocumentationMustDeclareParameterName 参數的注釋裏必須有参數的名稱
15、SA1614:ElementParameterDocumentationMustHaveText    参數注釋節點裏不能空着
16、SA1615:ElementReturnValueMustBeDocumented  返回值必須添加注釋
17、SA1616:ElementReturnValueDocumentationMustHaveText  返回值注釋的節點內必須有文本值
18、SA1617:VoidReturnValueMustNotBeDocumented 空返回值一定不能有返回值注釋
19、SA1618:GenericTypeParametersMustBeDocumented 生成的類型(泛型)参數必須有注釋
20、SA1619:GenericTypeParametersMustBeDocumentedPartialClass  SA1618情況如果有Partial類存在都要有注釋
21、SA1620:GenericTypeParameterDocumentationMustMatchTypeParameters 注釋與泛型必須能匹配上
22、SA1621:GenericTypeParameterDocumentationMustDeclareParameterName 泛型的注釋必須包含泛型定義是的關鍵字(如’T’)
23、SA1622:GenericTypeParameterDocumentationMustHaveText  泛型的注釋節點中必須包含文本值
24、SA1623:PropertySummaryDocumentationMustMatchAccessors  屬性的注釋必須與屬性的讀寫權限匹配,private類型的屬性不能出現在注釋裏
25、SA1624:PropertySummaryDocumentationMustOmitSetAccessorWithRestrictedAccess 屬性的注釋裏必須忽略protected關鍵字,當成public類型當注釋
26、SA1625:ElementDocumentationMustNotBeCopiedAndPasted  各個参數的注解不能完全相同(避免copy、post行为)
27、SA1626:SingleLineCommentsMustNotUseDocumentationStyleSlashes  單行注釋不能采取三個斜線的注釋方式,斜線的個數必須是二的倍數
28、SA1627:DocumentationTextMustNotBeEmpty   注釋節點內部不能为空(必須有文本值)
29、SA1628:DocumentationTextMustBeginWithACapitalLetter  注釋節點內部的文本必須以大寫字母開頭
30、SA1629:DocumentationTextMustEndWithAPeriod  注釋節點內部的文本必須英文的句號結束
31、SA1630:DocumentationTextMustContainWhitespace  注釋節點內部的文本必須包含空格
32、SA1631:DocumentationMustMeetCharacterPercentage 注釋節點內部的文本中不能包含過多的字符(舉例:包含’---------------------------------------’是不允許的)
33、SA1632:DocumentationTextMustMeetMinimumCharacterLength  已經作廢的規則,不允許有太短的字符串(如’A name’ 中的A字母)
34、SA1633:FileMustHaveHeader   代碼文件頭部必須有說明,一般放置版權信息
35、SA1634:FileHeaderMustShowCopyright   代碼文件頭部注解中必須包含版權關鍵字
36、SA1635:FileHeaderMustHaveCopyrightText代碼文件頭部注解中必須包含版權信息內同
37、SA1636:FileHeaderCopyrightTextMustMatch  代碼文件頭部注解中版權信息必須與設置畫面設置的內容相匹配,在”style seting”畫面的” Company Information tab”進行設置
38、SA1637:FileHeaderMustContainFileName  代碼文件頭部注解中必須包含文件名稱
39、SA1638:FileHeaderFileNameDocumentationMustMatchFileName  代碼文件頭部注解中必須包含文件名稱必須與實際的名稱匹配
40、SA1639:FileHeaderMustHaveSummary  代碼文件頭部注解中必須包含Summary節點
41、SA1640:FileHeaderMustHaveValidCompanyText 代碼文件頭部注解中版權信息必須含有合理的公司名字
42、SA1641:FileHeaderCompanyNameTextMustMatch  代碼文件頭部注解中的公司名字必須與設置畫面設置的內容相匹配,在”style seting”畫面的” Company Information tab”進行設置
43、SA1642:ConstructorSummaryDocumentationMustBeginWithStandardText  構造函數注釋標准:“Initializes a new instance of the <see cref="Customer{T}"/> class.”
44、SA1643:DestructorSummaryDocumentationMustBeginWithStandardText  析構函數注釋標准:“Finalizes an instance of the <see cref="Customer"/> class.”
45、SA1644:DocumentationHeadersMustNotContainBlankLines   注釋中不能出現空白行
46、SA1645:IncludedDocumentationFileDoesNotExist   如果注釋中包含文件,要確定這個文件存在,舉例:“       /// <include file="IncludedDocumentation.xml" path="root/EnabledMethodDocs" />” 這一項過於复雜不建議用,但是如果將來想規範化相同共性東西的注釋的時候倒是可以考慮引入。
47、SA1646:IncludedDocumentationXPathDoesNotExist  如果注釋中包含文件,路徑不存在。
48、SA1647:IncludeNodeDoesNotContainValidFileAndPath  如果注釋中包含文件 文件與路徑都要合法
49、SA1648:InheritDocMustBeUsedWithInheritingClass   這項不明白是什麼意思,還請知道的分享给我,謝謝。
50、SA1649:FileHeaderFileNameDocumentationMustMatchTypeName  文件頭注釋必須匹配類型
51、SA1650:ElementDocumentationMustBeSpelledCorrectly 注釋不能有拼寫錯誤(對中文支持不好,不建議使用該項)

布局規則


1、 SA1500:CurlyBracketsForMultiLineStatementsMustNotShareLine  花括號不能再同一行。
標准格式:  public StRsvrRFun()
         {
          }
2、SA1501:StatementMustNotBeOnASingleLine   語句不能共享一行
3、SA1502:ElementMustNotBeOnASingleLine   語句不能共享一行
4、SA1503:CurlyBracketsMustNotBeOmitted  花括弧即使在單行代碼的情況下也不能省略。
5、SA1504:AllAccessorsMustBeSingleLineOrMultiLine  讀寫屬性,要麼在同一行業要麼在分多行寫,不可規則不統一(個人建議分多行寫)。
6、SA1505:OpeningCurlyBracketsMustNotBeFollowedByBlankLine 開始的花括弧後面不能有空白行
7、SA1506:ElementDocumentationHeadersMustNotBeFollowedByBlankLine 元素頭部注釋跟元素之間不能有空白行
8、SA1507:CodeMustNotContainMultipleBlankLinesInARow 不允許有多行空白行緊挨着(個人建議寫一個空白行即可)
9、SA1508:ClosingCurlyBracketsMustNotBePrecededByBlankLine 結尾的花括弧不能再一個空白行之前
10、SA1509:OpeningCurlyBracketsMustNotBePrecededByBlankLine  開始的花括弧不能再一個空白行之前
11、SA1510:ChainedStatementBlocksMustNotBePrecededByBlankLine 相連的語句之間不能有空白行,如try語句與catch語句之間不能有空白行
12、SA1511:WhileDoFooterMustNotBePrecededByBlankLine  與SA1510相同,Do語句與While語句之間不能有空白行
13、SA1512:SingleLineCommentsMustNotBeFollowedByBlankLine 單行注釋不能後跟空白行
14、SA1513:ClosingCurlyBracketMustBeFollowedByBlankLine 結束花括弧之後必須有一個空白行
15、SA1514:ElementDocumentationHeaderMustBePrecededByBlankLine 頭部注解之前必須有一個空白行
16、SA1515:SingleLineCommentMustBePrecededByBlankLine 單行注釋之前要有一個空白行,還一種方法是不加空白行而用四個斜線注釋”////”,建議採取第一種方法
17、SA1516:ElementsMustBeSeparatedByBlankLine 鄰近的元素之間要有一個空白行
18、SA1517:CodeMustNotContainBlankLinesAtStartOfFile 代碼文件頭部字符之前不能出現空白行
19、SA1518:CodeMustNotContainBlankLinesAtEndOfFile代碼文件尾部字符之後不能出現空白行

可維護規則


1、 SA1119:StatementMustNotUseUnnecessaryParenthesis  語句中不可以出現多餘的括弧,無意義的括弧增加了代碼的可讀性
2、 SA1400:AccessModifierMustBeDeclared  必須定義訪問修飾符
3、 SA1401:FieldsMustBePrivate  字段必須定義为私有的
4、 SA1402:FileMayOnlyContainASingleClass 一個CS文件裏只定義一個類
5、 SA1403:FileMayOnlyContainASingleNamespace  一個CS文件只包含一個命名空間
6、 SA1404:CodeAnalysisSuppressionMustHaveJustification   Suppression特性(取消報告特定的靜態分析工具規則沖突,允許一個代碼項目上應用多個取消報告設置)必須要有合理理由
7、 SA1405:DebugAssertMustProvideMessageText 参見代碼:“Debug.Assert(value != true, "The value must always be true.");”
8、 SA1406:DebugFailMustProvideMessageText   参見代碼:“Debug.Fail("The code should never reach this point.");”
9、 SA1407:ArithmeticExpressionsMustDeclarePrecedence 算數表達式必須用明確的標明其優先級(此條與SA1119沖突)
10、 SA1408:ConditionalExpressionsMustDeclarePrecedence 條件表達式必須明確的標明其優先級(此條與SA1119沖突) 舉例:“if (x || (y && z && a) || b)”
11、 SA1409:RemoveUnnecessaryCode  移除無用的代碼
12、 SA1410:RemoveDelegateParenthesisWhenPossible  調用一個c#匿名方法不包含任何方法参數,必須要包括一個空括號(本人不建議使用匿名方法、匿名委托的語法,具體原因後續做分享)
13、 SA1411:AttributeConstructorMustNotUseUnnecessaryParenthesis 特性構造函數如果是空参的形式,不要包括那個空括號

命名規則


1、 SA1300:ElementMustBeginWithUpperCaseLetter  首字母必須大寫(個人理解應該是字段以外的東西)
2、 SA1301: ElementMustBeginWithLowerCaseLetter  不會出現的情況
3、 SA1302:InterfaceNamesMustBeginWithI  接口必須以“I”字母開頭
4、 SA1303:ConstFieldNamesMustBeginWithUpperCaseLetter Const常量首字母大寫
5、 SA1304:NonPrivateReadonlyFieldsMustBeginWithUpperCaseLetter 非私有非制度的字段必須首字母大寫
6、 SA1305:FieldNamesMustNotUseHungarianNotation 除了列表外的字符不可以出現匈牙利命名規則,在”Style Setting”裏的” Hungarian”Tab裏設置
7、 SA1306:FieldNamesMustBeginWithLowerCaseLetter 字段名必須首字母小寫
8、 SA1307:AccessibleFieldsMustBeginWithUpperCaseLetter public或者internal字段首字母大寫
9、 SA1308:VariableNamesMustNotBePrefixed  變量名不能有前綴
10、 SA1309:FieldNamesMustNotBeginWithUnderscore  字段名不能以下滑線開頭
11、 SA1310:FieldNamesMustNotContainUnderscore   字段名不能包括下滑線
12、 SA1311:StaticReadonlyFieldsMustBeginWithUpperCaseLetter static與readonly字段首字母大寫

排序規則


1、SA1200:UsingDirectivesMustBePlacedWithinNamespace   using部分必須在Namespace內部(個人不建議用這個規則)
2、SA1201:ElementsMustAppearInTheCorrectOrder 所有的元素必須出現在正確的位置上(個人不建議使用該規則,用region把一個類文件裏的元素分好組即可,字段、屬性、對外公布的接口、私有方法等組)
3、SA1202:ElementsMustBeOrderedByAccess  元素的修飾符有一個固定的順序(個人不建議使用該規則,用region把一個類文件裏的元素分好組即可,字段、屬性、對外公布的接口、私有方法等組)
4、SA1203:ConstantsMustAppearBeforeFields  常量字段擺放在其它字段之上
5、SA1204:StaticElementsMustAppearBeforeInstanceElements Static  元素擺放在前面
6、SA1205:PartialElementsMustDeclareAccess Partial修飾的元素必須聲明讀寫權限
7、SA1206:DeclarationKeywordsMustFollowOrder 舉例:
keywords must appear in the following order:
Access modifiers
static
All other keywords
8、SA1207:ProtectedMustComeBeforeInternal   Protected在Internal之前
9、SA1208:SystemUsingDirectivesMustBePlacedBeforeOtherUsingDirectives  系統級的引用在其他引用之前(格式化代碼就會自動按照這個規則編排using部分)
10、SA1209:UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives  using部分起別名的在最後排布
11、SA1210:UsingDirectivesMustBeOrderedAlphabeticallyByNamespace  using部分按照字母順序編排
12、SA1211:UsingAliasDirectivesMustBeOrderedAlphabeticallyByAliasName 別名的按照別名的字母編排
13、SA1212:PropertyAccessorsMustFollowOrder  屬性按照先get在set
14、SA1213:EventAccessorsMustFollowOrder  時間先remove在add
15、SA1214:StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements  StaticReadonly元素在StaticNonReadonly元素之前
16、SA1215:InstanceReadonlyElementsMustAppearBeforeInstanceNonReadonlyElements
一個readonly 實例元素要在一個非readonly 實例元素

可讀性規則


1、 SA1100:DoNotPrefixCallsWithBaseUnlessLocalImplementationExists
change the ‘base.’ prefix to ‘this.’.
2、 SA1101:PrefixLocalCallsWithThis  ‘this.’前綴不能省略
3、 SA1102:QueryClauseMustFollowPreviousClause   linq語句要麼同一行,要麼關鍵字分布在多行,關鍵字對齊
4、 SA1103:QueryClausesMustBeOnSeparateLinesOrAllOnOneLine 不是很理解
5、 SA1104:QueryClauseMustBeginOnNewLineWhenPreviousClauseSpansMultipleLines不是很理解
6、 SA1105:QueryClausesSpanningMultipleLinesMustBeginOnOwnLine不是很理解
7、 SA1106:CodeMustNotContainEmptyStatements  不允許有空白的聲明
8、 SA1107:CodeMustNotContainMultipleStatementsOnOneLine 同一行裏不允許出現多個聲明語句
9、 SA1108:BlockStatementsMustNotContainEmbeddedComments  非法用例:
if (x != y)
    // Make sure x does not equal y
    {
    }
10、 SA1109:BlockStatementsMustNotContainEmbeddedRegions  非法用例:
    if (x != y)
    #region
    {
    }
    #endregion
11、 SA1110:OpeningParenthesisMustBeOnDeclarationLine 方法開始的括弧要在聲明的那一行
12、 SA1111:ClosingParenthesisMustBeOnLineOfLastParameter  方法結束括弧與最後一個参數同行
13、 SA1112:ClosingParenthesisMustBeOnLineOfOpeningParenthesis  如果是空参的情況,開始於結束括弧在同一行
14、 SA1113:CommaMustBeOnSameLineAsPreviousParameter  逗號必須與前一個参數同行
15、 SA1114:ParameterListMustFollowDeclaration
確保参數列表與開始括號同行,或者另起一行 参數整體要在同一行
16、 SA1115:ParameterMustFollowComma 参數與参數之間不能隔空白行
17、 SA1116:SplitParametersMustStartOnLineAfterDeclaration  所有参數在同一行或者如下示例:
public string JoinName(
        string first,
        string last)
18、SA1117:ParametersMustBeOnSameLineOrSeparateLines   同上
19、SA1118:ParameterMustNotSpanMultipleLines 實際調用是参數要在同一行
20、SA1120:CommentsMustContainText  注釋必須節點內部必須有文本
21、SA1121:UseBuiltInTypeAlias  使用內嵌的類型別名,如下表:

Type AliasTypeFully Qualified Type
boolBooleanSystem.Boolean
byteByteSystem.Byte
charCharSystem.Char
decimalDecimalSystem.Decimal
doubleDoubleSystem.Double
shortInt16System.Int16
intInt32System.Int32
longInt64System.Int64
objectObjectSystem.Object
sbyteSByteSystem.SByte
floatSingleSystem.Single
stringStringSystem.String
ushortUInt16System.UInt16
uintUInt32System.UInt32
ulongUInt64System.UInt64

22、SA1122:UseStringEmptyForEmptyStrings
示例代碼:“string s = string.Empty;”不能寫成” string s = ""; ”
23、SA1123:DoNotPlaceRegionsWithinElements  不使用region(個人較反對這條,個人傾向於用region規整類裏的元素)
24、SA1124:DoNotUseRegions  不使用region(個人較反對這條,個人傾向於用region規整類裏的元素)
25、SA1125:UseShorthandForNullableTypes  使用簡寫版的可空類型 如”int?”
26、SA1126:PrefixCallsCorrectly  調用類成員的時候要帶上“this”前綴

拼寫規則


1、 SA1000:KeywordsMustBeSpacedCorrectly  關鍵字不能拼寫錯誤
2、 SA1001:CommasMustBeSpacedCorrectly 逗號前面擺放一個空格
3、 SA1002:SemicolonsMustBeSpacedCorrectly  分號前面擺放一個空格
4、 SA1003:SymbolsMustBeSpacedCorrectly  操作符與元素之間不加空格
5、 SA1004:DocumentationLinesMustBeginWithSingleSpace “///”注釋的每一行以一個空格開頭
6、 SA1005:SingleLineCommentsMustBeginWithSingleSpace  單行注釋以一個空格開頭
7、 SA1006:PreprocessorKeywordsMustNotBePrecededBySpace  預處理關鍵字內部不允許出現空格 如“# if Debug”是不允許的
8、 SA1007:OperatorKeywordMustBeFollowedBySpace   操作必須要在一個空格之後
9、 SA1008:OpeningParenthesisMustBeSpacedCorrectly  開始括弧放置合理的空格
10、 SA1009:ClosingParenthesisMustBeSpacedCorrectly  結尾括弧放置合理的空格
11、 SA1010:OpeningSquareBracketsMustBeSpacedCorrectly 開始方括號放置合理的空格
12、 SA1011:ClosingSquareBracketsMustBeSpacedCorrectly   結束方括號放置合理的空格
13、 SA1012:OpeningCurlyBracketsMustBeSpacedCorrectly  開始花括號放置合理的空格
14、 SA1013:ClosingCurlyBracketsMustBeSpacedCorrectly 結束花括號放置合理的空格
15、 SA1014:OpeningGenericBracketsMustBeSpacedCorrectly 同上
16、 SA1015:ClosingGenericBracketsMustBeSpacedCorrectly  同上
17、 SA1016:OpeningAttributeBracketsMustBeSpacedCorrectly  特性開始括號同上
18、 SA1017:ClosingAttributeBracketsMustBeSpacedCorrectly  特性結尾括號同上
19、 SA1018:NullableTypeSymbolsMustNotBePrecededBySpace 空類型前不放置空格
20、 SA1019:MemberAccessSymbolsMustBeSpacedCorrectly  成員訪問關鍵字前後有空格
21、 SA1020:IncrementDecrementSymbolsMustBeSpacedCorrectly 自增、自減關鍵字要有空格
22、 SA1021:NegativeSignsMustBeSpacedCorrectly  負號要有空格
23、 SA1022:PositiveSignsMustBeSpacedCorrectly   正號要有空格
24、 SA1023:DereferenceAndAccessOfMustBeSpacedCorrectly
25、 SA1024:ColonsMustBeSpacedCorrectly  冒號運算符要有空格
26、 SA1025:CodeMustNotContainMultipleWhitespaceInARow  同一行不允許出現多個空格
27、 SA1026:CodeMustNotContainSpaceAfterNewKeywordInImplicitlyTypedArrayAllocation  new關鍵字之後不允許出現空格
28、 SA1027:TabsMustNotBeUsed  不用tab字符(個人不建議採用這條)

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);
        }
    }
}