redis常用数据类型之字符串类型
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要大。
扩容时会存在两种情况:
- 当字符串长度小于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