Redis中String类型介绍

 Redis字符串就是由字节组成的序列,字符串可以储存三种类型的值: 字节串,整数,浮点数。用户可以通过给定任意数字,对存储者整数和浮点数的字符串进行自增,自减操作,也可以整数转成浮点数。

当用户将一个值存到redis字符串里面,如果托这个在可以被解释为十进制整数或字符串,那么redis会允许对这个字符串进行各种INCR*或DECR*操作。如果用户对一个不存在的键或保存空串的键进行自增或自减,那么redis会在执行操作时将这个键值当0处理。

如果对一个无法解释为整数和浮点数的字符串进行自增或自减,那么redis会返回一个错误。

String类型基本操作

set命令 可以新建或修改一个键值为String类型,同时set 命令可以指定键多少秒(EX)或微秒(PX)或指定的unixtime秒(EXAT)或指定unix time微秒过期(PXAT)。

get可以获取对应key的值。

127.0.0.1:6379> help set

  SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
  summary: Set the string value of a key
  since: 1.0.0
  group: string

127.0.0.1:6379> help get

  GET key
  summary: Get the value of a key
  since: 1.0.0
  group: string

 

127.0.0.1:6379> get key1                    # key1不存在 ,使用get返回nil
(nil)
127.0.0.1:6379> set key1 v1                 # set key1 创建key1为String类型,值为v1
OK
127.0.0.1:6379> get key1                    # key1已经存在,get命令获取该值
"v1"
127.0.0.1:6379> set key1 v1_exists          # key1已经存在,使用set命令修改key1的值
OK
127.0.0.1:6379> get key1                    # get获取修改后的值
"v1_exists"     
127.0.0.1:6379>

set命令复杂用法:

#设置key值的时候,同时指定过期时间,同setex,
#如果使用PX则设置多少微秒或过期,同psetex.
#也可以指定具体在什么时间过期。
127.0.0.1:6379> set k1 20 EX 20
OK
127.0.0.1:6379> ttl k1
(integer) 18
127.0.0.1:6379> get k1
"20"
127.0.0.1:6379>
# set key value get组合,设置一个值得时候,返回旧值,然后设置新值,同getset命令
#
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> set k1 v2 get
"v1"
127.0.0.1:6379> get k1
"v2"

 

getset命令

getset命令获取一个key的值,并重新对该key进行复制,如果不存在则返回nil,创建新key

127.0.0.1:6379> help getset

  GETSET key value
  summary: Set the string value of a key and return its old value
  since: 1.0.0
  group: string

127.0.0.1:6379>

#当key存在时 返回当前key值,并赋新值
127.0.0.1:6379> getset key1 exists_changed
"v1_exists"     
127.0.0.1:6379> get key1
"exists_changed"
#当key不存在 返回nil,创建key并复制
127.0.0.1:6379> getset key2 v2_noexists
(nil)
127.0.0.1:6379> get key2
"v2_noexists"

setnx命令

setnx命令 只有当key不存在的时候才创建该key并赋值,返回结果为 1。如果key已存在,则返回0,什么都不做。

127.0.0.1:6379> help setnx

  SETNX key value
  summary: Set the value of a key, only if the key does not exist
  since: 1.0.0
  group: string

#当key1不存在时
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> setnx key1 v1_ne
(integer) 1     
127.0.0.1:6379> get key1
"v1_ne"
当key存在时,返回0什么都不做
127.0.0.1:6379> setnx key1 v1_ex
(integer) 0     
127.0.0.1:6379> get key1
"v1_ne"

getdel 命令

getdel命令获取一个key的值,并删除该key,如果key不存在则返回nil。

127.0.0.1:6379> help getdel

  GETDEL key
  summary: Get the value of a key and delete the key
  since: 6.2.0
  group: string

#当key不存在时,返回nil
127.0.0.1:6379> getdel key1
(nil)
127.0.0.1:6379> set key1 v1
OK
#当key存在时,返回该key的值,然后删除该key
127.0.0.1:6379> getdel key1
"v1"
127.0.0.1:6379> get key1
(nil)

mset mget msetnx命令

m 是multiple的缩写,意思为批量设置和批量获取的一意思。mset一次设置多个值,mget一次获取多个值,msetnx一次设置多个不存在的key的值,如果有key存在,则全部回滚。

其中mset和msetnx是原子性操作,set的时候,只要有一个值失败,旧会全部回滚。

127.0.0.1:6379> help mset

  MSET key value [key value ...]
  summary: Set multiple keys to multiple values
  since: 1.0.1
  group: string

127.0.0.1:6379> help mget

  MGET key [key ...]
  summary: Get the values of all the given keys
  since: 1.0.0
  group: string

127.0.0.1:6379> help msetnx

  MSETNX key value [key value ...]
  summary: Set multiple keys to multiple values, only if none of the keys exist
  since: 1.0.1
  group: string

