redis键操作的命令

redis是一个使用 ANSI C 编写的开源、支持网络、基于内存、分布式、可选持久性的key-value键值对存储数据库。其键对应的值可以是多种类型的数据结构,下面是一些对redis键操作的基本命令。

  1. 获得某个键的值
1
KEYS pattern		//?单个字符 *任意字符 []括号间的任意字符带-时表示范围 \?转义
  1. 获得所有的键值
1
KEYS *
  1. 判断一个键是否存在
1
EXISTS key
  1. 删除键
1
DEL key [key ...]
  1. 获得键值的数据类型
1
TYPE key

字符串类型(string)

字符串类型是Redis中最基本的类型,能存储任何形式的字符串,包括二进制。允许存储的数据的最大容量是512MB。字符串类型是其他4种数据类型的基础,其他数据类型从某种角度上只是组织字符串的形式不同。虽说是字符串,但是和C语言中的字符串还是有些区别的。

常用命令

  1. 赋值
1
SET key value
  1. 取值
1
GET key
  1. 递增键值(当存储的整数时,可用此命令递增,返回递增后的值,不存在键时会默认为0,不是整数时会出错)
1
INCR key
  1. 递减键值
1
DECR key
  1. 增加指定整数
1
INCRBY key num
  1. 减少指定整数
1
DECRBY key num
  1. 增加指定浮点数
1
INCRBYFLOAT key num
  1. 向尾部追加值
1
APPEND key value
  1. 获取字符串长度
1
STRLEN key
  1. 同时获得/设置多个键值
1
2
MGET key [key ...]
MSET key value [key value ...]
  1. 设置位的值操作(键值一个字节8位,当超过键值二进制位长度时,会自动将中间的二进制位设置为0,设置一个不存在的键的二进制的位的值时,会自动将前面的位赋值为0。利用位操作可以非常紧促的存储bool值,而且SETBIT和GETBIT的时间复杂度都是O(1))
1
2
3
4
SETBIT key offset value


BITOP operation destkey key [key ...]
  1. 获得位的值操作(当超过二进制位的长度时,默认为0)
1
GETBIT key offset
  1. 获得键值中二进制位的值是1的个数
1
BITCOUNT key [start] [end]
  1. 对多个键值进行位运算(运算结果存储在destkey中)
1
BITOP AND/OR/XOR/NOT destkey key [key ...]
  1. 指定键的第一个位值是0或1的位置(返回的结果的偏移量是从头开始算起的,与begin和end的起始字节无关,若不设置结束字节且键值的所有二进制位都是1,则当查询值为0的二进制偏移量时,返回的是键值长度的下一个字位的偏移量,因为redis会认为键值长度之后的二进制位都是0。)
1
2
BITPOS key 0/1 			 // 指定键值第一个二进制为0/1的偏移量
BITPOS key 0/1 begin end // begin和end分别是查询查询指定键值begin字节到end字节之间出现的第一个值为0/1的二进制位的偏移量

注意事项

Redis的底层是由C语言实现的,但是redis中的字符串和C语言的字符串还是有很多区别。

C语言的字符串后面多了个'\0',做为字符串终止符,长度为N的字符串,会用长度为N+1的字符数组来表示。有如下缺点:

  1. C语言字符串并没有记录自身长度。
  2. 需要根据空字符’\0’判断字符串是否结束。

引起的问题如下:

  1. 获取字符串长度复杂度高。
  2. 拼接字符串容易出现缓冲区溢出,要通过内存重分配来扩展底层字符数组空间大小内存重分配是个十分耗时的操作。
  3. 不能存储二进制数据,如果数据本身就包含空字符串’\0’,而代码会认为是字符串终止;像图片、音频、视频、压缩文件这样的二进制数据是会包含空字符串’\0’的,所以数据会出现问题。

Redis中的存储字符串并不是C语言那么简单,而是使用了SDS结构,并且可以存储包含了’\0’的二进制,简单的结构定义如下:

1
2
3
4
5
6
struct SDS
{
	int free = 3;
	int len = 5;
	char* buf = new char[n];
};
  1. 引入了两个变量free和len属性来夺取字符串长度,时间复杂度为O(1)。

  2. 采用了空间预分配和惰性空间释放。当对SDS进行空间扩展时,会分配额外未使用空间。如果SDS修改之后,SDS的长度(len属性的值)小于1MB,那么就会分配和len属性同样大的未使用空间,也就是free属性会和len属性相同,相当于将原数组长度二倍。如果SDS修改之后,SDS的长度(len属性的值)大于或等于1MB,那么就会分配固定的1MB未使用空间。当缩短操作时,想要删掉N个字符后,free就增加N,不做内存重分配操作,空间先给留着后面能继续用。这两种操作都是为了减少内存重分配操作。

  3. C字符串不能存储二进制数据的原因是只能根据 ‘\0’ 来判断数据是否结束,不能保证其完整性,但因为 SDS 的 len 属性,无论你数据里有多少 ‘\0’ 都没关系,我是根据 len 属性值来判断数据长度的,必定是完整的,所以 SDS 可以安全地存储二进制数据。

  4. SDS在字符串后面加了’\0’,保持和C字符串一样的特性,在一定的情况下可以直接用C语言的函数,避免了不必要的函数重写。

