Redis 字符串
一个键和单独的一个值关联起来,被关联的键和值既可以是普通的文字数据,也可以是图片、视频、音频、压缩文件等更为复杂的二进制数据
Redis为字符串键提供了一系列操作命令:
为字符串键设置值
获取字符串键的值
在获取旧值的同时为字符串键设置新值
同时为多个字符串键设置值,或者同时获取多个字符串键的值
获取字符串值的长度
获取字符串值指定索引范围内的内容,或者对字符串值指定索引范围内的内容进行修改
将一些内容追加到字符串值的末尾
对字符串键存储的整数值或者浮点数值执行加法操作或减法操作
语法:SET key value
功能:为字符串键设置值
说明:键和值既可以是文字也可以是二进制数据,成功返回ok
实例1:创建出一个字符串键,它的键为"number",值为"10086"
127.0.0.1:6379> SET number "10086" OK
实例2:创建出一个键为"book",值为"The Designand Implementation of Redis"的字符串键
127.0.0.1:6379> SET book "The Design and Implementaion of Redis" OK
默认情况下,对一个已经设置了值的字符串键执行SET命令将导致键的旧值被新值覆盖。
127.0.0.1:6379> SET song_title "Get Wild" OK 127.0.0.1:6379> SET song_title "Running to Horizon" OK 127.0.0.1:6379> GET song_title "Running to Horizon"
Redis 2.6.12版本开始
用户可以通过向SET命令提供可选的NX选项或者XX选项来指示SET命令是否要覆盖一个已经存在的值
NX 选项表示:
在键没有值的情况下执行设置操作,并返回OK表示设置成功;
如果键已经存在,那么SET命令将放弃执行设置操作,并返回空值nil表示设置失败。
# 对没有值的password 设置值,成功 127.0.0.1:6379> SET password "123456" NX OK # 对已经有值的键设置,失败 127.0.0.1:6379> SET password "999999" NX (nil)
XX选项:
那么SET命令只会在键已经有值的情况下执行设置操作,并返回OK表示设置成功;
如果给定的键并没有值,那么SET命令将放弃执行设置操作,并返回空值表示设置失败。
语法:SET value [NX|XX]
功能:如果用户在执行SET命令时给定了NX选项,那么SET命令只会在键没有值的情况下执行设置操作,并返回OK表示设置成功
说明:如果键已经存在,那么SET命令将放弃执行设置操作,并返回空值nil表示设置失败
实例:
--没有值password键进行设置,成功
127.0.0.1:6379> SET password "123456" NX OK
-- password键已经有值,设置失败
127.0.0.1:6379> SET password "999999" NX (nil)
如果用户在执行SET命令时给定了XX选项,那么SET命令只会在键已经有值的情况下执行设置操作,并返回OK表示设置成功;
如果给定的键并没有值,那么SET命令将放弃执行设置操作,并返回空值表示设置失败。
-- 对一个没有值的键mongodb-homepage执行以下SET命令,那么命令将因为XX选项的作用而放弃执行设置操作
127.0.0.1:6379> SET mongodb-homepage "mongodb.com" XX (nil)
相反,如果我们对一个已经有值的键执行带有XX选项的SET命令,那么命令将使用新值去覆盖已有的旧值:
-- 为键mysql-homepage 设置一个值
127.0.0.1:6379> SET mysql-homepage "mysql.org" OK
-- 对键的值进行更新
127.0.0.1:6379> SET mysql-homepage "mysql.com" XX OK
第二条SET命令执行之后,mysql-homepage键的值将从原来的"mysql.org"更新为"mysql.com"
GET:获取字符串键的值
功能:使用GET命令从数据库中获取指定字符串键的值
语法:GET key
说明:GET命令接受一个字符串键作为参数,然后返回与该键相关联的值
实例:
127.0.0.1:6379> GET message "hello world" 127.0.0.1:6379> GET number "10086" 127.0.0.1:6379> GET homepage "redis.io"
说明:如果用户给定的字符串键在数据库中并没有与之相关联的值,那么GET命令将返回一个空值
127.0.0.1:6379> GET date (nil)
Redis的数据库要求所有键必须拥有与之相关联的值,所以如果一个键有值,那么我们就说这个键存在于数据库,反之。
GETSET:获取旧值并设置新值
功能:GETSET命令就像GET命令和SET命令的组合版本,GETSET首先获取字符串键目前已有的值,接着为键设置新值,最后把之前获取到的旧值返回给用户
语法:GETSET key new_value
实例:
-- number 键现在的值为10086
127.0.0.1:6379> GET number "10086"
-- 返回旧值
127.0.0.1:6379> GETSET number "12345" "10086"
-- number键的值已经被更新为12345
127.0.0.1:6379> GET number "12345"
如果被设置的键并不存在于数据库,那么GETSET命令将返回空值作为键的旧值
-- 键不存在
127.0.0.1:6379> GET counters (nil)
-- 返回空值作为旧值
127.0.0.1:6379> GETSET counters 60 (nil)
-- 查看键值
127.0.0.1:6379> GET counters "60"
MSET 一次为多个字符串键设置值
功能:除了SET命令和GETSET命令之外,Redis还提供了MSET命令用于对字符串键进行设置。
与SET命令和GETSET命令只能设置单个字符串键不同
MSET命令可以一次为多个字符串键设置值
语法: MSET key value [key value ...]
实例:
127.0.0.1:6379> MSET msg "hello world" num "1000" home "redis" OK 127.0.0.1:6379> GET msg "hello world" 127.0.0.1:6379> GET num "1000" 127.0.0.1:6379> GET home "redis"
说明:MSET命令也会在执行设置操作之后返回OK表示设置成功
如果给定的字符串键已经有相关联的值,那么MSET命令也会直接使用新值去覆盖已有的旧值。
执行多条SET命令需要客户端和服务器之间进行多次网络通信,并因此耗费大量的时间;而使用一条MSET命令去代替多条SET命令只需要一次网络通信,从而有效地减少程序执行多个设置操作时的时间。
MGET:一次获取多个字符串键的值
功能:MGET命令就是一个多键版本的GET命令,MGET接受一个或多个字符串键作为参数,并返回这些字符串键的值
语法:MGET key [key ...]
实例:使用一条MGET命令去获取message、number和homepage这3个键的值
127.0.0.1:6379> MGET message number homepage 1) "hello world" 2) "12345" 3) "redis.io"
--与GET命令一样,MGET命令在碰到不存在的键时也会返回空值
127.0.0.1:6379> MGET not-exists-key 1) (nil)
与MSET命令类似,MGET命令也可以将执行多个获取操作所需的网络通信次数从原来的N次降低至只需一次,从而有效地提高程序的运行效率
MSETNX:只在键不存在的情况下,一次为多个字符串键设置值
语法:MSETNX key value [key value ...]
功能:
MSETNX与MSET的主要区别在于,MSETNX只会在所有给定键都不存在的情况下对键进行设置,
而不会像MSET那样直接覆盖键已有的值:如果在给定键当中,即使有
一个键已经有值了,那么MSETNX命令也会放弃对所有给定键的设置操作。
MSETNX命令在成功执行设置操作时返回1,在放弃执行设置操作时则返回0。
--键k1 k2 k3 都不存在
127.0.0.1:6379> MGET k1 k2 k3 k4 1) (nil) 2) (nil) 3) (nil) 4) "hello world"
-- 键k4存在 所以MSETNX未能设置操作
127.0.0.1:6379> MSETNX ke "one" k2 "two" k3 "three" k4 "four" (integer) 0
-- 各个键的值没有变化
127.0.0.1:6379> MGET k1 k2 k3 k4 1) (nil) 2) (nil) 3) (nil) 4) "hello world"
STRLEN:获取字符串值的字节长度
功能:取得字符串键存储的值的字节长度
语法:STRLEN key
实例:
127.0.0.1:6379> GET number "12345"
-- number键的值长5字节
127.0.0.1:6379> STRLEN number (integer) 5 127.0.0.1:6379> GET message "hello world"
-- message 键的值长11字节
127.0.0.1:6379> STRLEN message (integer) 11 127.0.0.1:6379> GET book "The Design and Implementaion of Redis"
-- book键的值长38字节
127.0.0.1:6379> STRLEN book (integer) 37
对于不存在的键,STRLEN命令将返回0
127.0.0.1:6379> STRLEN not-exists-key (integer) 0
INCR、DECR :对整数值执行加1操作和减1操作
INCR key 加1
DECR key 减1
127.0.0.1:6379> SET counter 100 OK 127.0.0.1:6379> INCR counter (integer) 101 127.0.0.1:6379> INCR counter (integer) 102 127.0.0.1:6379> INCR counter (integer) 103 127.0.0.1:6379> DECR counter (integer) 102 127.0.0.1:6379> DECR counter (integer) 101
INCRBYFLOAT:对数字值执行浮点数加法操作
INCRBYFLOAT命令可以把一个浮点数增量加到字符串键存储的数字值上面,并返回键在执行加法操作之后的数字值作为命令的返回值。
INCRBYFLOAT key increment
一个存储浮点数值的键
127.0.0.1:6379> SET decimal 3.14 OK 127.0.0.1:6379> GET decimal "3.14" 将键decimal的值加上2.55 127.0.0.1:6379> INCRBYFLOAT decimal 2.55 "5.69" 127.0.0.1:6379> GET decimal "5.69"
字符串值的索引
字符串值的正数索引以0为开始,从字符串的开头向结尾不断递增
字符串值的负数索引以-1为开始,从字符串的结尾向开头不断递减
"hello world"的字符串,及其各个字节相对应的正数索引和负数索引
GETRANGE:获取字符串值指定索引范围上的内容
GETRANGE key start end
GETRANGE命令接受的是闭区间索引范围,也就是说,位于start索引和end索引上的值也会被包含在命令返回的内容当中
127.0.0.1:6379> SET message "abcdefghijglmn" OK 127.0.0.1:6379> GET message "abcdefghijglmn" 127.0.0.1:6379> GETRANGE message 0 4 # 获取字符串message上0到4的内容 也就是5个值 "abcde"
SETRANGE:对字符串值的指定索引范围进行设置
通过使用SETRANGE命令,用户可以将字符串键的值从索引index开始的部分替换为指定的新内容,被替换内容的长度取决于新内容的长度
SETRANGE key index substitute
返回字符串值当前的长度作为结果
127.0.0.1:6379> SET message "hello world" OK 127.0.0.1:6379> GET message "hello world" 127.0.0.1:6379> SETRANGE message 6 "Redis" (integer) 11 127.0.0.1:6379> GET message "hello Redis" 127.0.0.1:6379>
APPEND命令,用户可以将给定的内容追加到字符串键已有值的末尾
APPEND key suffix
APPEND命令在执行追加操作之后,会返回字符串值当前的长度作为命令的返回值。
127.0.0.1:6379> GET message "hello Redis" 127.0.0.1:6379> APPEND message "is a daabase" (integer) 23 127.0.0.1:6379> GET message "hello Redisis a daabase" 127.0.0.1:6379>