美文网首页
Redis学习笔记-03String字符串

Redis学习笔记-03String字符串

作者: 惊天动地猪儿虫 | 来源:发表于2020-12-23 00:57 被阅读0次

    Redis有以下几种数据类型,这里从String字符串来开始。

    • 字符串类型
    • 散列类型 Map Dictinary
    • 列表类型 ArrayList List
    • 集合类型 HashSet
    • 有序集合类型 SortDictionary skipList CURD(logN)

    1 介绍

    字符串是Redis中最基本的数据类型,能存储字符串,包括二进制数据。一个键对应的值,最大是512MB。而且字符串是其他4种数据类型的基础,其他数据类型都是在从不同的角度来组织字符串。
    String是一个Key对应一个Value,String类型是二进制安全的。Redis的String可以包含任何数据,比如jps图片或者序列化的对象。


    2 命令操作

    以下是字符串类型常用的几种操作命令。

    API方法名 作用
    set 设置key对应的值为string类型的value
    setnx 设置key对应的值为string类型的value,如果key已经存在,返回0,nx是not exist的意思。
    setex 设置key对应的职位String类型的value,并指定此键值对应的有效期【秒】。
    setrange 设置指定key的value值的子字符串
    mset 一次设置多个key的值,成功返回OK表示所有的值都设置了, 失败返回0表示没有任何职被设置。
    msetnx 一次性设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。
    get 获取key对应的string值,如果可以不存在返回nil
    getset 设置key的值,并返回key的旧值
    getrange 获取key的value值的子字符串
    mget 一次获取多个key的值,如果对应key不存在则对应返回nil
    incr 对key的值做加加操作(自增),并返回新的值。
    incrby 同incr类似,加指定值,key不存在时候回设置key,并认为原来的value是0。
    decr 对key的值做减减操作
    decrby 同decr类似,减指定值
    append 给指定key的字符串追加value,返回新字符串的长度
    strlen 取指定key的value值的长度

    2.1 set和get

    127.0.0.1:6378> set name hello
    OK
    127.0.0.1:6378> set passwd world
    OK
    127.0.0.1:6378> get name
    "hello"
    127.0.0.1:6378> get passwd
    "world"
    127.0.0.1:6378> setnx name hello1
    (integer) 0
    127.0.0.1:6378> get name
    "hello"
    127.0.0.1:6378> 
    127.0.0.1:6378> setex name1 10  hello    # 设置为10s
    OK
    127.0.0.1:6378> get name1   #10秒内
    "hello"
    127.0.0.1:6378> get name1   #10秒外
    (nil)
    127.0.0.1:6378> 
    
    

    2.2 incr

    原子性递增,可以用来生成订单号。

    127.0.0.1:6378> set nums 1000
    OK
    127.0.0.1:6378> incr nums
    (integer) 1001
    127.0.0.1:6378> incr nums
    (integer) 1002
    127.0.0.1:6378> incr nums
    (integer) 1003
    127.0.0.1:6378> incrby nums 2000
    (integer) 3003
    127.0.0.1:6378>
    

    2.3 decr

    原子递减

    127.0.0.1:6378> set num1 1000
    OK
    127.0.0.1:6378> decr num1
    (integer) 999
    127.0.0.1:6378> decr num1
    (integer) 998
    127.0.0.1:6378> decrby num1 500
    (integer) 498
    127.0.0.1:6378> 
    

    2.4 append

    127.0.0.1:6378> get name
    "hello"
    127.0.0.1:6378> append name " world"   # 注意append第二个参数,添加双引号的区别
    (integer) 11
    127.0.0.1:6378> get name
    "hello world"
    127.0.0.1:6378> 
    127.0.0.1:6378> set name my
    OK
    127.0.0.1:6378> get name
    "my"
    127.0.0.1:6378> append name World   #注意append第二个参数,不添加双引号的区别
    (integer) 7 
    127.0.0.1:6378> get name
    "myWorld"
    127.0.0.1:6378> 
    

    3 位操作

    一个字节有8个二进制位组成,Redis提供了4个命令可以直接对二进制位进行操作。

    3.1 GETBIT key offset

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

    [root@master ~]# redis-cli -p 6378
    127.0.0.1:6378> set num1 2
    OK
    127.0.0.1:6378> getbit num1 0
    (integer) 0
    127.0.0.1:6378> getbit num1 1
    (integer) 0
    127.0.0.1:6378> getbit num1 2
    (integer) 1
    127.0.0.1:6378> getbit num1 3
    (integer) 1
    127.0.0.1:6378> getbit num1 4
    (integer) 0
    127.0.0.1:6378> getbit num1 5
    (integer) 0
    127.0.0.1:6378> getbit num1 6
    (integer) 1
    127.0.0.1:6378> getbit num1 7
    (integer) 0
    127.0.0.1:6378> 
    # 这里二进制是从0~7  高位到低位
    

    解释:2 在Redis中以字符串2存储,根据ASCII码表,二进制表示为0 0 1 1 0 0 1 0
    其过程如下:2=> '2' => 50 => 0 0 1 1 0 0 1 0 32+16+2

    3.2 SETBIT key offset value

    设置二进制中offset这个位置的“0,1”状态。

    127.0.0.1:6378> setbit num1 7 1
    (integer) 0
    127.0.0.1:6378> get num1
    "3"
    127.0.0.1:6378> 
    

    解释:修改二进制的第8位为1。其过程表示如下:
    0 0 1 1 0 0 1 0 => 0 0 1 1 0 0 1 1 => 32+16+2+1 => 51 ('3')

    3.3 BITCOUNT key [start] [end]

    获取二进制中1的个数。
    127.0.0.1:6378> bitcount num1
    (integer) 3
    127.0.0.1:6378>

    3.4 BITOP operstion destkey key [key...]

    二进制位的操作(^ & |)

    127.0.0.1:6378> set num1 3
    OK
    127.0.0.1:6378> set num2 2
    OK
    127.0.0.1:6378> bitop and num3 num1 num2
    (integer) 1
    127.0.0.1:6378> get num3
    "2"
    127.0.0.1:6378> 
    

    解释 num1 & num2 根据下面的规则运算结果为 2

       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
    

    Redis中的二进制注意点:

    • 你所输入的数字全部用char类型表示,比如 2 就是以 ascii码存储的,即为【50】
      参考如下ASCII码表

      2的ASCII码
      ASCII码中2的二进制表示为 0011 0010 而非 0000 0010。
    • 一般来说2这个字符的二进制位,采用的顺序是(从右到左。)但是在redis是从(从左到右)
      如上图所示

    相关文章

      网友评论

          本文标题:Redis学习笔记-03String字符串

          本文链接:https://www.haomeiwen.com/subject/dnienktx.html