散列类型(hash)

redis本来就是采用字典结构以键值对的形式存储数据的,而散列类型的键对应的值也是一种字典结构,相当于字典结构下的字典结构了,其存储了字段 field 和字段值 value 的映射。字段值只能是字符串,不能是其他类型,可以最大包含 2的32次方-1个字段。一般用来表示一个对象中的各种属性值。比如:汽车:001->(颜色->白色;名字->奥迪;价格->100万)。对比关系数据库,redis更加灵活,在关系数据库中,需要建二位表,所有的记录都有相同的属性,无法单独为某条记录增减属性。redis散列类型不存在这个问题,每个键对应的字段可以自由增减而不影响其他键。

常用命令

  1. 赋值(不区分插入和更新操作,当执行插入操作返回1,当执行更新操作返回0,当redis键不存在会自动创建,不能使用操作字符串键的命令操作散列键,会提示错误)
1
2
HSET key field value	//给字段赋值
HMSET key field value [field value ...]	//同时设置多个字段值
  1. 取值
1
2
HGET key field value	//获取字段的值
HMGET key field [field ...]	//同时获取多个字段的值
  1. 取所有字段和字段值
1
HGETALL key
  1. 判断字段是否存在(存在返回1,不存在返回0)
1
HEXISTS key field
  1. 仅当字段不存在时赋值(如果字段已存在,不执行任何操作)
1
HSETNX key field value
  1. 字段值增加指定数字(散列没有HINCR自增命令,也没有HDECRBY命令)
1
HINCRBY key field increment
  1. 删除字段(返回被删除字段个数)
1
HDEL key field [field ...]
  1. 只获取字段名或字段值
1
2
HKEYS key
HVALS key
  1. 获得字段数量
1
HLEN key

列表类型(list)

redis键对应的值的类型可以时列表list类型,列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。

列表内部使用双向链表实现,向列表两端添加元素的时间复杂度为O(1),获取越进两端的元素越块。但是通过索引访问元素比较慢。一般用于特定场景下,可以快速的完成关系数据库难以完成的场景,可以作为队列或栈使用,一个列表类型的键值最多能容纳2的32次方-1个元素。

常用命令

  1. 向列表两端增加元素
1
2
LPUSH key value [value ...]	//向列表左端增加元素,返回增加元素后列表的长度
RPUSH key value [value ...] //向列表右端增加元素,返回增加元素后列表的长度
  1. 从列表两端弹出元素
1
2
LPOP key	//从列表左端弹出元素,第一步将列表左端元素从列表移除,第二步返回被移除的元素值
RPOP key	//从列表右端弹出元素
  1. 获取列表中元素的个数
1
LLEN key
  1. 获得列表片段(返回索引从start到end之间的所有元素,索引从0开始,包含end的元素,当为负数时,表示用右边开始,-1表示右边第一个参数,显然 0 -1 可以获取列表中所有元素。当start索引位置比stop的索引位置靠后,则会返回空列表。当stop大于实际索引范围,则会返回到列表最右边元素)
1
LRANGE key start stop
  1. 删除列表中指定的值(删除列表中前count个值为value的元素,返回实际删除元素的个数,count>0从左边开始删除,count<0从右边开始删除,count=0删除所有值为value的元素)
1
LREM key count value
  1. 获得指定索引元素值(可当数组使用,index是负数表示从右边开始计算,最右边是-1)
1
LINDEX key index
  1. 设置指定索引元素值
1
LSET key index value
  1. 只保留列表指定片段(删除指定索引范围之外的所有元素,使用和LRANGE类似,LTRIM和LPUSH命令一起使用可用来限制类表中元素的数量)
1
ITRIM key start end
  1. 向列表中插入元素(在列表中从左到右查找值为pivot的元素,根据第二个参数是BEFORE还是AFTER决定将value插入到该元素前面还是后面)
1
LINSERT key BEFORE|AFTER pivot value
  1. 将元素从一个列表转到另一个列表(顾名思义先从src执行RPOP一个元素,LPUSH这个元素到dest中,整个过程是原子的,当src和dest相同时,会将队尾元素移动到队首)
1
RPOPLPUSH src dest

集合类型(set)

集合中,每个元素都是不同的,而且没有顺序,一个集合类型的键值可以存储2的32次方-1个字符串,集合类型常用操作是向集合中加入或删除元素、判断某个元素是否存在等。集合使用值为空的hashtable实现,这些操作的时间复杂度都是O(1),最方便的是多个集合之间还可以进行并集、交集、差集运算。

常用命令

  1. 增加集合元素(向set中增加一个元素,如果元素不存在则创建,如果元素存在就忽略,返回成功加入元素的数量)
1
SADD key member [member ...]
  1. 删除集合元素
