redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议,基于内存,可选持久化的键值对 (key-value)存储系统,是跨平台的非关系型数据库
;其常用基础数据类型为:String(字符串)
、Hash(哈希)
、List(列表)
、Set(集合)
、Sorted Set(有序集合)
等
string 是 redis 最基本的类型,一个 key 对应一个 value,通过使用
SET
和GET
命令来设置和取出字符串值,值得注意的是SET
命令会替换原有key
存储的数据和数据类型;value
可以存储任何类型的字符串,比如,可以将一个 jpeg 类型的图片存储到value
中,value
最大能存储512MB
的数据
编码方式:
常用指令:
SET
设置指定 key 的值GET
获取指定 key 的值SETNX
只有在 key 不存在时设置 key 的值INCR
对存储在指定 key 的数值执行原子的加 1 操作,如果指定的key不存在,那么在执行 incr 操作之前,会先将它的值设定为 0INCRBY
对存储在指定 key 的数值执行加指定数值操作,如果 key 不存在,操作之前,key 就会被置为 0GETSET
对指定 key 设置新值,同时返回旧值应用场景:
incr
实现原子计数127.0.0.1:6379> set name Ansme OK 127.0.0.1:6379> get name "Ansme" 127.0.0.1:6379> setnx nxkey 1 (integer) 1 127.0.0.1:6379> get nxkey "1" 127.0.0.1:6379> incr counter (integer) 1 127.0.0.1:6379> get counter "1" 127.0.0.1:6379> incrby counter 10 (integer) 11 127.0.0.1:6379> get counter "11" 127.0.0.1:6379> getset counter 5 "11" 127.0.0.1:6379> get counter "5"
hash 是一个键值(key=>value)对集合,Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
编码方式:
常用指令:
HMSET
同时将多个 field-value (域-值)对设置到哈希表 key 中HMGET
获取所有给定字段的值HSET
将哈希表 key 中的字段 field 的值设为 valueHGET
获取存储在哈希表中指定字段的值HKEYS
获取哈希表中的所有字段HVALS
获取哈希表中的所有值HEXISTS
查看哈希表 key 中,指定的字段是否存在HDEL
删除一个或多个哈希表字段应用场景:
127.0.0.1:6379> hmset car brand bwm model m4 color black OK 127.0.0.1:6379> hkeys car 1) "brand" 2) "model" 3) "color" 127.0.0.1:6379> hmget car brand model color 1) "bwm" 2) "m4" 3) "black" 127.0.0.1:6379> hvals car 1) "bwm" 2) "m4" 3) "black"
list 是简单的字符串列表,按照插入顺序排序,可以在头部和尾部插入新的元素,同时可以在头部或尾部取出元素
编码方式:
常用指令:
LPUSH
将一个或多个值插入到列表头部LPOP
移出并获取列表的第一个元素RPUSH
在列表中添加一个或多个值RPOP
移除列表的最后一个元素,返回值为移除的元素LRANGE
返回存储在 key 的列表里指定范围内的元素,包含范围最右边的那个元素LTRIM
修剪一个已存在的 list,这样 list 就会只包含指定范围的指定元素BRPOP
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止应用场景:
lpush
和 rpop
或者 lpop
和 rpush
实现lpush
往列表中插入新元素,然后通过 lrange
获取最新的元素列表127.0.0.1:6379> lpush cars bmw (integer) 1 127.0.0.1:6379> lpush cars benz (integer) 2 127.0.0.1:6379> lpush cars audi (integer) 3 127.0.0.1:6379> llen cars (integer) 3 127.0.0.1:6379> lrange cars 0 2 1) "audi" 2) "benz" 3) "bmw" 127.0.0.1:6379> lpop cars "audi" 127.0.0.1:6379> rpop cars "bmw" 127.0.0.1:6379> brpop cars 5 1) "cars" 2) "benz" 127.0.0.1:6379> brpop cars 5 (nil) (5.02s)
set 是 string 类型的无序集合(没有排序,不重复)
编码方式:
常用指令:
SADD
添加一个或多个成员到集合SREM
从集合中删除一个或多个元素SCARD
获取集合中的元素数量SDIFF
返回第一个集合与其他集合之间的差异SINTER
返回给定所有集合的交集SISMEMBER
判断元素是否是集合的成员SMEMBERS
返回集合中的所有成员应用场景:
SINTER
命令即可快速获得给定集合的交集127.0.0.1:6379> sadd types string list hash set zset (integer) 5 127.0.0.1:6379> scard typess (integer) 0 127.0.0.1:6379> scard types (integer) 5 127.0.0.1:6379> smembers types 1) "list" 2) "string" 3) "set" 4) "hash" 5) "zset" 127.0.0.1:6379> sismember types array (integer) 0 127.0.0.1:6379> sismember types list (integer) 1 127.0.0.1:6379> srem types list (integer) 1 127.0.0.1:6379> srem types list hash (integer) 1 127.0.0.1:6379> smembers types 1) "zset" 2) "string" 3) "set" 127.0.0.1:6379> sadd typeB string list hash (integer) 3 127.0.0.1:6379> sinter types typeB 1) "string" 127.0.0.1:6379> sdiff types typeB 1) "zset" 2) "set"
SortedSet
也叫zset
一方面它是个set
,保证了内部value
的唯一性,另一方面,它可以给每个value
赋予一个score
,代表这个 value 的排序权重
编码方式:
常用指令:
ZADD
向有序集合添加一个或多个成员,或者更新已存在成员的分数ZREM
从有序集合中删除一个或多个元素ZRANK
确定有序集合中元素的索引ZCARD
获取有序集合的成员数ZCOUNT
计算在有序集合中指定区间分数的成员数ZRANGE
通过索引区间返回有序集合指定区间内的成员ZREVRANGE
通过索引返回有序集中指定区间内的成员,分数从高到低ZRANGEBYSCORE
通过分数返回有序集合指定区间内的成员ZREVRANGEBYSCORE
通过分数返回有序集合指定区间内的成员,分数从高到低应用场景:
zset
可以实现动态的排行榜,例如可以用来存储直播礼品榜单,可以使用 value
存储粉丝 ID,使用 score
存储粉丝礼品数量,从而实现礼品榜单value
存储学生 ID,使用 score
存储学生成绩,实现成绩排名127.0.0.1:6379> zadd scores 100 ansme 98 bob 99 lily 90 lucy (integer) 4 127.0.0.1:6379> zrange scores 0 5 1) "lucy" 2) "bob" 3) "lily" 4) "ansme" 127.0.0.1:6379> zrevrange scores 0 5 1) "ansme" 2) "lily" 3) "bob" 4) "lucy"
(如有错误,欢迎指正)