3、返回key所存储value的数据结构类型
type
4、删除指定key
DELkey[key...](1)如果删除中的某些key不存在,则直接忽略
(2)返回被删除key的数量
5、非阻塞删除指定key
unlink
(2)如果删除中的某些key不存在,则直接忽略
(3)返回被删除key的数量
ttl
(2)如果key不存在,或者已过期,返回-2
8、切换数据库
select
dbsize10、清空当前库
flushdb11、清空全部库
flushall
Key结构
1、Redis没有类似MySQL中的Table概念
2、可以通过给key添加前缀,加以区分
3、前缀规范
(1)Redis的key允许有多个单词形成层级结构,多个单词之间用:隔开
(2)格式
项目名:业务名:类型:id(3)并非固定格式,可以根据需求来删除或添加词条
(4)把不同类型的数据区分开,避免key冲突问题
4、如果value是一个Java对象,则可以将对象序列化为JSON字符串后存储
Redis字符串
1、String
2、是value最基本的类型
3、根据字符串的格式不同,分为3类
(1)string:普通字符串
(2)int:整数类型,可以做自增、自减操作
(3)float:浮点类型,可以做自增、自减操作
(4)不管是何种格式,底层都以字节数组形式存储,只不过是编码方式不同,字符串类型的最大空间不能超过512MB
4、二进制安全
(1)Redis的String可以包含任何数据
(2)如:图片、序列化对象
5、将key设定为指定String类型的value
(3)NX:只有key不存在时,才会设置key值,即只添加不更新
(4)XX–只有key存在时,才会设置key值,即只更新不添加
(5)由于SET命令加上选项,已经可以完全取代SETNX、SETEX、PSETEX功能,所以在将来的版本中,redis可能会不推荐使用,并且最终抛弃这几个命令
(6)如果SET命令正常执行,那么回返回OK
(7)否则如果加NX或XX,但是没有设置条件,那么会返回nil
6、返回key的value
GETkey(1)如果key不存在,返回特殊值nil
(2)如果key的value不是String,就返回错误,因为GET只处理String类型的value
7、如果key已经存在,并且值为字符串,那么这个命令会把value,追加到原来值(value)的结尾
APPENDkeyvalue(1)返回append后,字符串值(value)的长度
(2)如果key不存在,那么它将首先创建一个空字符串key,再执行追加操作,这种情况APPEND将类似于SET操作
8、返回key的String类型value长度
STRLENkey(1)如果key对应非String类型,就返回错误
(2)key不存在,返回0
9、对存储在指定key的数值,执行原子的加1操作
INCRkey(1)如果指定key不存在,那么在执行incr操作之前,会先将它的值设定为0
(2)如果指定key中存储的值,不是字符串类型,或者存储的字符串类型不能表示为一个整数,那么执行这个命令时,服务器会返回一个错误(eq:(error)ERRvalueisnotanintegeroroutofrange)
(3)这个操作仅限于64位的有符号整型数据
(4)注意:由于Redis并没有一个明确类型,来表示整型数据,所以这个操作是一个字符串操作
(5)执行这个操作时,key对应存储的字符串,被解析为10进制的64位有符号整型数据
(6)事实上,Redis内部采用整数形式(Integerrepresentation),来存储对应的整数值,所以对该类字符串值,实际上是用整数保存,也就不存在存储整数的字符串表示(Stringrepresentation)所带来的额外消耗
(7)返回执行递增操作后key对应的值
10、对key对应的数字做减1操作
DECRkey(1)如果key不存在,那么在操作之前,这个key对应value被置为0
(2)如果key有一个错误类型的value,或者是一个不能表示成数字的字符串,就返回错误
(3)这个操作最大支持在64位有符号的整型数字
(4)返回减小之后的value
11、将key对应的数字,加decrement
INCRBYkeyincrement(1)如果key不存在,操作之前,key就会被置为0
(2)如果key的value类型错误,或是个不能表示成数字的字符串,就返回错误
(3)这个操作最多支持64位有符号的整型数字
(4)返回增加之后的value
12、将key对应的数字,减decrement
DECRBYkeydecrement(1)如果key不存在,操作之前,key就会被置为0
(2)如果key的value类型错误,或是不能表示成数字的字符串,就返回错误
(4)返回减少之后的value
13、原子性
(1)原子操作:不会被线程调度机制打断的操作
(2)这种操作一旦开始,就一直运行到结束,中间不会有任何上下文切换(切换到另一个线程)
(3)在单线程中,能够在单条指令中完成的操作,都可以认为是原子操作,因为中断只能发生于指令之间
(4)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作
(5)Redis单命令的原子性,是由于Redis的单线程
14、添加新的key-value,或新的value替换已经存在的value,如SET命令一样
MSETkeyvalue[keyvalue...](1)MSET是原子操作,所以所有给定的keys是一次性set的
(2)客户端不可能看到,一部分keys被更新,而另外的没有改变的情况
(3)总是返回OK,因为MSET不会失败
15、返回所有指定的key的value
MGETkey[key...](1)对于每个不对应String,或者不存在的key,都返回特殊值nil,所以这个操作从来不会失败
(2)返回指定的key,对应的values的list
16、只添加新的key-value
MSETNXkeyvalue[keyvalue...](1)只要有一个key已经存在,MSETNX一个操作都不会执行
(2)MSETNX可以实现要么所有的操作都成功,要么一个都不执行,可以用来设置不同key,来表示一个唯一的对象的不同字段
(3)MSETNX为原子操作,所有给定的key是一次性set,客户端不可能看到这种一部分key被更新,而另外的没有改变的情况
(4)如果所有key被set,则返回1
(5)如果没有key被se((至少其中存在一个key),返回0
17、返回key对应的字符串value的子串
GETRANGEkeystartend(1)子串由start、end位移决定,两者都在string内,即闭区间
(2)负的位移表示从string尾部开始数的下标,-1为最后一个字符,-2倒数第二个字符,以此类推
(3)这个函数处理超出范围的请求时,都把结果限制在string内
18、覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度
SETRANGEkeyoffsetvalue(1)如果offset比当前key对应string还要长,那这个string后面就补0,以达到offset
(2)不存在的key被认为是空字符串,所以这个命令可以确保key有一个足够大的字符串,能在offset处设置value
(3)offset最大可以是229-1(536870911),因为redis字符串限制在512M大小,如果需要超过这个大小,可以使用多个key
SETEXkeysecondsvalue(1)SETEX为原子操作
(2)等价于
SETmykeyvalueEXPIREmykeyseconds(3)可以通过把上面两个命令放到MULTI/EXEC块中执行的方式重现
(4)相比连续执行上面两个命令,它更快,因为当Redis做缓存使用时,这个操作更加常用
20、更新key对应value,并且返回原value
GETSETkeyvalue(1)如果key存在,但是对应的value不是字符串,就返回错误
(2)如果key不存在,将返回nil
21、数据结构
(1)SDS:SimpleDynamicString
(2)简单动态字符串,可以修改的字符串
(3)内部结构实现上类似Java的ArrayList,采用预分配冗余空间的方式,来减少内存的频繁分配
(4)内部为当前字符串实际分配的空间capacity,一般要高于实际字符串长度len
(5)当字符串长度小于1M时,扩容都是加倍现有的空间
(6)如果超过1M,扩容时,一次只会扩1M空间
(7)需要注意的是字符串最大长度为512M
Redis列表
1、List
2、单键多值
3、Redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或尾部(右边)
4、底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
5、将所有指定value,插入到存于key的列表的头部
LPUSHkeyvalue[value...](1)如果key不存在,那么在进行push操作前,会创建一个空列表
(2)如果key对应的值不是一个list的话,那么会返回一个错误
(3)可以使用一个命令把多个元素push进入列表,只需在命令末尾加上多个指定value
(4)元素是从最左端的到最右端的、一个接一个被插入到list的头部,例:LPUSHmylistabc,返回的列表是c为第一个元素,b为第二个元素,a为第三个元素
(5)返回在push操作后的list长度
6、向存于key的列表的尾部,插入所有指定value
RPUSHkeyvalue[value...](1)如果key不存在,那么会创建一个空的列表,然后再进行push操作
(2)当key保存的不是一个列表,那么会返回一个错误
(3)可以使用一个命令把多个元素压入队列,只需要在命令后面指定多个参数
(4)元素是从左到右、一个接一个从列表尾部插入,例:RPUSHmylistabc,列表第一个元素是a,第二个元素是b,第三个元素是c
(5)返回在push操作后的列表长度
7、移除并且返回key对应的list的第一个元素
LPOPkey(1)当key不存在时,返回nil
8、移除并返回存于key的list的最后一个元素
RPOPkey(1)当key不存在的时,返回nil
9、原子性地返回并移除存储在source的列表的最后一个元素(列表尾部元素),并把该元素放入存储在destination的列表的第一个元素位置(列表头部)
RPOPLPUSHsourcedestination(1)如果source不存在,那么会返回nil值,并且不会执行任何操作
(2)如果source和destination是同样的,那么这个操作等同于移除列表最后一个元素,并且把该元素放在列表头部,所以这个命令也可以当作是一个旋转列表的命令
(3)返回被移除和放入的元素
10、返回存储在key的列表里,指定范围内的元素
LRANGEkeystartstop(1)start和end偏移量都是基于0的下标,即list第一个元素下标是0(list的表头),第二个元素下标是1,以此类推
(2)偏移量也可以是负数,表示偏移量是从list尾部开始计数,例如,-1表示列表的最后一个元素,-2是倒数第二个,以此类推
(3)当下标超过list范围时,不会产生error
(4)如果start比list尾部下标大时,会返回一个空列表
(5)如果stop比list实际尾部大时,Redis会当它是最后一个元素的下标
11、返回索引index存储在key的列表的元素
LINDEXkeyindex(1)下标是从0开始索引的,所以0是表示第一个元素,1表示第二个元素,并以此类推
(2)负数索引用于指定从列表尾部开始索引的元素,-1表示最后一个元素,-2表示倒数第二个元素,并以此往前推
(3)当key的value不是一个列表时,会返回一个error
(4)当index超过范围时,返回nil
12、返回存储在key里的list的长度
LLENkey(1)如果key不存在,那么就被看作是空list,并且返回长度为0
(2)当存储在key里的值不是一个list,会返回error
13、把value插入存于key的列表中在基准值pivot的前面或后面
LINSERTkeyBEFORE|AFTERpivotvalue(1)当key不存在时,这个list会被看作是空list,任何操作都不会发生
(2)当key存在,但保存的不是一个list时,会返回error
(3)返回经过插入操作后的list长度
(4)当pivot值找不到时,返回-1
14、从存于key的列表里移除前count次出现的值为value的元素
LREMkeycountvalue(1)count>0:从头往尾移除值为value的元素
(2)count<0:从尾往头移除值为value的元素
(3)count=0:移除所有值为value的元素
(4)所以当key不存在时,当作空list处理,这个命令会返回0
(6)返回被移除的元素个数
15、设置index位置的list元素的值为value
LSETkeyindexvalue(1)当index超出范围时,会返回一个error
16、数据结构
(1)quickList:快速链表
(2)首先在列表元素较少的情况下,会使用一块连续的内存存储,结构为ziplist,即压缩列表
(3)ziplist将所有的元素紧挨着一起存储,分配的是一块连续的内存
(4)当数据量比较多时,改成quicklist
(5)因为普通的链表需要的附加指针空间太大,会比较浪费空间
(6)Redis将链表和ziplist结合,组成quicklist,即将多个ziplist使用双向指针串起来使用,既满足快速的插入删除性能,又不会出现太大的空间冗余
Redis集合
1、Set
2、与list类似,提供一个列表的功能,但set可以自动排重,并且提供判断某个成员是否在一个set集合内的重要接口
3、Redis的Set是string类型的无序集合
(1)底层:一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)
4、添加一个或多个指定的member元素到key的set中
SADDkeymember[member...](1)指定的一个或多个元素member,如果已经在集合key中存在,则忽略
(2)如果集合key不存在,则新建集合key,并添加member元素到set中
(3)如果key的类型不是set,则返回错误
(4)返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素
5、返回key集合所有的元素
SMEMBERSkey(1)该命令的作用,与使用一个参数的SINTER命令作用相同
6、查看成员member,是否是存储的集合key的成员
SISMEMBERkeymember(1)如果member元素是集合key的成员,则返回1
(2)如果member元素不是key的成员,或者集合key不存在,则返回0
7、返回集合存储的key的基数(集合元素的数量)
SCARDkey(1)如果key不存在,则返回0
8、移除key集合中指定元素
SREMkeymember[member...](1)如果指定的元素不是key集合中的元素,则忽略
(2)如果key集合不存在,则被视为一个空的集合,该命令返回0
(3)如果key的类型不是一个集合,则返回错误
(4)返回从集合中移除元素的个数,不包括不存在的成员
9、从存储在key的集合中,移除并返回一个或多个随机元素
SPOPkey[count](1)此操作与SRANDMEMBER类似,从一个集合中返回一个或多个随机元素,但不删除元素
(2)count参数将在更高版本中提供,但是在2.6、2.8、3.0中不可用
(3)返回被删除的元素
(4)当key不存在时,返回nil
10、仅提供key参数,那么随机返回key集合中的一个元素
SRANDMEMBERkey[count](1)Redis2.6开始,可以接受count参数
(2)如果count是整数,且小于元素的个数,返回含有count个不同的元素的数组
(3)如果count是整数,且大于集合中元素的个数时,仅返回整个集合的所有元素
(4)当count是负数,则会返回一个包含count的绝对值的个数元素的数组
(5)如果count绝对值大于元素的个数,则返回的结果集里,会出现一个元素出现多次的情况
(6)仅提供key参数时,该命令作用类似于SPOP,SPOP将被选择的随机元素从集合中移除,而SRANDMEMBER仅仅是返回该随记元素,而不做任何操作
(7)不使用count参数的情况下,该命令返回随机的元素,如果key不存在,则返回nil
(8)使用count参数,则返回一个随机的元素数组,如果key不存在,则返回一个空的数组
11、将member从source集合,移动到destination集合中
(2)如果source集合不存在,或者不包含指定的元素,smove不执行任何操作,并且返回0,否则对象将会从source集合中移除,并添加到destination集合中
(3)如果destination集合已经存在该元素,则smove仅将该元素从source集合中移除
(4)如果source和destination不是集合类型,则返回错误
(5)如果该元素成功移除,返回1
(6)如果该元素不是source集合成员,无任何操作,则返回0
12、返回指定所有的集合的成员的交集
SINTERkey[key...](1)如果key不存在,则被认为是一个空的集合
(2)当给定的集合为空时,结果也为空(一个集合为空,结果一直为空)
13、返回给定的多个集合的并集中的所有成员
SUNIONkey[key...](1)不存在的key,可以认为是空的集合
14、返回一个集合与给定集合的差集的元素
SDIFFkey[key...](1)不存在的key,认为是空集
15、数据结构
(1)dict字典,字典使用哈希表实现
(2)Java中HashSet使用HashMap实现,只不过所有value都指向同一个对象
(3)Redis的set内部使用hash结构,所有value都指向同一个内部值
Redis哈希
1、Hash
2、一个键值对集合
3、一个string类型的field和value的映射表
4、适合存储对象
5、类似Java的Map
6、设置key指定的哈希集中指定field的value
HSETkeyfieldvalue(1)如果key指定的哈希集不存在,会创建一个新的哈希集并与key关联
(2)如果field在哈希集中存在,它将被重写
(3)如果field是一个新的字段,返回1
(4)如果field在map中已经存在,返回0
7、返回key指定的哈希集中该fiel所关联的value
HGETkeyfield(1)当filed不存在,或key不存在时,返回nil
8、设置key指定的哈希集中指定字段的值
HMSETkeyfieldvalue[fieldvalue...](1)该命令将重写所有在哈希集中存在的字段
(2)如果key指定的哈希集不存在,会创建一个新的哈希集并与key关联
9、检查hash里面field是否存在
HEXISTSkeyfield(1)hash里面包含该field,返回1
(2)hash里面不包含该field,或key不存在,返回0
10、返回key指定的哈希集中所有字段(列表)
HKEYSkey(1)当key指定的哈希集不存在时,返回空列表
11、返回key指定的哈希集中所有字段的值(列表)
HVALSkey(1)当key指定的哈希集不存在时,返回空列表
12、增加key指定的哈希集中指定字段的数值
HINCRBYkeyfieldincrement(1)如果key不存在,会创建一个新的哈希集并与key关联
(2)如果字段不存在,则字段的值在该操作执行前被设置为0
(3)HINCRBY支持的值的范围限定在64位有符号整数
(4)返回增值操作执行后的该字段的值
13、只在key指定的哈希集中不存在指定的字段时,设置字段的值
HSETNXkeyfieldvalue(1)如果key指定的哈希集不存在,会创建一个新的哈希集并与key关联
(2)如果字段已存在,该操作无效果
(3)如果字段是个新的字段,并成功赋值,返回1
(4)如果哈希集中已存在该字段,没有操作被执行,返回0
14、数据结构
(1)Hash类型对应的两种数据结构:ziplist(压缩列表),hashtable(哈希表)
(2)当field-value长度较短,且个数较少时,使用ziplist,否则使用hashtable
Redis有序集合
1、Zset(sortedset)
2、Zset、Set
(1)相同:一个没有重复元素的字符串集合
(2)不同:有序集合的每个成员都关联一个评分(score),评分被用来按照从最低分到最高分的方式,排序集合中的成员,集合的成员是唯一的,但是评分可以重复
3、元素有序
(1)可以很快的根据评分(score)或者次序(position),来获取一个范围的元素
(2)访问有序集合的中间元素非常快,因此能够使用有序集合,作为一个没有重复成员的智能列表
4、将所有指定成员添加到键为key有序集合(sortedset)中
ZADDkey[NX|XX][CH][INCR]scoremember[scoremember...](1)添加时,可以指定多个分数/成员(score/member)对
(2)如果指定添加的成员,已经是有序集合里面的成员,则会更新改成员的分数(scrore),并更新到正确的排序位置
(3)如果key不存在,将会创建一个新的有序集合(sortedset),并将分数/成员(score/member)对,添加到有序集合,就像原来存在一个空的有序集合一样
(4)如果key存在,但是类型不是有序集合,将会返回一个错误应答
(5)分数值是一个双精度的浮点型数字字符串
(6)+inf、-inf都是有效值
(7)XX:仅仅更新存在的成员,不添加新成员
(8)NX:不更新存在的成员,只添加新成员
(9)CH:修改返回值为发生变化的成员总数,原始返回新添加成员的总数(CH为changed的意思),更改的元素指新添加的成员、已经存在的成员更新分数,所以在命令中指定的成员有相同的分数将不被计算在内
(10)INCR:当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作
(11)分数可以精确的表示的整数的范围,Redis有序集合的分数使用双精度64位浮点数,表示为一个IEEE754floatingpointnumber,包括的整数范围:-253到+253
(12)更大的整数在内部用指数形式表示,所以,如果为分数设置一个非常大的整数,得到的是一个近似的十进制数
(13)有序集合按照分数以递增的方式进行排序,排序位置会随着分数变化而改变
(14)相同的成员(member)只存在一次,有序集合不允许存在重复的成员
(15)有序集合里面的成员都是唯一的,但不同成员间有可能有相同的分数
(16)当多个成员有相同的分数时,他们将是有序的字典(orderedlexicographically),仍由分数作为第一排序条件,然后,相同分数的成员按照字典规则相对排序
(17)字典顺序排序用的是二进制,它比较的是字符串的字节数组
(18)返回添加到有序集合的成员数量,不包括已经存在更新分数的成员
(19)如果指定INCR,返回成员的新分数(双精度的浮点型数字)字符串
5、返回存储在key有序集合中的指定范围的元素的列表
ZRANGEkeystartstop[WITHSCORES](1)返回的元素可以认为是按得分从最低到最高排列
(2)如果得分相同,将按字典排序
(3)start、stop都是以0为起始索引,可以是负数,表示从有序集合的末尾的偏移量,其中-1是有序集合的最后一个元素,-2是倒数第二个元素
(4)start、stop都是闭区间
(5)超出范围的索引不会产生错误,如果start大于有序集合中的最大索引,或start>stop,将会返回一个空列表;如果stop大于有序集合的末尾,Redis会将其视为有序集合的最后一个元素
(6)可以传递WITHSCORES选项,以便将元素的分数与元素一起返回,返回的列表将包含value1,score1,...,valueN,scoreN
(7)客户端类库可以自由地返回更合适的数据类型,建议:具有值和得分的数组或记录
6、返回key的有序集合中,分数在min和max之间的所有元素的列表(包括分数等于max或min的元素)
ZRANGEBYSCOREkeyminmax[WITHSCORES][LIMIToffsetcount](1)元素被认为是从低分到高分排序
(2)具有相同分数的元素按字典序排列(根据redis对有序集合实现的情况而定,并不需要进一步计算)
(3)可选LIMIT指定返回结果的数量及区间(类似SQL中SELECTLIMIToffset,count),注意,如果offset太大,定位offset就可能遍历整个有序集合,这会增加O(N)复杂度
(4)可选参数WITHSCORES会返回元素和其分数,而不只是元素
(5)min和max可以是-inf和+inf,可以在不知道有序集的最低和最高score值的情况下,使用ZRANGEBYSCORE
(6)默认情况下,区间的取值使用闭区间,可以通过给参数前增加(符号,使用可选的开区间(小于或大于)
7、返回有序集合中指定分数区间内的成员的列表,分数由高到低排序
ZREVRANGEBYSCOREkeymaxmin[WITHSCORES][LIMIToffsetcount]指令是否必须说明ZREVRANGEBYSCORE是指令key是有序集合键名称max是最大分数值,可使用"+inf"代替min是最小分数值,可使用"-inf"代替WITHSCORES否将成员分数一并返回LIMIT否返回结果是否分页,指令中包含LIMIT后offset、count必须输入offset否返回结果起始位置count否返回结果数量(1)max、min前可以加(符号作为开头,表示小于,(符号与成员之间不能有空格
(2)可以使用+inf、-inf表示得分最大值、最小值
(3)max、min不能相反,max在后,min在前,会导致返回结果为空
(4)计算成员之间的成员数量不加(符号时,参数min和max的位置也计算在内
(5)ZREVRANGEBYSCORE集合中按得分从高到底排序,所以max在前面,min在后面;ZRANGEBYSCORE集合中按得分从底到高排序,所以min在前面,max在后面
8、为key有序集的成员member的score值,加上增量increment
ZINCRBYkeyincrementmember(1)如果key中不存在member,就在key中添加一个member,score是increment
(2)如果key不存在,就创建一个只含有指定member成员的有序集合
(3)当key不是有序集类型时,返回一个错误
(4)score值必须是字符串表示的整数值或双精度浮点数,并且能接受double精度的浮点数
(5)返回member新score值,以字符串形式表示
9、返回从有序集合中删除的成员个数,不包括不存在的成员
ZREMkeymember[member...](1)当key存在,但是其不是有序集合类型,就返回一个错误
10、返回key有序集中,score值在min和max之间(默认包括score值等于min或max)成员个数
ZCOUNTkeyminmax11、返回key有序集中成员member的排名
ZRANKkeymember(1)其中有序集成员按score值递增(从小到大)顺序排列
(2)排名以0为底,score值最小的成员排名为0
(3)使用ZREVRANK命令,可以获得成员按score值递减(从大到小)排列的排名
(4)如果member是有序集key的成员,返回member排名
(5)如果member不是有序集key的成员,返回nil
12、数据结构
(1)hash:关联元素value、权重score,保障元素value的唯一性,可以通过元素value找到相应score值
(2)跳跃表:给元素value排序,根据score范围获取元素列表