Redis常用数据类型
Redis数据结构String、Hash、List、Set、SortedSet及相关操作。
String
Redis 中最简单的数据结构,它既可以储存文字(比如 "hello world"),又可以储存数字(比如整数 10086 和浮点数 3.14),还可以储存二进制数据(比如 10010100)
编号 | 命令 | 描述说明 |
1 | 此命令设置指定键的值。 | |
2 | 获取指定键的值。 | |
3 | 获取存储在键上的字符串的子字符串。 | |
4 | 设置键的字符串值并返回其旧值。 | |
5 | 返回在键处存储的字符串值中偏移处的位值。 | |
6 | 获取所有给定键的值 | |
7 | 存储在键上的字符串值中设置或清除偏移处的位 | |
8 | 使用键和到期时间来设置值 | |
9 | 设置键的值,仅当键不存在时 | |
10 | 在指定偏移处开始的键处覆盖字符串的一部分 | |
11 | 获取存储在键中的值的长度 | |
12 | 为多个键分别设置它们的值 | |
13 | 为多个键分别设置它们的值,仅当键不存在时 | |
14 | 设置键的值和到期时间(以毫秒为单位) | |
15 | 将键的整数值增加 | |
16 | 将键的整数值按给定的数值增加 | |
17 | 将键的浮点值按给定的数值增加 | |
18 | 将键的整数值减 | |
19 | 按给定数值减少键的整数值 | |
20 | 将指定值附加到键 |
SET key value [NX|XX]
SET 命令还支持可选的 NX 选项和 XX 选项:
• 如果给定了 NX 选项,那么命令仅在键 key 不存在的情况下,才进行设置操作;如果键 key 已经存 在,那么 SET ... NX 命令不做动作(不会覆盖旧值)。
• 如果给定了 XX 选项,那么命令仅在键 key 已经存在的情况下,才进行设置操作;如果键 key 不存 在,那么 SET ... XX 命令不做动作(一定会覆盖旧值)。 在给定 NX 选项和 XX 选项的情况下,SET 命令在设置成功时返回 OK ,设置失败时返回 nil。
SETNX key value
仅在键 key 不存在的情况下,将键 key 的值设置为 value ,效果和 SET key value NX 一样。 NX 的意思为“Not eXists”(不存在)。
键不存在并且设置成功时,命令返回 1 ;因为键已经存在而导致设置失败时,命令返回 0 。
复杂度为 O(1) 。
STRLEN key
返回字符串键 key 储存的值的长度。
因为 Redis 会记录每个字符串值的长度,所以获取该值的复杂度为 O(1) 。
索引
字符串的索引(index)以 0 为开始,从字符串的开头向字符串的结尾依次递增,字符串第一个字符的索 引为 0 ,字符串最后一个字符的索引 为 N-1 ,其中 N 为字符串的长度。
除了(正数)索引之外,字符串 还有负数索引:负数索引以 -1 为开始,从字符串的结尾向字符串的开头 依次递减,字符串的最后一个字符的索引 为 -N ,其中 N 为字符串的长度。
SETRANGE key index value
从索引 index 开始,用 value 覆写(overwrite)给定键 key 所储存的字符串值。只接受正数索引。
命令返回覆写之后,字符串 值的长度。复杂度为 O(N), N 为 value 的长度。
GETRANGE key start end
返回键 key 储存的字符串值中,位于 start 和 end 两个索引之间的内容(闭区间,start 和 end 会被包括 在内)。和 SETRANGE 只接受正数索引不同,GETRANGE 的索引可以是正数或者负数。
复杂度为 O(N) , N 为被选中内容的长度。
数字操作:
只要储存在字符串键里面的值可以被解释为 64 位整数,或者 IEEE-754 标准的 64 位浮点数, 那么用户就可以对这个字符串键执行针对数字值的命令。
如果执行 INCRBY 或者 DECRBY 时,键 key 不存在,那么命令会将键 key 的 值初始化为 0 ,然后再执行增加或者减少操作。
针对数字值的增一和减一操作非常常见,所以 Redis 特别为这两个操作创建了 INCR 命令和 DECR 命令。
浮点数的自增和自减
INCRBYFLOAT key increment
为字符串键 key 储存的值加上浮点数增量 increment ,命令返回操作执行之后,键 key 的值。
没有相应的 DECRBYFLOAT ,但可以通过给定负值来达到 DECRBYFLOAT 的效果
二进制位的索引
和储存文字时一样,字符串键在储存二进制位时,索引也是从 0 开始的。
但是和储存文字时,索引从左到右依次递增不同,当字符串键储存的是二进制位时,二进制位的索引会 从左到右依次递减。
设置二进制位的值
SETBIT key index value
将给定索引上的二进制位的值设置为 value ,命令返回被设置的位原来储存的旧值。
复杂度为 O(1) 。
获取二进制位的值
GETBIT key index
返回给定索引上的二进制位的值。
复杂度为 O(1) 。
注意事项
一个英文字符只需要使用单个字节来储存,而一个中文字符却需要使用多个字 节来储存。
STRLEN、SETRANGE 和 GETRANGE 都是为英文设置的,它们只会在字符为单个字节的情况下正常 工作,而一旦我们储存的是类似中文这样的多字节字符,那么这三个命令就不再适用了。
Hash
一个散列由多个域值对(field-value pair)组成,散列的 域和值都可以是文字、整数、浮点数或者二 进制数据。
序号 | 命令及描述 |
1 | HDEL key field2 [field2] |
2 | HEXISTS key field |
3 | HGET key field |
4 | HGETALL key |
5 | HINCRBY key field increment |
6 | HINCRBYFLOAT key field increment |
7 | HKEYS key |
8 | HLEN key |
9 | HMGET key field1 [field2] |
10 | HMSET key field1 value1 [field2 value2 ] |
11 | HSET key field value |
12 | HSETNX key field value |
13 | HVALS key |
14 | HSCAN key cursor [MATCH pattern] [COUNT count] |
hset key field value
hget key field
hsetnx key field value
hexists key field
hdel key field [field ...]
hlen key
批量操作
获取散列包含的所有域、值、或者域值对
List
1 | BLPOP key1 [key2 ] timeout |
2 | BRPOP key1 [key2 ] timeout |
3 | BRPOPLPUSH source destination timeout |
4 | LINDEX key index |
5 | LINSERT key BEFORE|AFTER pivot value |
6 | LLEN key |
7 | LPOP key |
8 | LPUSH key value1 [value2] |
9 | LPUSHX key value |
10 | LRANGE key start stop |
11 | LREM key count value |
12 | LSET key index value |
13 | LTRIM key start stop |
14 | RPOP key |
15 | RPOPLPUSH source destination |
16 | RPUSH key value1 [value2] |
17 | RPUSHX key value |
LREM key count value
根据参数count的值 ,移除列表中与参数value相等的列表项
如果count>0,那么冲表头开始向表尾搜索,移除最多count个值为value的列表项。
如果count=0,那么冲表头开始向表尾搜索,移除所有值为value的列表项。
如果count<0,那么冲表头开始向表尾搜索,移除最多abs(count)个值为value的列表项。
修改列表
LTRIM key start stop
只保留索引范围内的列表项。
阻塞弹出命令
Set
Redis集合以无序的方式存储多个不相同的元素。用户可以快速地向集合中添加元素或者删除元素,也可以对多个集合进行集合运算,如交集、并集、差集。
序号 | 命令及描述 |
1 | SADD key member1 [member2] |
2 | SCARD key |
3 | SDIFF key1 [key2] |
4 | SDIFFSTORE destination key1 [key2] |
5 | SINTER key1 [key2] |
6 | SINTERSTORE destination key1 [key2] |
7 | SISMEMBER key member |
8 | SMEMBERS key |
9 | SMOVE source destination member |
10 | SPOP key |
11 | SRANDMEMBER key [count] |
12 | SREM key member1 [member2] |
13 | SUNION key1 [key2] |
14 | SUNIONSTORE destination key1 [key2] |
15 |
Zset
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
Redis Key操作
命令 | 描述 | 用法 |
DEL | (1)删除给定的一个或多个key (2)不存在的Key将被忽略 | DEL key [key ...] |
EXISTS | (1)检查给定key是否存在 | EXISTS key |
EXPIRE | (1)为给定key设置生存时间,key过期时它会被自动删除 (2)对一个已经指定生存时间的Key设置执行EXPIRE,新的值会代替旧的值 | EXPIRE key seconds |
EXPIREAT | (1)同EXPIRE,但此命令指定的是UNIX时间戳,单位为秒 | EXPIRE key timestamp |
KEYS | (1)查找所有符合给定模式pattern的key,下面举一下例子 (2)KEYS *匹配所有key (3)KEYS h?llo匹配hello、hallo、hxllo等 (4)KEYS h*llo匹配hllo、heeeeello等 (5)KEYS h[ae]llo匹配hello和hallo (6)特殊符号想当做查找内容经的使用\ | KEYS pattern |
MIGRATE | (1)原子性地将key从当前实例传送到目标实例指定的数据库上 (2)原数据库Key删除,新数据库Key增加 (3)阻塞进行迁移的两个实例,直到迁移成功、迁移失败、等待超时三个之一发生 | MIGRATE host port key destination-db timeout [COPY] [REPLACE] |
MOVE | (1)将当前数据库的key移动到给定数据库的db中 (2)执行成功的条件为当前数据库有key,给定数据库没有key | MOVE key db |
PERSIST | (1)移除给定key的生存时间,将key变为持久的 | PERSIST key |
RANDOMKEY | (1)从当前数据库随机返回且不删除一个key, | RANDOMKEY |
RENAME | (1)将key改名为newkey (2)当key和newkey相同或key不存在,报错 (3)newkey已存在,RENAME将覆盖旧值 | RENAME key newkey |
TTL | (1)以秒为单位,返回给定的key剩余生存时间 | TTL key |
PTTL | (1)以毫秒为单位,返回给定的key剩余生存时间 | PTTL key |
TYPE | (1)返回key锁存储的值的类型 | TYPE key |
系统相关命令
命令 | 描述 | 用法 |
BGREWRITEAOF | (1)手动触发AOF重写操作,用于减小AOF文件体积 | BGREWRITEAOF |
BGSAVE | (1)后台异步保存当前数据库的数据到磁盘 | BGSAVE |
CLIENT KILL | (1)关闭地址为ip:port的客户端 (2)由于Redis为单线程设计,因此当当前命令执行完之后才会关闭客户端 | CLIENT KILL ip:port |
CLIENT LIST | (1)以可读的格式,返回所有连接到服务器的客户端信息和统计数据 | CLIENT LIST |
CONFIG GET | (1)取得运行中的Redis服务器配置参数 (2)支持* | CONFIG GET parameter |
CONFIG RESETSTAT | (1)重置INFO命令中的某些统计数据,例如Keyspace hits、Keyspace misses等 | CONFIG RESETSTAT |
CONFIG REWRITE | (1)对启动Redis时指定的redis.conf文件进行改写 | CONFIG REWRITE |
CONFIG SET | (1)动态调整Redis服务器的配置而无需重启 (2)修改后的配置立即生效 | CONFIG SET parameter value |
SELECT | (1)切换到指定数据库,数据库索引index用数字指定,以0作为起始索引值 (2)默认使用0号数据库 | SELECT index |
DBSIZE | (1)返回当前数据库的Key的数量 | DBSIZE |
DEBUG OBJECT | (1)这是一个调试命令,不应当被客户端使用 (2)key存在时返回有关信息,key不存在时返回错误 | DEBUG OBJECT key |
FLUSHALL | (1)清空整个Redis服务器的数据 | FLUSHALL |
FLUSHDB | (1)清空当前数据库中的所有数据 | FLUSHDB |
INFO | (1)以一种易于解释且易于阅读的格式,返回Redis服务器的各种信息和统计数值 (2)通过给定可选参数section,可以让命令只返回某一部分信息 | INFO [section] |
LASTSAVE | (1)返回最近一次Redis成功将数据保存到磁盘上的时间,以UNIX时间戳格式表示 | LASTSAVE |
MONITOR | (1)实时打印出Redis服务器接收到的命令,调试用 | MONITOR |
SHUTDOWN | (1)停止所有客户端 (2)如果至少有一个保存点在等待,执行SAVE命令 (3)如果AOF选项被打开,更新AOF文件 (4)关闭Redis服务器 | SHUTDOWN [SAVE|NOSAVE] |
Redis事务机制
Redis的事务是由DISCARD、EXEC、MULTI、UNWATCH、WATCH五个命令来保证的。
命令 | 描述 | 用法 |
DISCARD | (1)取消事务 (2)如果正在使用WATCH命令监视某个/某些key,那么取消所有监视,等同于执行UNWATCH | DISCARD |
EXEC | (1)执行所有事务块内的命令 (2)如果某个/某些key正处于WATCH命令监视之下且事务块中有和这个/这些key相关的命令,那么EXEC命令只在这个/这些key没有被其他命令改动的情况下才会执行并生效,否则该事务被打断 | EXEC |
MULTI | (1)标记一个事务块的开始 (2)事务块内的多条命令会按照先后顺序被放入一个队列中,最后由EXEC命令原子性地执行 | MULTI |
UNWATCH | (1)取消WATCH命令对所有key的监视 (2)如果WATCH之后,EXEC/DISCARD命令先被执行了,UNWATCH命令就没必要执行了 | UNWATCH |
WATCH | (1)监视一个/多个key,如果在事务执行之前这个/这些key被其他命令改动,那么事务将被打断 | WATCH key [key ...] |
事务没有被打断的情况:
看到开启事务之后,所有的命令返回的都是QUEUED,即放入队列,而不是直接执行。
数据库类似的,事务保证的是两点:
隔离,所有命令序列化、按顺序执行,事务执行过程中不会被其他客户端发来的命令打断
原子性,事务中的命令要么全部执行,要么全部不执行