Redis String 类型
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"