一、String 数据类型(字符串)
1.概述
String 是 redis 最基本的类型(可以理解为一个 key 对应一个 value),最大能存储 512MB 的数据
String 类型是二进制安全的,可以存储任何数据(比如数字、图片、序列化对象等)
2.命令示例
2.1 EXISTE、APPEND、GET、SET、STRLEN
[root@localhost ~]# redis-cli #执行Redis客户端工具
127.0.0.1:6379> EXISTS mykey #判断该键是否存在,存在返回1,否则返回0
(integer) 0
127.0.0.1:6379> APPEND mykey "hello" #若该键并不存在,则创建key,存在则将内容追加,append命令返回当前Value的长度
(integer) 5
127.0.0.1:6379> APPEND mykey " world"
(integer) 11
127.0.0.1:6379> GET mykey #通过get命令获取该键,以判断append的结果
"hello world"
127.0.0.1:6379> SET mykey "this is mykey" #通过set命令为键设置新值,并覆盖原有值,若为字符串需要加双引号或单引号
OK
127.0.0.1:6379> GET mykey
"this is mykey"
127.0.0.1:6379> STRLEN mykey #获取指定Key的字符长度,等效于C库中strlen函数
(integer) 13
2.2 INCR、DECR、DEL、INCRBY、DECRBY
127.0.0.1:6379> SET mykey 10 #设置Key的值为20
OK
127.0.0.1:6379> INCR mykey #该Key的值递增1
(integer) 11
127.0.0.1:6379> DECR mykey #该Key的值递减1
(integer) 10
127.0.0.1:6379> DEL mykey #删除已有键
(integer) 1
127.0.0.1:6379> DECR mykey #对空值执行递减操作,其原值被设定为0,递减后的值为-1
(integer) -1
127.0.0.1:6379> DEL mykey
(integer) 1
127.0.0.1:6379> INCR mykey #对空值执行递增操作,其原值被设定为0,递增后的值为1
(integer) 1
127.0.0.1:6379> SET mykey hello ##将该键的Value设置后,将不能转换为整型的普通字符串
OK
127.0.0.1:6379> INCR mykey
(error) ERR value is not an integer or out of range
127.0.0.1:6379> SET mykey 10
127.0.0.1:6379> INCRBY mykey 10 #指定增加的整数
(integer) 20
127.0.0.1:6379> DECRBY mykey 10 #指定减少的整数
(integer) 10
127.0.0.1:6379> GET mykey
"10"
2.3 GETSET、SETEX、TTL、SETNX
127.0.0.1:6379> INCR mycounter #将计数器的值原子性的递增1
(integer) 1
127.0.0.1:6379> GETSET mycounter 0 #在设置新值得同时,并返回原有值,这两个操作原子性的同时完成
"1"
127.0.0.1:6379> GET mycounter
"0"
127.0.0.1:6379> SETEX mykey 10 "hello world!" #设置指定Key的过期时间为10秒
OK
127.0.0.1:6379> TTL mykey #通过ttl命令查看一下指定Key的剩余存活时间(秒数),0表示已经过期,-1(-2)表示永不过期
(integer) 8
127.0.0.1:6379> GET mykey #在该键的存活期内我们仍然可以获取到它的Value
"hello world!"
127.0.0.1:6379> TTL mykey #该ttl命令的返回值显示,该Key已经过期
(integer) -2
127.0.0.1:6379> GET mykey
(nil)
127.0.0.1:6379> DEL mykey #删除该键,以便于下面的测试验证
(integer) 1
127.0.0.1:6379> SETNX mykey "hello" #该键并不存在,因此该命令执行成功,存在则不执行命令
(integer) 1
127.0.0.1:6379> SETNX mykey "world" #该键已经存在,因此本次设置没有产生任何效果
(integer) 0
127.0.0.1:6379> GET mykey #从结果可以确认,返回的值仍为第一次设置的值
"hello"
2.4 SETRANGE、GETRANGE
127.0.0.1:6379> SET mykey "hello world" #设定初始值
OK
127.0.0.1:6379> SETRANGE mykey 6 dd #从第六个字节开始替换2个字节(dd只有2个字节)
(integer) 11
127.0.0.1:6379> GET mykey #查看替换后的值
"hello ddrld"
127.0.0.1:6379> SETRANGE mykey 20 dd #offset已经超过该Key原有值的长度了,该命令将会在末尾补0
(integer) 22
127.0.0.1:6379> GET mykey #查看补0后替换的结果
"hello ddrld\x00\x00\x00\x00\x00\x00\x00\x00\x00dd"
127.0.0.1:6379> del mykey #删除该Key
(integer) 1
127.0.0.1:6379> SETRANGE mykey 2 dd #替换空值
(integer) 4
127.0.0.1:6379> GET mykey #查看替换空值后的结果
"\x00\x00dd"
127.0.0.1:6379> SET mykey "0123456789" #设置新值
OK
127.0.0.1:6379> GETRANGE mykey 1 2 #截取该键的Value,从第一个字节开始,到第二个字节结束
"12"
127.0.0.1:6379> GETRANGE mykey 1 20 #20已经超过Value的总长度,因此将截取第一个字节后面的所有字节
"123456789"
2.5 MSET、MGET、MSETNX
127.0.0.1:6379> MSET key1 "hello" key2 "world" #批量设置了key1和key2两个键,如果有旧值会被新值覆盖
OK
127.0.0.1:6379> MGET key1 key2 #批量获取了key1和key2两个键的值
1) "hello"
2) "world"
127.0.0.1:6379> MSETNX key2 "hello" key3 "world" #批量设置了key2和key3两个键,但是key2已经存在,所以该命令执行失败并返回0
(integer) 0
127.0.0.1:6379> MGET key2 key3 #批量获取key2和key3,由于key3没有设置成功,所以返回nil
1) "world"
2) (nil)
二、List 数据类型(列表)
1.概述
Redis 列表是简单的字符串列表,按照插入顺序排序
你可以添加一个元素到列表的头部(左边)或者尾部(右边)
列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)
2.命令示例
2.1 LPUSH、LPUSHX、LRANGE、LPOP、LIEN
127.0.0.1:6379> LPUSH cloud a b c d #创建该键及与其关联的List,之后在将参数中的values从左到右依次插入到表头
(integer) 4
127.0.0.1:6379> LRANGE cloud 0 -1 返回列表中指定区间内的元素,0表示第一个元素,1表示第二个元素,-1表示最后一个元素
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> LPUSHX cloud e #仅当key存在时,将value值插入表头
(integer) 5
127.0.0.1:6379> LRANGE cloud 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> LPOP cloud #移除并返回第一个元素,从头开始
"e"
127.0.0.1:6379> LPOP cloud
"d"
127.0.0.1:6379> LPOP cloud
"c"
127.0.0.1:6379> LLEN cloud #查看列表中元素个数
(integer) 2
127.0.0.1:6379> LRANGE cloud 0 -1 #查看列表中的所有元素
1) "b"
2) "a"
2.2 LREM、LSET、LINDEX、LTRIM
127.0.0.1:6379> DEL cloud
(integer) 1
127.0.0.1:6379> LPUSH cloud a b c d b a #该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入到表头
(integer) 6
127.0.0.1:6379> LRANGE cloud 0 -1 #返回列表中指定区间内的元素
1) "a"
2) "b"
3) "d"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> LREM cloud 2 b #从头部(left)向尾部(right)变量链表,删除2个值等于b的元素,返回值为实际删除的数量
(integer) 2
127.0.0.1:6379> LRANGE cloud 0 -1
1) "a"
2) "d"
3) "c"
4) "a"
127.0.0.1:6379> LSET cloud 1 b #将索引值为1的元素值设置为新值b
OK
127.0.0.1:6379> LRANGE cloud 0 -1
1) "a"
2) "b"
3) "c"
4) "a"
127.0.0.1:6379> LINDEX cloud 1 #获取索引值为1的元素值
"b"
127.0.0.1:6379> LTRIM cloud 0 2 #仅保留索引值0到2的元素
OK
127.0.0.1:6379> LRANGE cloud 0 -1
1) "a"
2) "b"
3) "c"
2.4 LINSERT
127.0.0.1:6379> DEL could
(integer) 1
127.0.0.1:6379> LPUSH could a b c d e
(integer) 5
127.0.0.1:6379> LRANGE could 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> LINSERT could before a 0 #在元素a之前插入新元素0
(integer) 6
127.0.0.1:6379> LINSERT could after e 1 #在元素e之后插入新元素1
(integer) 7
127.0.0.1:6379> LRANGE could 0 -1
1) "e"
2) "1"
3) "d"
4) "c"
5) "b"
6) "0"
7) "a"
2.5 RPUSH、RPUSHX
127.0.0.1:6379> del key1 key2
(integer) 0
127.0.0.1:6379> RPUSH key1 a b c d e #将值从左往右依次插入到表尾
(integer) 5
127.0.0.1:6379> LRANGE key1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> RPUSH key1 f
(integer) 6
127.0.0.1:6379> LRANGE key1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> RPUSHX key2 f #指定键存在时执行,否则不执行
(integer) 0
127.0.0.1:6379> KEYS key?
1) "key1"
2.6 RPOP、RPOPLPUSH
127.0.0.1:6379> RPOP key1 #移除并返回键的第一个元素,从尾开始
"f"
127.0.0.1:6379> LRANGE key1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> RPOPLPUSH key1 key2 #将键1尾部元素xxx弹出,同时再插入到键2的头部(原子性的完成这两步操作)
"e"
127.0.0.1:6379> KEYS key? #可以看到有key2了
1) "key2"
2) "key1"
127.0.0.1:6379> LRANGE key2 0 -1
1) "e"
127.0.0.1:6379> LRANGE key1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> RPOPLPUSH key1 key1
"d"
127.0.0.1:6379> LRANGE key1 0 -1
1) "d"
2) "a"
3) "b"
4) "c"
三、Hash 数据类型(哈希)
1.概述
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
Redis hash 是一个键值(key=>value)对集合
可以采用这样的命名方式:对象类别和 ID 构成键名,使用字段表示对象的属性,而字段值则存储属性值
如果 Hash 中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间
每一个 Hash 可以存储大约 42 亿个键值对
2.命令示例
2.1 HEST、HGET、HDEL、HEXISTS
127.0.0.1:6379> HSET hash field1 a field2 b field3 c #给hash键创建三个字段及对应字段值
(integer) 3
127.0.0.1:6379> HGET hash field1 #获取hash键,字段为field1的值
"a"
127.0.0.1:6379> HDEL hash field2 #删除hash键,字段为field2的值,成功返回1
(integer) 1
127.0.0.1:6379> HEXISTS hash field2 #盘点hash键中字段为field2的值是否存在,存在返回1
(integer) 0
2.2 HLEN、HSETNX、HINCRBY
127.0.0.1:6379> HLEN hash #获取hash键的字段数量
(integer) 2
127.0.0.1:6379> HSETNX hash1 field3 z #给hash1键添加新字段field3,值为z,是否执行基于此字段是否存在,不管键是否存在,返回1表示执行成功
(integer) 1
127.0.0.1:6379> KEYS hash* #添加新数据后,hash1键存在了
1) "hash1"
2) "hash"
127.0.0.1:6379> HSETNX hash field3 d #此字段不存在,所以执行吗不成功
(integer) 0
127.0.0.1:6379> HINCRBY hash3 field1 1 #给hash3键的field1字段值加1
(integer) 1
127.0.0.1:6379> HGET hash3 field1 #确认值为1
"1"
127.0.0.1:6379> HINCRBY hash3 field1 -10 #字段值减10
(integer) -9
127.0.0.1:6379> HGET hash3 fiel #1-10=-9
d1
"-9"
2.3 HGETALL、HKEYS、HVALS、HVALS、HMGET、HMSET
127.0.0.1:6379> HGETALL hash1 #返回hash1键的所有字段及其值,是逐对列出的
1) "field3"
2) "z"
127.0.0.1:6379> HGETALL hash3
1) "field1"
2) "-9"
127.0.0.1:6379> HKEYS hash1 #仅获取hash1键中所有字段名
1) "field3"
127.0.0.1:6379> HKEYS hash3
1) "field1"
127.0.0.1:6379> HVALS hash1 #仅获取hash1键中所有字段值
1) "z"
127.0.0.1:6379> HVALS hash3
1) "-9"
127.0.0.1:6379> HMSET hash4 field1 hello field2 world
OK
127.0.0.1:6379> HMGET hash4 field1 field2
1) "hello"
2) "world"
四、Set 数据类型(无序集合)
1.概述
无序集合,元素类型为 String 类型
元素具有唯一性,不允许存在重复的成员
多个集合类型之间可以进行并集、交集和差集运算
2.应用范围
可以使用 Redis 的 Set 数据类型跟踪一些唯一性数据
比如访问某一博客的唯一 IP 地址信息
对于此场景,我们仅需在每次访问该博客时将访问者的 IP 存入 Redis 中,Set 数据类型会自动保证 IP 地址的唯一性
充分利用 Set 类型的服务端聚合操作方便、高效的特性,可以用于维护数据对象之间的关联关系
比如所有购买某一电子设备的客户 ID 被存储在一个指定的 Set 中,而购买另外一种电子产品的客户 ID 被存储在另外一个 Set 中
如果此时我们想获取有哪些客户同时购买了这两种商品时,Set 的 intersections 命令就可以充分发挥它的方便和效率的优势了
3.命令示例
3.1 SADD、SMEMBERS、SCARD、SISMEMBER
127.0.0.1:6379> SADD myset a b c d e #将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略,假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合
(integer) 5
127.0.0.1:6379> SMEMBERS myset #查看插入的结果,输出的顺序与插入顺序无关
1) "b"
2) "a"
3) "d"
4) "c"
5) "e"
127.0.0.1:6379> SCARD myset #获取集合中成员的数量
(integer) 5
127.0.0.1:6379> SISMEMBER myset d #判断键中成员是否存在,返回0表示不存在,1表示存在
(integer) 1
127.0.0.1:6379> SISMEMBER myset f
(integer) 0
3.2 SPOP、SREM、SRANDMEMBER、SMOVE
127.0.0.1:6379> SPOP myset #随机的移除并返回键中的某一成员
"a"
127.0.0.1:6379> SMEMBERS myset #查看结果,输出的顺序与插入顺序无关
1) "b"
2) "c"
3) "e"
4) "d"
127.0.0.1:6379> SPOP myset
"e"
127.0.0.1:6379> SMEMBERS myset
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> SREM myset a b e #从键中移出a/b/e,并返回移除成员个数,a/e刚已被移除了,所以返回1
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "c"
2) "d"
127.0.0.1:6379> SRANDMEMBER myset #该命令随机的返回某一成员
"c"
127.0.0.1:6379> SRANDMEMBER myset
"c"
127.0.0.1:6379> SRANDMEMBER myset
"d"
127.0.0.1:6379> SMOVE myset myset1 c 将键myset的c成员移到键myset1,成功返回1,失败返回0
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "d"
127.0.0.1:6379> SMEMBERS myset1
1) "c"
五、Zset 数据类型(Sorted Set:有序集合)
1.概述
Zset 和 Set 一样也是 String 类型元素的集合,且不允许重复的成员
每个元素都会关联一个 double 类型的分数 ,redis 正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复
score(表示权重),可以通过权重的大小排序
2.应用范围
可以用于一个大型在线游戏的积分排行榜:
每当玩家的分数发生变化时,可以执行 ZADD 命令更新玩家的分数,此后再通过 ZRANGE 命令获取积分 TOP10 的用户信息
3.命令示例
3.1 ZADD、ZRANK、ZCARD、ZRANK、ZCOUNT
127.0.0.1:6379> ZADD zset 1 a 2 b 3 c 4 d 5 e #将一个或多个成员元素及其分数值加入到有序集当中
(integer) 5
127.0.0.1:6379> ZRANGE zset 0 -1 #查看成员
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ZRANGE zset 0 -1 withscores #查看成员及对应分数
1) "a"
2) "1"
3) "b"
4) "2"
5) "c"
6) "3"
7) "d"
8) "4"
9) "e"
10) "5"
127.0.0.1:6379> ZCARD zset #获取键中成员的数量
(integer) 5
127.0.0.1:6379> ZRANK zset e #获取成员的位置索引值
(integer) 4
127.0.0.1:6379> ZRANK zset a
(integer) 0
127.0.0.1:6379> ZCOUNT zset 2 4 #分数满足表达式[x <= score <= x]的成员的数量
(integer) 3
3.2 ZREM、ZSCOREZINCRBY
127.0.0.1:6379> ZREM zset a b #删除成员,返回实际删除成员的数量
(integer) 2
127.0.0.1:6379> ZSCORE zset d #获取成员的分数
"4"
127.0.0.1:6379> ZINCRBY zset 2 a #若成员不存在,则zincrby命令将添加该成员分数为2(并假设其初始分数为0)
"2"
127.0.0.1:6379> ZINCRBY zset -1 a
"1"
127.0.0.1:6379> ZRANGE zset 0 -1 withscores #a=2-1=1
1) "a"
2) "1"
3) "c"
4) "3"
5) "d"
6) "4"
7) "e"
8) "5"
3.3 ZRANGEBYSCORE、ZREMRRANGEBYSCORE、ZREMRANGEBYRANK
127.0.0.1:6379> DEL zset
(integer) 1
127.0.0.1:6379> ZADD zset 1 a 2 b 3 c 4 d 5 e #将一个或多个成员元素及其分数值加入到有序集当中
(integer) 5
127.0.0.1:6379> ZRANGEBYSCORE zset 2 4 #获取分数满足表达式[x <= score <= x]的成员,即 2 3 4
1) "b"
2) "c"
3) "d"
127.0.0.1:6379> ZRANGEBYSCORE zset -inf +inf limit 2 3 #-inf和+inf表示第一个和最后一个成员,limit 2 3表示索引为2开始的三个成员(a0、b1、c2、d3、e4,即c、d、e)
1) "c"
2) "d"
3) "e"
127.0.0.1:6379> ZREMRANGEBYSCORE zset 1 3 #删除分数满足表达式[x <= score <= x]的成员,并返回实际删除的数量
(integer) 3
127.0.0.1:6379> ZRANGE zset 0 -1 #查看,确认结果
1) "d"
2) "e"
127.0.0.1:6379> ZREMRANGEBYRANK zset 1 2 #删除位置索引满足表达式[x <= rank <= x]的成员,即(0d、1e,删除1和2索引值,结果只删了1e)
(integer) 1
127.0.0.1:6379> ZRANGE zset 0 -1 #查看,确认结果,仅剩d
1) "d"
3.3 ZREVRANGE、ZREVRANGEBYSCORE、ZREVRANK
127.0.0.1:6379> DEL zset
(integer) 0
127.0.0.1:6379> ZADD zset 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> ZRANGE zset 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> ZREVRANGE zset 0 -1 #以位置索引从高到低的方式获取并返回此区间内的成员
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> ZREVRANK zset a #获取成员索引,该用法是是反向索引排序
(integer) 4
127.0.0.1:6379> ZREVRANK zset e
(integer) 0
127.0.0.1:6379> ZRANK zset a #正向为0
(integer) 0
127.0.0.1:6379> ZRANK zset e
(integer) 4
127.0.0.1:6379> ZREVRANGEBYSCORE zset 5 3 #获取分数满足表达式[x >= score >= x]的成员,并以从高到底的顺序输出
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> ZREVRANGEBYSCORE zset 3 1 limit 1 2 #分数1-3,且索引为1-2的成员
1) "b"
2) "a"