likes
comments
collection
share

redis常用数据类型之字符串类型

作者站长头像
站长
· 阅读数 40

redis有常用的5大数据类型,本篇文章针对字符串String类型重点讲解一下其使用方式、常用命令、以及数据结构。

数据结构

String是Redis最基本的类型,一个key对应一个value。一个Redis中字符串value最多可以是512M。

String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。

二进制安全是什么?

通俗的讲,C语言中,用“\0”表示字符串的结束,如果字符串中本身就有“\0”字符,那么这个字符串就会被截断,即非二进制安全;若通过某种机制,保证读写字符串时不损害其内容,则是二进制安全。

redis的String类型如何保证的二进制安全?

简单动态字符串(Simple Dynamic Strings,SDS)是Redis的基本数据结构之一,用于存储字符串和整型数据。SDS兼容C语言标准字符串处理函数,且在此基础上保证了二进制安全。

SDS对象中的buf是一个柔性数组,上层调用时,SDS直接返回了buf。由于buf是直接指向内容的指针,所以兼容C语言函数。而当真正读取内容时,SDS会通过len来限制读取长度,而非“\0”,所以保证了二进制安全。

SDS的数据结构是什么样的?

是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

redis在为String类型分配内存空间长度capacity时,通常会比字符串长度len要大。

redis常用数据类型之字符串类型

扩容时会存在两种情况:

  • 当字符串长度小于1M时,每次扩容时增加当前capacity的一倍。
  • 当字符串长度大于1M时,每次扩容都会增加1M。

最大长度是512M。

常用命令

set命令

当我们连接客户端,在命令行输入set命令式,会带出下面的提示内容:

127.0.0.1:6379> set key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]

后面有一系列的参数,我们一个个解释其作用:

  • 首先看一组设置过期时间的参数:

    • EX:设置key的超时秒数
    • PX:设置key的超时毫秒数
    • EXAT:设置key的过期时间戳,精确到秒
    • PXAT:设置key的过期时间戳,精确到毫秒
    • KEEPTTL:设置key永不过期

    使用示例,设置年龄age为100,3秒后过期:

    127.0.0.1:6379> set age 100 EX 3
    OK
    
  • 带有逻辑判断的参数:

    • NX:如果key不存在,则设置成功
    • XX:如果key存在,则设置成功

    使用示例,设置age为100:

    127.0.0.1:6379> set age 100 nx
    (nil)
    127.0.0.1:6379> set age 100 xx
    OK
    
  • 设置值同时返回:

    • GET:设置key为新值的同时,返回旧值

    使用示例,将age设置为1000:

    127.0.0.1:6379> set age 1000 get
    "100"
    

get、append、strlen、setnx

这几个命令都比较简单,放在一起简单说一下:

  • get:根据key获取value

  • append:将给定的value,追加到原本key的value的末尾

    127.0.0.1:6379> get age
    "1000"
    127.0.0.1:6379> append age 1
    (integer) 5
    127.0.0.1:6379> get age
    "10001"
    
  • strlen:获取值的长度

    127.0.0.1:6379> strlen age
    (integer) 5
    
  • setnx:当key存在则设置失败,key不存在才能设置成功,成功返回1,失败返回0

    127.0.0.1:6379> setnx age 100
    (integer) 0
    127.0.0.1:6379> setnx age1 100
    (integer) 1
    

incr和decr

这两个操作,有一个最重要的属性,原子性,不会被线程调度机制所打断,即不会有线程上下文的切换。

redis单命令的原子性得益于其单线程,后面文章会讲解。

  • incr:对key存储的数字值加1,如果值不存在,则赋值为1

    127.0.0.1:6379> incr age2
    (integer) 1
    127.0.0.1:6379> incr age2
    (integer) 2
    
  • decr:对key存储的数字值减1,如果值不存在,则赋值为-1

    127.0.0.1:6379> decr age3
    (integer) -1
    127.0.0.1:6379> decr age3
    (integer) -2
    
  • 上面的两个操作,还有两个自定义步长的命令,指定value增加或减少指定数值

    • incrby:增加指定步长
    • decrby:减少指定步长
    127.0.0.1:6379> incrby age2 2
    (integer) 4
    127.0.0.1:6379> decrby age3 2
    (integer) -4
    

批量操作命令

redis提供一些批量操作的命令:

  • mset:批量设置key-value

    127.0.0.1:6379> mset age 100 age1 101 age2 102 age3 103
    OK
    
  • mget:批量获取value,没有返回nil

    127.0.0.1:6379> mget age age1 age2 age3 age4
    1) "100"
    2) "101"
    3) "102"
    4) "103"
    5) (nil)
    
  • msetnx:批量设置不存在的值,此命令是原子性的,当有一个失败,则全部失败,成功返回1,失败返回0:

    127.0.0.1:6379> msetnx age 50 age4 104
    (integer) 0
    127.0.0.1:6379> get age4
    (nil)
    127.0.0.1:6379> msetnx age5 105 age4 104
    (integer) 1
    

范围操作

对于字符串类型的值,redis支持对其范围内的数据进行读取和设置:

给定一个字符串如下:

127.0.0.1:6379> set flag goodgoodstudy,daydayup
OK
127.0.0.1:6379> get flag
"goodgoodstudy,daydayup"
  • getrange:获取指定范围之间的内容
    127.0.0.1:6379> getrange flag 5 10
    "oodstu"
    
  • setrange:设置指定位置开始的值内容,其实是覆盖,下标从0开始
    127.0.0.1:6379> setrange flag 5 11111
    (integer) 22
    127.0.0.1:6379> get flag
    "goodg11111udy,daydayup"
    

setex

设置键值的同时,设置过期时间

  • setex key seconds value

    127.0.0.1:6379> setex age 100 100
    OK
    127.0.0.1:6379> ttl age
    (integer) 96
    127.0.0.1:6379> get age
    "100"
    

    关于redis字符串类型的内容,就简单介绍这么多

转载自:https://juejin.cn/post/7081819186355240973
评论
请登录