• 周二. 3月 5th, 2024

    Redis数据类型之String

    root

    4月 27, 2022 #redis数据类型, #String

    特点:

    • 字符串类型是二进制安全的(在传输数据的时候,能保证二进制数据的信息安全,也就是不会被篡改、破译;如果被攻击,能够及时检测出来),它们都有一个已知的长度,可以接受任何格式的数据(如信息交换中常用的JSON格式字符串,甚至图像数据),value除了是我们的字符串还可以是数字
    • 字符串类型最多可以容纳长度可达512M

    应用场景:

    • 计数器: 如文章阅读数、粉丝数。incr本身就是具有原子性特性,所以不会有线程安全的问题
    • 验证码:通过设置key的过期时间来销毁过期的验证码,和业务系统解耦
    • 存储对象:如用户基本信息json{“id”:”1″,”username”:”name”}
    • bitmap位图: 如签到,打卡等场景统计
    • 分布式锁:用过string类型的setnx命令“当key不存在时,设置并返回1,当key已存在时,不设置并返回0”, “判断key是否存在”和“设值“两个操作是原子性地执行的,因此可以用string类型作为分布式锁,返回1表示获得锁,返回0表示没有获得锁。
    • 统计多单位的数量 udi:2222:follow
    • 粉丝数
    • 对象缓存

    String类型命令的官方文档:

    https://redis.io/commands/?group=string

    1. set, get

    set key value [ex 秒数] [px 毫秒数] [nx/xx]
    ex:  指定到期时间,单位秒
    px: 指定到期时间,单位毫秒,如果ex,px同时写,则以后面的有效期为准
    nx: 对应key不存在则创建
    xx: 对应key存在则修改其值
    
    #get命令用来获取指定键的值,如果键不存在,返回nil, 如果返回值不是字符串,则返回错误
    get key 

    示例

    127.0.0.1:6379> set name bianpj
    OK
    127.0.0.1:6379> get name
    "bianpj"
    127.0.0.1:6379> get nname
    (nil)

    2. mset,mget命令

    mset key1 value1 key2 value2 … #一次性设置多个键和值

    mget key1 key2 … # 返回所有给定键的值,对于某个不存在值的键或不存在的键,返回nil,否则返回键的值列表

    127.0.0.1:6379> mset name1 bian name2 pei name3 jiang
    OK
    127.0.0.1:6379> mget name1 name2 name3 name4
    1) "bian"
    2) "pei"
    3) "jiang"
    4) (nil)

    3. setrange,getrange命令

    setrange key offset value
    #将字符串中偏移量为offset后的子串覆盖为指定的值,该命令返回修改后的字符串的长度
    #如果偏移量offset > 原字符串长度,不足部分用0x00补全
    
    getrange key start stop
    #获取字符串指定范围的子串
    #支持负偏移量,右边第一个下标为-1
    # 假设字符串长度为length, getrange根据以下原则决定返回值
    # 当start > length, 则返回空字符串
    # 当stop >= length, 则截取至字符串尾
    # 如果start > stop, 则返回空字符串
    # 如果0<= start <= stop < length 返回指定范围子串
    127.0.0.1:6379> set key1 "Hello World"
    OK
    127.0.0.1:6379> setrange key1 6 "redis"
    (integer) 11
    127.0.0.1:6379> get key1
    "Hello redis"
    127.0.0.1:6379> setrange key1 15 "Hei"
    (integer) 18
    127.0.0.1:6379> get key1
    "Hello redis\x00\x00\x00\x00Hei"
    
    127.0.0.1:6379> set key1 "This is getrange testing"
    OK
    127.0.0.1:6379> getrange key1 5 6
    "is"
    127.0.0.1:6379> getrange key1 100 200
    ""
    127.0.0.1:6379> getrange key1 5 100
    "is getrange testing"

    4. setex, setnx

    # 设置key的值,并指定过期时间(单位:秒)
    setex key seconds value 
    
    # 设置key的值,如果存在则不重新设置,返回0,否则返回1
    setnx key value
    127.0.0.1:6379> setex key1 5 "hello"
    OK
    127.0.0.1:6379> get key1
    "hello"
    127.0.0.1:6379> get key1
    (nil)
    127.0.0.1:6379> setnx key1 "hello"
    (integer) 1
    127.0.0.1:6379> setnx key1 "world"
    (integer) 0
    127.0.0.1:6379> get key1
    "hello"

    10.. incr、incrby、incrbyfloat、decr、decrby命令

    incr key
    # 自增一个指定键对应的整数值并返回新的值
    # 如果该键不存在,则创建键,对应的value被设置为0然后执行自增操作
    # 如果该键对应的值不能转换为整数,返回错误
    
    incrby key k
    # 可以自定义自增值
    
    incrbyfloat by f
    # 自定义自增一个浮点数
    
    decr key
    # 自减1
    
    decrby key decrement
    # 自减指定值
    127.0.0.1:6379> set key1 10
    OK
    127.0.0.1:6379> incr key1
    (integer) 11
    127.0.0.1:6379> incr key2
    (integer) 1
    127.0.0.1:6379> set key2 "non"
    OK
    127.0.0.1:6379> incr key2
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379>
    127.0.0.1:6379> incrby key1 5
    (integer) 16
    127.0.0.1:6379> get key1
    "16"
    127.0.0.1:6379> 
    127.0.0.1:6379> incrbyfloat key1 0.5
    "16.5"
    127.0.0.1:6379> get key1
    "16.5"
    127.0.0.1:6379> decr key1
    (error) ERR value is not an integer or out of range
    127.0.0.1:6379> get key1
    "16.5"
    127.0.0.1:6379> set key2 10
    OK
    127.0.0.1:6379> decr key2
    (integer) 9
    127.0.0.1:6379> decrby key2 3
    (integer) 6
    127.0.0.1:6379> get key2
    "6"

    11. strlen

    strlen key
    # 返回指定键的字符串值的长度
    127.0.0.1:6379> keys *
    1) "key2"
    2) "hello"
    3) "name2"
    4) "name1"
    5) "name"
    6) "name3"
    7) "key1"
    127.0.0.1:6379> strlen hello
    (integer) 5
    127.0.0.1:6379> strlen name2
    (integer) 3

    12 . append

    append key value
    #将字符串追加到指定key的原值末尾,返回新字符串的长度
    127.0.0.1:6379> set key1 "Hello"
    OK
    127.0.0.1:6379> append key1 "World"
    (integer) 10
    127.0.0.1:6379> get key1
    "HelloWorld"

    12. setbit, getbit命令

    setbit key offset value
    # 设置指定键的字符串在offset偏移量上对应二进制位上的值,并返回该位上的旧值。
    # 由于操作的是二进制位,所以设置新值只能为0或1
    # 如果指定key不存在,则创建一个新值并在指定的offset上设置二进制值。
    # 如果offset大于字符串的长度,不足部分用0填充后在指定offset上设置二进制值
    
    getbit key offset
    # 返回指定偏移量offset上二进制位的值。
    # 如果offset大于value的长度,或指定key不存在,则返回0
    127.0.0.1:6379> get key1
    "HelloWorld"
    127.0.0.1:6379> setbit key1 7 1
    (integer) 0
    127.0.0.1:6379> get key1
    "IelloWorld"
    127.0.0.1:6379> setbit key1 8 2
    (error) ERR bit is not an integer or out of range
    127.0.0.1:6379> getbit key1
    (error) ERR wrong number of arguments for 'getbit' command
    127.0.0.1:6379> getbit key1 7
    (integer) 1
    127.0.0.1:6379> getbit key1 8
    (integer) 0
    127.0.0.1:6379> getbit key1 100000
    (integer) 0
    127.0.0.1:6379> set key1 v1
    127.0.0.1:6379> get key1 
    127.0.0.1:6379> keys *
    127.0.0.1:6379> EXISTS key1
    127.0.0.1:6379> APPEND key1 "hello"   //追加字符串,如果当前key不存在,就相当于set
    127.0.0.1:6379> get key1
    127.0.0.1:6379> STRLEN key1   //获取字符串长度
    127.0.0.1:6379> APPEND key1 "aaaabb"
    127.0.0.1:6379> get key1
    
    //自增自减
    127.0.0.1:6379> set views 0
    127.0.0.1:6379> get views
    127.0.0.1:6379> incr views   //自增1
    127.0.0.1:6379> incr views
    127.0.0.1:6379> get views
    127.0.0.1:6379> decr views   //自减1
    127.0.0.1:6379> incrby views 10   //自增10
    127.0.0.1:6379> decrby view 10    //自减10 可以指定增量
    
    //字符串范围 range
    127.0.0.1:6379> set key1 "hello, kuangshen"
    127.0.0.1:6379> get key1
    127.0.0.1:6379> getrange key1 0 3   //截取字符串[0,3]
    127.0.0.1:6379> getrange key1 0 -1  //获取全部的字符串和get key是一样的
    
    //替换
    127.0.0.1:6379> set key2 abcdefg
    127.0.0.1:6379> get key2
    127.0.0.1:6379> setrange key2 1 xx  //替换指定位置的字符串
    127.0.0.1:6379> get key2
    
    //setex (set with expire)  #设置过期时间
    //setnx (set if exists)  #不存在设置(在分布式锁中会常常使用@)
    
    127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3  //同时设置多个值
    OK
    127.0.0.1:6379> mget k1 k2 k3   //同时获取多个值
    1) "v1"
    2) "v2"
    3) "v3"
    127.0.0.1:6379> msetnx k1 v1 k4 v4 //msetnx 是一个原子性的操作,要么一起成功,要么一起失败
    (integer) 0
    127.0.0.1:6379> get k4
    (nil)
    
    // 对象
    set user:1 {name:zhangsan, age:18} //设置一个user:1对象 值为json字符串
    //这里的key是一个巧妙的设计: user:{id}:{field} 如此设计在redis中是完全ok的
    
    getset //先get后set

    root