127.0.0.1:6379>

 

#批量设置k1 k2 k3 的值为 v1 v2 v3
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
#批量获取k1 k2 k3 k4,此时k4不存在则返回nil
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) (nil)
#批量设置k3 k4的值,此时k3已经存在,则此操作失败,回滚msetnx操作
127.0.0.1:6379> msetnx k3 v3 k4 v4
(integer) 0
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) (nil)
#msetnx 对一个key进行两次赋值,k4不存在,但是msetnx是原子性操作,会用最后一个值来赋值。
127.0.0.1:6379> msetnx k4 v4 k4 v5
(integer) 1
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) "v5"
127.0.0.1:6379>

 

setex getex psetex命令

setex命令 为一个key赋值,并设置过期时间单位为秒。

getex 获取key的值,并且可以设置过期时间,该时间单位可以是秒 EX seconds也可以是微秒 PX milliseconds,也可以设置什么时候过期 EXAT timestamp或PXAT milliseconds-timestamp,也可以将该key持久话,不过期。

psetex为一个key赋值,并设置过期时间,单位为微秒。

 

127.0.0.1:6379> help setex

  SETEX key seconds value
  summary: Set the value and expiration of a key
  since: 2.0.0
  group: string

127.0.0.1:6379> help getex

  GETEX key [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|PERSIST]
  summary: Get the value of a key and optionally set its expiration
  since: 6.2.0
  group: string

127.0.0.1:6379> help psetex

  PSETEX key milliseconds value
  summary: Set the value and expiration in milliseconds of a key
  since: 2.6.0
  group: string

 

#setex 为key设置一个值,并指定20s后过期
127.0.0.1:6379> setex k1 20 ex20s
OK
#ttl time to live查看key的过期时间
127.0.0.1:6379> ttl 20
(integer) -2
127.0.0.1:6379> ttl k1
(integer) 11
#getex 将一个设置了过期的值,持久化
127.0.0.1:6379> getex k1 persist
"ex20s"
#如果ttl key的值为-1表示该key永不过期
127.0.0.1:6379> ttl k1
(integer) -1
#上面过程中k1已经持久化,然后使用getex EX 20设置该key20秒后过期。
127.0.0.1:6379> getex k1 EX 20
"ex20s"
127.0.0.1:6379> ttl k1
(integer) 19
127.0.0.1:6379> getex k1 persist
"ex20s"
127.0.0.1:6379> ttl k1
#getex PX可以设置按微秒过期。
127.0.0.1:6379> getex k1 PX 20000
"ex20s"
127.0.0.1:6379> ttl k1
(integer) 19
127.0.0.1:6379> getex k1 persist
"ex20s"
127.0.0.1:6379> ttl k1
(integer) -1

#getex也可以设置 在指定的Unix timestamp过期,如下所示
[root@node1 bin]# ./redis-cli set k1 v1
OK
[root@node1 bin]# date +%s
1659751328
[root@node1 bin]# ./redis-cli getex k1 EXAT 1659751350
"v1"
[root@node1 bin]# ./redis-cli ttl k1
(integer) 9

#psetex设置key值多少微秒后过期
127.0.0.1:6379> psetex k1 20000 ex20000ms
OK
127.0.0.1:6379> ttl k1
(integer) 18
127.0.0.1:6379> getex k1 persist
"ex20000ms"
127.0.0.1:6379> ttl k1
(integer) -1

 

对整数的自增或自减操作

INCR ,DECR, INCRBY ,DECRBY 这四个命令针对整数类型的字符串来进行操作

INCR和DECR都是对当前字符串自增1或自减1.

INCRBY和DECRBY,通过指定amount来对当前字符串进行自增amount或自减amount。

127.0.0.1:6379> help incr

  INCR key
  summary: Increment the integer value of a key by one
  since: 1.0.0
  group: string

127.0.0.1:6379> help decr

  DECR key
  summary: Decrement the integer value of a key by one
  since: 1.0.0
  group: string

127.0.0.1:6379> help incrby

  INCRBY key increment
  summary: Increment the integer value of a key by the given amount
  since: 1.0.0
  group: string

127.0.0.1:6379> help decrby

  DECRBY key decrement
  summary: Decrement the integer value of a key by the given number
  since: 1.0.0
  group: string

例如

127.0.0.1:6379> get k1
(nil)
#当前key num1不存在,会把值当做num1=0来处理
#incr返回值即为计算后的值,例如下面返回1.就是num1自增后的值为1.
127.0.0.1:6379> get num1
(nil)
127.0.0.1:6379> incr num1
(integer) 1
127.0.0.1:6379> get num1
"1"
#incr返回值即为计算后的值,例如下面num1之前值为1.自增后num1的值为2.
127.0.0.1:6379> incr num1
(integer) 2
127.0.0.1:6379> get num1
"2"
127.0.0.1:6379> incr num1
(integer) 3
127.0.0.1:6379> decr num1
(integer) 2
127.0.0.1:6379> decr num1
(integer) 1
127.0.0.1:6379> decr num1
(integer) 0
#INCR或DECR需要指定一个增量,来作为操作的基数,例如指定2,那么就每次自增2.
127.0.0.1:6379> incrby num1 2
(integer) 2
127.0.0.1:6379> incrby num1 2
(integer) 4
127.0.0.1:6379> decrby num1 3
(integer) 1
127.0.0.1:6379> decrby num1 3
(integer) -2
127.0.0.1:6379>

