String命令介绍笔记(4)

来源:互联网 发布:开淘宝店进货渠道 编辑:程序博客网 时间:2024/06/10 17:50
一;String类型
    1. 数据最大容量是512M。 【网络带宽】

static int checkStringLength(redisClient *c, long long size) {
          if (size > 512*1024*1024) {
              addReplyError(c,"string exceeds maximum allowed size (512MB)");
            return REDIS_ERR;
          }
          return REDIS_OK;
        }

     2. 赋值与取值 【get/set】

     3. incr key 【递增】 ++i/i++

       
 有些公司会用incr来生成订单号。【原子性递增】 

     4. incrby key increment  

           默认自增指定的值。

     5. decr key   默认的自减-
        decrby key decrement 

     6. 增加指定浮点数 incrbyfloat 

     7. append key value  =>C# String.Concat (+)

     8. StrLen 获取字符串的长度

     9. MGET,MSET  一次性设置多个值  节省带宽

     10. SetRange  => Replace

         GetRange  => SubString => SubStr

     11. SetEx => Set + Expire 【秒为单位】

           PSetEx=> Set + PExpire【毫秒为单位】

二  String命令中二进制的妙用

一:二进制运算


1. GetBit key offset    
     获取二进制中offset这个位置的“0,1”状态。

2. SetBit key offset value    设置二进制中offset这个位置的“0,1”状态。

3. Bitcount key               获取二进制中1的个数。

4. BitOp operation            二进制位的操作(^ & |)

二:Redis中二进制有两个坑。

1. 你所输入的数字全部用char类型表示,
2 => ascII形式展现【50】,
   所以2是字符的“2”。
    
   sample:  2    0 0 1 0    bitcount= 1  错。  bitcount=3。

2. 一般来说2这个字符的二进制位,采用的顺序是(从右到左。)
   但是在redis是从(从左到右)

   2=> '2' => 50  =>    0  0  1  1  0  0  1  0   32+16+2
 请看图



3. setbit num1 7 1 =>   0  0  1  1  0  0  1  1   32+16+2+1 => 51 ('3')


4. BitOp                0  0  1  1  0  0  1  1  num1 = 3
                     &  0  0  1  1  0  0  1  0  num2 = 2
    __________________________
       0  0  1  1  0  0  1  0  num3= 2

二:妙用 

 1. '2' => 50 =>    0  0  1  1  0  0  1  0     //二进制位中,要么是1,要么是0

           日    六  五   四  三  二   一
 2.    0    0    0    0    1  0    0   1    char


三:深入剖析String类型 

1.   Redis采用C语言编写。 


2.   C语言是怎么标识string的呢???char[]

3. 如果说redis采用char[] 会有什么样的弊端

    StrLen: 是不是要遍历 char[] 数组 O(N)

    Append:  是不是也需要遍历char[],然后在char[]中追加。 O(N)

    Redis的目标就是高性能,高并发。

4. Redis的解决方案呢??? 自己封装了一下char[],封装类型SDS (简单对象类型) 

struct sdshdr {
    unsigned int len;    //记录char[]实际使用的长度<=buf[].length
    unsigned int free;   //free记录着buf[]中未使用的坑位。
    char buf[];
};


5. StrLen =>  return sh->len;  O(1)

6. 看看string类型如何包装sds。


typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
    int refcount;         //垃圾回收(GC)
    void *ptr;
} robj;


看下图



   
原创粉丝点击