目录
3.2 GETDEL获取key的value,结束后删除key
3.3 GETEX获取key的value,并且重新创建约束时间。
3.6 MGET获取指定的key对应的values的list
前言
rendis官网提供了详细的操作文档,可以通过redis.cn学习使用方式以及应用场景。本文只列举一些常用的操作。
强烈推荐redis.cn官网的子连接网站:
1.strings类型的操作指令:http://redis.cn/commands/set.html
2.redis类型讲解,以及部分类型操作方法:http://redis.cn/topics/data-types-intro.html#strings。
3.内存计算器的工具类,帮助完成设计数据模型和技术选型:http://redis.cn/redis_memory/。
4.redis操作指令的补充:http://redis.cn/commands/
使用strings类型,在链接redis服务器之后可以通过“help @string”查看对应的操作指令。
strings的使用文档大致可以分为三类操作方式:string、数值和bitmap。
这篇博客主要讲解string类型的使用。
一、set相关操作
1.1 SET新增/更新数据方法
将键key设定为指定的“字符串”值。
如果 key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。
当set命令执行成功之后,之前设置的过期时间都将失效
返回值:
simple-string-reply:如果SET命令正常执行那么回返回OK,否则如果加了NX 或者 XX选项,但是没有设置条件。那么会返回nil。
关于过期时间:
EX:设置 key 在 n 秒后过期;
PX:设置 key 在 n 毫秒后过期;
EXAT:设置 key 在某个时间戳(精确到秒)之后过期;
PXAT:设置 key 在某个时间戳(精确到毫秒)之后过期;
新增/更新规则:
NX :只在键不存在时,才对键进行设置操作,只进行创建操作。 SET key value NX 效果等于SETNX key value 。使用场景:“多线程场景下,通过redis申请线程锁”。
XX :只在键已经存在时,才对键进行设置操作,约束只进行更新操作。
例子:
set k1 hello 新增或者更新“k1”数据为“hello”。
1.2 SETEX 约束过期时间
设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期。这个命令等效于执行下面的命令:"set key value EX seconds"。
例子:
set k1 10 hello 新增或者更新“k1”数据为“hello”,10秒之后过期。
等价于:
SET k1 hello
EXPIRE k1 10
1.3 SETNX 约束SET操作
更新数据。使用场景:“多线程场景下,通过redis申请线程锁”。
例子:
SETNX k1 hello 更新"k1"数据为“hello”。
1.4 MSET 批量操作
将key设置值为value,如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写。
返回值:
1 如果key被设置了
0 如果key没有被设置
例子:
mset k1 hello k2 world 新增/更新数据“k1:hello”、“k2 world”
1.5 MSETNX
对应给定的keys到他们相应的values上。只要有一个key已经存在,MSETNX一个操作都不会执行。 由于这种特性,MSETNX可以实现要么所有的操作都成功,要么一个都不执行,这样可以用来设置不同的key,来表示一个唯一的对象的不同字段。
MSETNX是原子的,所以所有给定的keys是一次性set的。客户端不可能看到这种一部分keys被更新而另外的没有改变的情况。
返回值:
1 如果所有的key被set
0 如果没有key被set(至少其中有一个key是存在的)
例子:
msetnx k3 zhangsan k4 lisi 新增数据,注意,如果key已经存在,新增会全部失败。
二、string类型value操作
2.1 STRLEN获取字符串长度
返回key的string类型value的长度。如果key对应的非string类型,就返回错误。
返回值:
key对应的字符串value的长度,或者0(key不存在)
2.2 APPEND 追加数据
如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。
返回值:
返回append后字符串值(value)的长度。。
例子:
append k1 world 在k1的value数据后边追加"world"。
2.3 SETRANGE 替换数据
这个命令的作用是覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度。如果offset比当前key对应string还要长,那这个string后面就补0以达到offset。不存在的keys被认为是空字符串,所以这个命令可以确保key有一个足够大的字符串,能在offset处设置value。
注意:
offset最大可以是229-1(536870911),因为redis字符串限制在512M大小。如果你需要超过这个大小,你可以用多个keys。
警告:
当set最后一个字节并且key还没有一个字符串value或者其value是个比较小的字符串时,Redis需要立即分配所有内存,这有可能会导致服务阻塞一会。在一台2010MacBook Pro上,set536870911字节(分配512MB)需要~300ms,set134217728字节(分配128MB)需要~80ms,set33554432比特位(分配32MB)需要~30ms,set8388608比特(分配8MB)需要8ms。注意,一旦第一次内存分配完,后面对同一个key调用SETRANGE就不会预先得到内存分配。
扩展:
正因为有了SETRANGE和类似功能的GETRANGE命令,你可以把Redis的字符串当成线性数组,随机访问只要O(1)复杂度。这在很多真实场景应用里非常快和高效。
返回值:
该命令修改后的字符串长度
2.4 STRALGO LCS算法
redis6.0.0之后提供的比较LCS算法。字详情参考链接:https://redis.io/commands/stralgo
官方文档给出的应用场景是,DNA序列的比较。大致用法包括:
1.比较两个value的值,输出相同字符。
STRALGO LCS STRINGS value1 value2 输出“value”
2.比较两个key的value值,输出相同字符。
MSET k1 value1 k2 value2
STRALGO LCS KEYS k1 k2 输出“value”
3.得到相同字符的个数,输出相同字符个数。
STRALGO LCS STRINGS value1 val112233 输出“4”
4.比较字符串,输出相同字符的下标。
5.比较字符串,输出相同字符串的下标,并且根据字符串长度约束,有选择输出。
下图例子,如果相同字符串长度<=2不输出响应结果。
6.比较字符串,输出相同字符串的下标,并且输出字符串长度。
三、get相关操作
3.1 GET获取key的value
返回key
的value
。如果key不存在,返回特殊值nil
。如果key
的value
不是string,就返回错误,因为GET
只处理string类型的values
。
返回值:
key对应的value,或者nil(key不存在时)
3.2 GETDEL获取key的value,结束后删除key
返回key
的value
。如果key不存在,返回特殊值nil
。
返回值:
key对应的value,或者nil(key不存在时)
3.3 GETEX获取key的value,并且重新创建约束时间。
如果key以有约束时间,执行GETEX操作约束时间会覆盖,以GETEX设置的过期时间为准。
例子:
GETEX k1 EX 60 获取k1,如果k1不存在,返回nil。存在重新为k1设置过期时间。
3.4 GETRANGE 获取约束范围内的数据
警告:
这个命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。 返回key对应的字符串value的子串,这个子串是由start和end位移决定的(两者都在string内)。可以用负的位移来表示从string尾部开始数的下标。所以-1就是最后一个字符,-2就是倒数第二个,以此类推。
这个函数处理超出范围的请求时,都把结果限制在string内。
3.5 GETSET返回旧值,赋予新值
自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。相当于“get key”+“set key value”。
应用场景:
GETSET可以和INCR(redis数值计算)一起使用实现支持重置的计数功能。举个例子:每当有事件发生的时候,一段程序都会调用INCR给key mycounter加1,但是有时我们需要获取计数器的值,并且自动将其重置为0。这可以通过GETSET mycounter “0”来实现。
3.6 MGET获取指定的key对应的values的list
返回所有指定的key的value。对于每个不对应string或者不存在的key,都返回特殊值nil
。正因为此,这个操作从来不会失败。
返回值:
指定的key对应的values的list