String(字符串)
redis 主要包含 5 种数据结构,string 是 redis 最基本的类型,最大能存储 512MB,一个 key 对应一个 value,string 可以包含任何数据,包括数字、jpg图片或者序列化的对象。
常用 redis string 命令
- set 命令:用于设置给定 key 的值,如果 key 已经存储其他值, set 就覆写旧值,且无视类型。
NX:not exist 不存在就存入,相当于数据库中的插入操作
XX:exist 存在就存入,相当于数据库中的更新操作
基本语法
127.0.0.1:6379> set key value [expiration EX seconds|PX milliseconds] [NX|XX]
// 对不存在的 key 进行设置 127.0.0.1:6379> set key "value" // 引号可不写 OK 127.0.0.1:6379> get key "value" // 对已存在的 key 进行设置 127.0.0.1:6379> set key "newvalue" OK 127.0.0.1:6379> get key "newvalue"
- mset 命令:multiple set, 用于同时设置一个或多个 key-value 对。
基本语法
redis 127.0.0.1:6379> mset key value [key value ...]
redis 127.0.0.1:6379> mset key1 "Hello" key2 "World" OK redis 127.0.0.1:6379> get key1 "Hello" redis 127.0.0.1:6379> get key2 "World"
- setex 命令:set expiration,为指定的 key 设置值及其过期时间,如果 key 已经存在, SETEX 命令将会替换旧的值,key 的过期时间为 seconds (以秒为单位)。
基本语法
redis 127.0.0.1:6379> setex key seconds value
redis 127.0.0.1:6379> setex mykey 60 redis OK redis 127.0.0.1:6379> ttl mykey 60 redis 127.0.0.1:6379> get mykey "redis"
- psetex 命令:以毫秒为单位设置 key 的生存时间。
基本语法
redis 127.0.0.1:6379> psetex key millisecond value
redis 127.0.0.1:6379> psetex mykey 1000 "Hello" OK redis 127.0.0.1:6379> pttl mykey // pttl 命令以毫秒为单位返回 key 的剩余过期时间 999 redis 127.0.0.1:6379> get mykey 1) "Hello"
- setnx 命令:set if not exists, 在指定的 key 不存在时,为 key 设置指定的值。
基本语法
redis 127.0.0.1:6379> setnx key value
redis> exists job // job 不存在 (integer) 0 redis> setnx job "programmer" // job 设置成功 (integer) 1 redis> setnx job "code-farmer" // 尝试覆盖 job ,失败 (integer) 0 redis> get job // 没有被覆盖 "programmer"
- msetnx 命令:用于所有给定 key 都不存在时,同时设置一个或多个 key-value 对,当所有 key 都成功设置,返回 1 ,如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。原子性:要么成功执行,要么失败完全不执行。
基本语法
redis 127.0.0.1:6379> msetnx key value [key value ...]
// 对不存在的 key 进行 msetnx redis> msetnx rmdbs "MySQL" nosql "MongoDB" key-value-store "redis" (integer) 1 redis> mget rmdbs nosql key-value-store 1) "MySQL" 2) "MongoDB" 3) "redis" // mset 的给定 key 当中有已存在的 key redis> msetnx rmdbs "Sqlite" language "python" # rmdbs 键已经存在,操作失败 (integer) 0 redis> exists language # 因为 mset 是原子性操作,language 没有被设置 (integer) 0 redis> get rmdbs # rmdbs 也没有被修改 "MySQL"
- setrange 命令:用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始,返回被修改后的字符串长度,偏移量 offset 正向 0 ~ n,反向-1 ~ -n。
基本语法
redis 127.0.0.1:6379> setrange key offset value
redis 127.0.0.1:6379> set name "Hello World" OK redis 127.0.0.1:6379> setrange name 6 "Redis" // 在设定的key为name的字符串的第 (integer) 11 redis 127.0.0.1:6379> GET key1 "Hello Redis"
- get 命令:用于获取指定 key 的值,如果 key 不存在,返回
nil
,如果key 储存的值不是字符串类型,返回一个错误。
基本语法
127.0.0.1:6379> get key
// 对不存在的 key 进行 get 127.0.0.1:6379> get new (nil) 127.0.0.1:6379> set new name OK 127.0.0.1:6379> get new "name" // 对不是字符串类型的 key 进行 get 127.0.0.1:6379> lpush inner java c js (integer) 3 127.0.0.1:6379> get inner (error) WRONGTYPE Operation against a key holding the wrong kind of value
- getrange 命令:用于获取存储在指定 key 中字符串的子字符串,字符串的截取范围由
start
和end
两个偏移量决定(包括 start 和 end 在内)。
基本语法
127.0.0.1:6379> getrange key start end
redis 127.0.0.1:6379> set mykey "This is my test key" OK redis 127.0.0.1:6379> getrange mykey 0 3 // 获取字符串的前四位 "This" redis 127.0.0.1:6379> getrange mykey 0 -1 // 获取整个字符串 "This is my test key"
- getset 命令:用于设置指定 key 的值,并返回 key 的旧值。
基本语法
redis 127.0.0.1:6379> getset key value
redis> getset mykey mongodb # 没有旧值,返回 nil (nil) redis> getset mykey "mongodb" redis> getset mykey redis # 返回旧值 mongodb "mongodb" redis> get mykey "redis"
- mget 命令:返回所有(一个或多个)给定 key 的值,返回一个包含所有给定 key 的值的列表,如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
基本语法
redis 127.0.0.1:6379> mget key [key ...]
redis 127.0.0.1:6379> set key1 "hello" OK redis 127.0.0.1:6379> set key2 "world" OK redis 127.0.0.1:6379> mget key1 key2 undefi_Key 1) "Hello" 2) "World" 3) (nil)
- strlen 命令:string length,用于获取指定 key 所储存的字符串长度,返回字符串长度,当 key 储存的不是字符串时,返回 0 。
基本语法
redis 127.0.0.1:6379> strlen key
redis> set mykey "Hello world" # 获取存在的字符串的长度 OK redis> strlen mykey (integer) 11 redis> strlen nonexisting # 不存在的 key 长度为 0 (integer) 0
- incr 命令:increase,将 key 中储存的数字值增 1,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作,如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
基本语法redis> set page_view 20 OK redis> incr page_view (integer) 21 redis> get page_view # 数字值在 Redis 中以字符串的形式保存 "21"
- incrby 命令:将 key 中储存的数字加上指定的增量值,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby 命令,如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
基本语法
redis 127.0.0.1:6379> incrby key increment
redis> set rank 50 // key 存在且是数字值 OK redis> incr rank 20 (integer) 70 redis> get rank "70" redis> exists counter // key 不存在时 (integer) 0 redis> incrby counter 30 (integer) 30 redis> get counter "30" redis> set book "long long ago..." // key 不是数字值时 OK redis> incrby book 200 (error) ERR value is not an integer or out of range
- incrbyfloat 命令:为 key 中所储存的值加上指定的浮点数增量值,如果 key 不存在,那么 incrbyfloat 会先将 key 的值设为 0 ,再执行加法操作。
基本语法
redis 127.0.0.1:6379> incrbyfloat key increment
# incrbyfloat 使用之后,再使用 incrby 会出现报错 redis> set mykey 30 OK redis> get mykey "30" redis> incrby mykey 20 (integer) 50 redis> get mykey "50" redis> incrbyfloat mykey 1.6 51.6 redis> get mykey "51.6" redis> incrby mykey 20 (error) ERR value is not an integer or out of range # err 报错 // 值和增量都不是指数符号 redis> set mykey 10.50 OK redis> incrbyfloat mykey 0.1 "10.6" // 值和增量都是指数符号 redis> set mykey 314e-2 OK redis> get mykey # set 设置的值可以是指数符号 "314e-2" redis> incrbyfloat mykey 0 # 但执行 incrbyfloat 之后格式会被改成非指数符号 "3.14" // 可以对整数类型执行 redis> set mykey 3 OK redis> incrbyfloat mykey 1.1 "4.1" // 后跟的 0 会被移除 redis> set mykey 3.0 OK redis> get mykey # set 设置的值小数部分可以是 0 "3.0" # incrbyfloat 会将无用的 0 忽略掉,有需要的话,将浮点变为整数 redis> incrbyflaot mykey 1.000000000000000000000 "4" redis> get mykey "4"
- decr 命令:decrease, 将 key 中储存的数字值减 1 ,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 操作,如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
基本语法
redis 127.0.0.1:6379> decr key
# decr 命令对存在的数字值 key 进行操作 redis> set failure_times 10 OK redis> decr failure_times (integer) 9 # 对不存在的 key 值进行 decr redis> exists count (integer) 0 redis> decr count (integer) -1 # 对存在但不是数值的 key 进行 decr redis> set company YOUR_CODE_SUCKS.LLC OK redis> decr company (error) ERR value is not an integer or out of range
- decrby 命令:将 key 所储存的值减去指定的减量值,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作,如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
基本语法
redis 127.0.0.1:6379> decrby key increment
// 对已存在的 key 进行 decrby redis> set count 100 OK redis> decrby count 20 (integer) 80 // 对不存在的 key 进行 decrby redis> exists pages (integer) 0 redis> decrby pages 10 (integer) -10
- append 命令:用于为指定的 key 追加值,如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾,如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。追加指定值之后, key 中字符串的长度。
基本语法
redis 127.0.0.1:6379> append key value
// 对不存在的 key 执行 append redis> exists myphone # 确保 myphone 不存在 (integer) 0 redis> append myphone "nokia" # 对不存在的 key 进行 APPEND ,等同于 set myphone "nokia" (integer) 5 # 字符长度 // 对已存在的字符串进行 APPEND redis> append myphone " - 1110" # 长度从 5 个字符增加到 12 个字符 (integer) 12 redis> get myphone "nokia - 1110"