Redis基本类型
redis一共分为5中基本数据类型:String,Hash,List,Set,ZSet
1、字符串(string)
字符串类型是Redis中最为基础的数据存储类型,在Redis中是二进制安全的,该类型可以接受任何格式的数据。
相关命令:
GET key
获取指定Key的Value。如果与该Key关联的Value不是string类型,Redis将返回错误信息,因为GET命令只能用于获取string Value。
与该Key相关的Value,如果该Key不存在,返回nil。
SET key value
设定该Key持有指定的字符串Value,如果该Key已经存在,则覆盖其原有值。 总是返回"OK"。
DECR key
将指定Key的Value原子性的递减1。如果该Key不存在,其初始值为0,在decr之后其值为-1。
如果Value的值不能转换为整型值,如abc,该操作将执行失败并返回相应的错误信息。
INCR key
将指定Key的Value原子性的递增1。如果该Key不存在,其初始值为0,在incr之后其值为1。
如果Value的值不能转换为整型值,如abc,该操作将执行失败并返回相应的错误信息。
APPEND key value
如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾。
如果该Key不存在,APPEND命令将会创建一个新的Key/Value。 追加后Value的长度。
DECRBY key decrement
将指定Key的Value原子性的减少decrement。
如果该Key不存在,其初始值为0,在decrby之后其值为-decrement。
如果Value的值不能转换为整型值,如abc,该操作将执行失败并返回相应的错误信息。
INCRBY key increment
将指定Key的Value原子性的增加increment。如果该Key不存在,其初始值为0,
在incrby之后其值为increment。如果Value的值不能转换为整型值,如abc,
该操作将执行失败并返回相应的错误信息。
GETSET key value
原子性的设置该Key为指定的Value,同时返回该Key的原有值。
和GET命令一样,该命令也只能处理string Value,否则Redis将给出相关的错误信息。
返回该Key的原有值,如果该Key之前并不存在,则返回nil。
STRLEN key
返回指定Key的字符值长度,如果Value不是string类型,Redis将执行失败并给出相关的错误信息。
返回指定Key的Value字符长度,如果该Key不存在,返回0。
SETEX key seconds value
原子性完成两个操作,一是设置该Key的值为指定字符串,同时设置该Key在Redis服务器中的存活时间(秒数)。
该命令主要应用于Redis被当做Cache服务器使用时。
SETNX key value
如果指定的Key不存在,则设定该Key持有指定字符串Value,此时其效果等价于SET命令。
相反,如果该Key已经存在,该命令将不做任何操作并返回。 1表示设置成功,否则0。
SETRANGE key offset value
替换指定Key的部分字符串值。从offset开始,替换的长度为该命令第三个参数value的字符串长度,
其中如果offset的值大于该Key的原有值Value的字符串长度,Redis将会在Value的后面补齐(offset - strlen(value))数量的0x00,
之后再追加新值。如果该键不存在,该命令会将其原值的长度假设为0,并在其后添补offset个0x00后再追加新值。
鉴于字符串Value的最大长度为512M,因此offset的最大值为536870911。
最后需要注意的是,如果该命令在执行时致使指定Key的原有值长度增加,
这将会导致Redis重新分配足够的内存以容纳替换后的全部字符串,因此就会带来一定的性能折损。
修改后的字符串Value长度。
GETRANGE key start end
如果截取的字符串长度很短,我们可以该命令的时间复杂度视为O(1),否则就是O(N),
这里N表示截取的子字符串长度。该命令在截取子字符串时,将以闭区间的方式同时包含start(0表示第一个字符)和end所在的字符,
如果end值超过Value的字符长度,该命令将只是截取从start开始之后所有的字符数据。 子字符串
SETBIT key offset value
设置在指定Offset上BIT的值,该值只能为1或0,在设定后该命令返回该Offset上原有的BIT值。
如果指定Key不存在,该命令将创建一个新值,并在指定的Offset上设定参数中的BIT值。
如果Offset大于Value的字符长度,Redis将拉长Value值并在指定Offset上设置参数中的BIT值,中间添加的BIT值为0。
最后需要说明的是Offset值必须大于0。 在指定Offset上的BIT原有值。
GETBIT key offset
返回在指定Offset上BIT的值,0或1。如果Offset超过string value的长度,该命令将返回0,
所以对于空字符串始终返回0。 在指定Offset上的BIT值。
MGET key [key ...]
N表示获取Key的数量。返回所有指定Keys的Values,如果其中某个Key不存在,或者其值不为string类型,该Key的Value将返回nil。
返回一组指定Keys的Values的列表。
MSET key value [key value ...]
N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SET命令。
该命令不会失败,始终返回OK。
MSETNX key value [key value ...]
N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,
其具体行为可以看成是多次迭代执行SETNX命令。然而这里需要明确说明的是,
如果在这一批Keys中有任意一个Key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。
1表示所有Keys都设置成功,0则表示没有任何Key被修改。
2、字符串链表(List)
在Redis中,List类型是按照插入顺序排序的字符串链表。
和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。
在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。
与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,
即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。
然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。
相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
相关命令:
LPUSH key value [value ...]
在指定Key所关联的List Value的头部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的 头部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。 返回插入后链表中元素的数量。
LPUSHX key value
仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的头部插入参数中给出的Value,否则将不会有任何操作发生。 返回插入后链表中元素的数量。
LRANGE key start stop
时间复杂度中的S为start参数表示的偏移量,N表示元素的数量。该命令的参数start和end都是0-based。即0表示链表头部(leftmost)的第一个元素。其中start的值也可 以为负值,-1将表示链表中的最后一个元素,即尾部元素,-2表示倒数第二个并以此类推。该命令在获取元素时,start和end位置上的元素也会被取出。如果start的值 大于链表中元素的数量,空链表将会被返回。如果end的值大于元素的数量,该命令则获取从start(包括start)开始,链表中剩余的所有元素。 返回指定范围内元素的列 表。
LPOP key
返回并弹出指定Key关联的链表中的第一个元素,即头部元素,。如果该Key不存,返回nil。 链表头部的元素。
LLEN key
返回指定Key关联的链表中元素的数量,如果该Key不存在,则返回0。如果与该Key关联的Value的类型不是链表,则返回相关的错误信息。 链表中元素的数量。
LREM key count value
时间复杂度中N表示链表中元素的数量。在指定Key关联的链表中,删除前count个值等于value的元素。如果count大于0,从头向尾遍历并删除,如果count小于0,则 从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。如果指定的Key不存在,则直接返回0。 返回被删除的元素数量。
LSET key index value
时间复杂度中N表示链表中元素的数量。但是设定头部或尾部的元素时,其时间复杂度为O(1)。设定链表中指定位置的值为新值,其中0表示第一个元素,即头部元 素,-1表示尾部元素。如果索引值Index超出了链表中元素的数量范围,该命令将返回相关的错误信息。
LINDEX key index
时间复杂度中N表示在找到该元素时需要遍历的元素数量。对于头部或尾部元素,其时间复杂度为O(1)。该命令将返回链表中指定位置(index)的元素,index是0- based,表示头部元素,如果index为-1,表示尾部元素。如果与该Key关联的不是链表,该命令将返回相关的错误信息。 返回请求的元素,如果index超出范围,则 返回nil。
LTRIM key start stop
N表示被删除的元素数量。该命令将仅保留指定范围内的元素,从而保证链接中的元素数量相对恒定。start和stop参数都是0-based,0表示头部元素。和其他命令一 样,start和stop也可以为负值,-1表示尾部元素。如果start大于链表的尾部,或start大于stop,该命令不错报错,而是返回一个空的链表,与此同时该Key也将被删 除。如果stop大于元素的数量,则保留从start开始剩余的所有元素。
LINSERT key BEFORE|AFTER pivot value
时间复杂度中N表示在找到该元素pivot之前需要遍历的元素数量。这样意味着如果pivot位于链表的头部或尾部时,该命令的时间复杂度为O(1)。该命令的功能是在pivot 元素的前面或后面插入参数中的元素value。如果Key不存在,该命令将不执行任何操作。如果与Key关联的Value类型不是链表,相关的错误信息将被返回。 成功插 入后链表中元素的数量,如果没有找到pivot,返回-1,如果key不存在,返回0。
RPUSH key value [value ...]
在指定Key所关联的List Value的尾部插入参数中给出的所有Values。如果该Key不存在,该命令将在插入之前创建一个与该Key关联的空链表,之后再将数据从链表的 尾部插入。如果该键的Value不是链表类型,该命令将返回相关的错误信息。 插入后链表中元素的数量。
RPUSHX key value
仅有当参数中指定的Key存在时,该命令才会在其所关联的List Value的尾部插入参数中给出的Value,否则将不会有任何操作发生。 插入后链表中元素的数量。
RPOP key
返回并弹出指定Key关联的链表中的最后一个元素,即尾部元素,。如果该Key不存,返回nil。 链表尾部的元素。
RPOPLPUSH source destination
原子性的从与source键关联的链表尾部弹出一个元素,同时再将弹出的元素插入到与destination键关联的链表的头部。如果source键不存在,该命令将返回nil,同时 不再做任何其它的操作了。如果source和destination是同一个键,则相当于原子性的将其关联链表中的尾部元素移到该链表的头部。 返回弹出和插入的元素。
链表结构的小技巧:
针对链表结构的Value,Redis在其官方文档中给出了一些实用技巧,如RPOPLPUSH命令,下面给出具体的解释。
Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。
假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",
而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。
如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,
那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。
然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,
直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。同时我们还可以提供一个守护进程,
当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
3、Hash类型
Hash类型是String类型的filed和value的映射表,或者说是一个String的结合,他特别适合存储对象。相比较而言把一个对象存储在Hash类型中要比直接存储在String中更加节省空间。并方便存储整个对象,Hash类型也是我们工作中最常用的一种。
形如:hset user name ming 意思是一个Hash类型叫做user,这个user的属性name的值是ming。
使用hget来获取值 hget user name 就能获取到这个对象中的name属性的值。
hmset可进行批量存储多个键值对。hmset user age 15 sex man
hmget可进行批量获取多个键值对。hmget user name age sex
Hash类型中同样也有hsetnx,他和setnx大同小异。
hincrby和hdecrby集合递增和递减。
hexists 如果存在返回1,不存在返回0
hlen 返回hash中所有键的数值。
hkeys返回hash中的所有键。
hvals 返回Hash中所有的值。
hgetall返回Hash中所有的键和值。
4、Set类型
set集合是String类型的无序集合,set是通过hashtable实现的,对集合我们可以取交集,并集,差集。
sadd方法:向名称为key的set中添加元素。
小结:set集合不允许重复元素,smembers查看set中的所有元素。
srem方法 删除set集合元素。srem name 值
spop方法 随机返回删除的key
sdiff返回两个集合不同元素,哪个集合在前面就以哪个集合为标准。
sdiffstore 将返回的不同元素存储在另一个集合里面。 sdiffstore set3 set1 set2 。吧1和2的不同元素存储在3中
sinter 返回两个集合的交集。sinter set1 set2 返回set1中和set2中的交集元素。
sinterstore 将返回的交集存储在一个新的集合中
smove方法:从一个set集合中移动元素到另一个set集合中 smove set2 set1 bbb 将set2中的bbb移动到set1中。
scard方法:查看集合中元素的个数。
5、ZSet类型
Zset是在set的基础上做了一个有序的调整。
zadd方法:向有序集合中添加一个元素,如果该元素存在,就更新顺序。
小结:在重复插入的时候会根据顺序属性更新。
语法:zadd set1 1 aaa 其中的1代表序号。 就是排序的序号。aaa代表集合的值,set1代表集合的名字。
zrange 方法,查看集合中的值 zrange set1 0 -1 withscores
说明:withscores代表把序号也查询出来,不想显示序号可以不加。
zrem方法 删除集合中的元素。
6、redis高级命令
keys * 返回所有的name
exists 是否存在指定的name
expire 设置某个key的过期时间,使用ttl查看剩余时间
persist 取消过期时间
select选择数据库,数据库为0到15,共16个数据库,默认进入的是0个数据库。
move key [数据库下标] 转移到其他数据库中
randomkey 随机返回数据库中的一个key
rename key newkey 重命名key
dbsize 查看当前数据库中key的数量
flushdb 清空当前数据库,flushall清空所有数据库。
config get * 获取当前redis配置项。
info 获取数据库信息。