#值得注意的是incrby和decrby的amount参数不是必须为正整数。可以为0和负数。当前num值为3
127.0.0.1:6379> get num1
"3"
127.0.0.1:6379> incrby num1 -1
(integer) 2
127.0.0.1:6379> decrby num1 -1
(integer) 3
127.0.0.1:6379> decrby num1 0
(integer) 3
127.0.0.1:6379> incrby num1 0
(integer) 3
127.0.0.1:6379>

 

INCRBYFLOAT命令

incrbyfloat命令是对浮点数进行操作的命令,通过这个命令,我们可以将一个整数转换成浮点数,也可以对浮点数进行自增或自减

127.0.0.1:6379> help incrbyfloat

  INCRBYFLOAT key increment
  summary: Increment the float value of a key by the given amount
  since: 2.6.0
  group: string

127.0.0.1:6379>
#当前num1=2 为整数类型
127.0.0.1:6379> set num1 2
OK
127.0.0.1:6379> get num1
"2"
#通过自增-0.2 num1变为浮点数1.8
127.0.0.1:6379> INCRBYFLOAT num1 -0.2
"1.8"
#这是使用incr命令会报错
127.0.0.1:6379> incr num1
(error) ERR value is not an integer or out of range
#在通过自增0.2 有变成整数2

127.0.0.1:6379> INCRBYFLOAT num1 0.2
"2"
#这时执行incr没有报错,可以推断出 Redis会自己判断key的类型。
127.0.0.1:6379> incr num1
(integer) 3
127.0.0.1:6379> INCRBYFLOAT num1 0.2
"3.2"

 

append命令

append将value的值追加到当前key值的末尾。如果键不存在则创建键并赋值。

127.0.0.1:6379> help append

  APPEND key value
  summary: Append a value to a key
  since: 2.0.0
  group: string

#键已经存在的情况
127.0.0.1:6379> set test:command 'test : '
OK
127.0.0.1:6379> get test:command
"test : "
127.0.0.1:6379> append test:command 'append'
(integer) 13
127.0.0.1:6379> get test:command
"test : append"
127.0.0.1:6379>
#键不存在的情况
127.0.0.1:6379> exists non:exists:key
(integer) 0
127.0.0.1:6379> get non:exists:key
(nil)
127.0.0.1:6379> append non:exists:key "append create a key"
(integer) 19
127.0.0.1:6379> get non:exists:key
"append create a key"
127.0.0.1:6379>

 

strlen获取字符串的长度

strlen可以对字节串,整数,浮点数三个类型都可以获取该串的长度,浮点数,小数点也会计算在长度内。 如果key不存在则返回0.

127.0.0.1:6379> help strlen

  STRLEN key
  summary: Get the length of the value stored in a key
  since: 2.2.0
  group: string

127.0.0.1:6379>
127.0.0.1:6379> set str val1
OK
127.0.0.1:6379> set int 999
OK
127.0.0.1:6379> set float 888.88
OK
127.0.0.1:6379> strlen str
(integer) 4
127.0.0.1:6379> strlen int
(integer) 3
127.0.0.1:6379> strlen float
(integer) 6

127.0.0.1:6379> strlen key:not:exists
(integer) 0
127.0.0.1:6379>

 

子串的处理

getrange可以获取指定偏移量内的子串.

setrange在设置偏移量后,start位置开始的子串被赋予为给定的值.

127.0.0.1:6379> help getrange

  GETRANGE key start end
  summary: Get a substring of the string stored at a key
  since: 2.4.0
  group: string

127.0.0.1:6379> help setrange

  SETRANGE key offset value
  summary: Overwrite part of a string at key starting at the specified offset
  since: 2.2.0
  group: string

127.0.0.1:6379> set rangekey '0range6key10'
OK
127.0.0.1:6379> strlen rangekey
(integer) 12
127.0.0.1:6379> getrange rangekey 0 6
"0range6"
127.0.0.1:6379> getrange rangekey 0 -1
"0range6key10"
127.0.0.1:6379> getrange rangekey 0 11
"0range6key10"
127.0.0.1:6379> setrange rangekey 7 setrange
(integer) 15
127.0.0.1:6379> get rangekey
"0range6setrange"
127.0.0.1:6379> setrange rangekey 7 get
(integer) 15
127.0.0.1:6379> get rangekey
"0range6getrange"