1
SREM key member [member ...]
  1. 获得集合中所有元素
1
SMEMBERS key
  1. 判断元素是否在集合中(时间复杂度O(1),存在返回1,不存在返回0)
1
SISMEMBER key member
  1. 集合运算(支持同时传入多个键)
1
2
3
4
5
6
7
8
SDIFF key [key ...] //执行差集运算 A-B表示所有属于A且不属于B的元素构成的集合 {1,2,3} - {2,3,4} = {1}
SDIFFSTORE dest key [key ...] //执行差集运算,但将结果存储到dest中

SINTER key [key ...] //执行交集运算 A∩B表示属于A且属于B的元素构成的集合 {1,2,3} ∩ {2,3,4} = {2,3}
SINTERSTORE dest [key ...] //执行交集运算,但将结果存储到dest中

SUNION key [key ...] //执行并集运算 A∪表示所有属于A或属于B构成元素的集合 {1,2,3} ∪ {2,3,4} = {1,2,3,4}
SUNIONSTORE dest [key ...] //执行并集运算,但将结果存储到dest中
  1. 获得集合中元素的个数
1
SCARD key
  1. 随机获得集合中的元素(可以传递参数count获得多个元素,count为正数时,会最多获得count个不重复的元素,当count值大于集合中的元素个数,则返回元素中全部元素。count为负数时,会从集合中获得|count|个元素,元素可能相同。首先会从桶中随机选择一个非空桶,再从桶中所有元素随机选择一个元素,当桶中元素数量越少时,被选中的可能性越大)
1
SRANDMEMBER key [count]
  1. 从集合中弹出一个元素(由于集合是无序的,所以SPOP会从集合中选择一个元素弹出)
1
SPOP key

有序集合类型(sorted set)

在集合的基础上,有序集合为集合中的每个元素都关联了一个分数,使得我们不仅可以完成插入,删除,和判断元素是否存在等操作,还能够获得分数最高(最低)的前N个元素、获得指定范围内的元素等与分数有关的操作,虽然集合中每个元素都是不同的,但是分数可以相同。有序集合类型是使用hash表和跳跃表实现的,所以即使读取中间部分的数据也很快。有序集合中可以更改分数调整元素的位置。有序集合是五种数据结构类型中最高级的类型。

常用命令

  1. 增加元素(score对应元素的分数,如果元素已存在,会使用新的分数替换原有分数,分数不仅可以是整数,还可以是双精度浮点数,+inf/-inf表示正无穷和负无穷)
1
ZADD key score member [score member]
  1. 获得元素分数
1
ZSCORE key member
  1. 获得排名在某个范围的元素列表(返回索引从start到stop之间的所有元素,包含两端元素,索引从0开始,负数-1代表最后一个元素,如果同时获得元素的分数的话,可以加上WITHSCORES,ZRANGE事件复杂度是O(log(n)+m),n为有序集合基数,m为返回的元素的个数。如果两个元素分数相同,redis会按照ASCII字典顺序进行排列,如果中文,会使用UTF-8编码顺序排列)
1
2
ZRANGE key start stop [WITHSCORES]	//按照元素分数,从小到大顺序
ZREVRANGE key start stop [WITHSCORES]	//按照元素分数,从大到小顺序
  1. 获得指定分数范围的元素(返回分数在min到max之间的元素,如果希望分数范围不包括端点值,在分数前加上"(“符号,min和max还支持无穷大+inf/-inf表示正无穷和负无穷。获得元素列表基础上向后偏移offset个元素,并且只获取前count个元素。)
1
2
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
  1. 增加某个元素的分数(返回是更改后的分数)
1
ZINCRBY key increment menber
  1. 获得集合中元素数量
1
ZCARD key
  1. 获得指定分数范围内的元素个数(min和max的特性与ZRANGEBYSCORE一样)
1
ZCOUNT key min max
  1. 删除一个或多个元素(成功删除的元素个数)
1
ZREM key member [member ...]
  1. 按照排名范围删除元素(元素分数从小到大)
1
ZREMRANGEBYRANK key start stop
  1. 按照分数范围删除元素(min和max的特性与ZRANGEBYSCORE一样,返回删除元素的数量)
1
ZREMRANGEBYSCORE key min max
  1. 获得元素的排名
1
2
ZRANK key member		//元素分数从小到大的顺序
ZREVRANK key member		//元素分数从大到小的顺序
  1. 计算有序集合的交集/并集(计算多个有序集合的交集并将结果存在dest键中,返回dest键中的元素个数。dest中的元素个数是由AGGREGATE参数决定的,当为SUM时,dest键中元素的分数是每个集合中该元素分数的和,当为MIN时,dest键中元素分数是每个集合中该元素的最小值,当为MAX时,dest键中元素分数是每个集合中该元素的最大值。还能通过WEIGHTS参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该权重。)
1
2
ZINTERSTORE dest numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] //交集
ZUNIONSTORE dest numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] //并集
支付宝
微信
0%