redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议,基于内存,可选持久化的键值对 (key-value)存储系统,是跨平台的非关系型数据库
;其常用基础数据类型为:String(字符串)
、Hash(哈希)
、List(列表)
、Set(集合)
、Sorted Set(有序集合)
等
String(字符串)
string 是 redis 最基本的类型,一个 key 对应一个 value,通过使用
SET
和GET
命令来设置和取出字符串值,值得注意的是SET
命令会替换原有key
存储的数据和数据类型;value
可以存储任何类型的字符串,比如,可以将一个 jpeg 类型的图片存储到value
中,value
最大能存储512MB
的数据
编码方式:
- int 编码:保存 long 型的 64 位有符号整数
- embstr 编码:保存长度小于 44 字节的字符串
- raw 编码:保存长度大于 44 字节的字符串
常用指令:
-
SET
设置指定 key 的值 -
GET
获取指定 key 的值 -
SETNX
只有在 key 不存在时设置 key 的值 -
INCR
对存储在指定 key 的数值执行原子的加 1 操作,如果指定的key不存在,那么在执行 incr 操作之前,会先将它的值设定为 0 -
INCRBY
对存储在指定 key 的数值执行加指定数值操作,如果 key 不存在,操作之前,key 就会被置为 0 -
GETSET
对指定 key 设置新值,同时返回旧值
应用场景:
- 常规 key-value 存储
- 常规计数:利用
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(哈希)
hash 是一个键值(key=>value)对集合,Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
编码方式:
- ziplist(压缩列表): 当哈希类型的元素个数小于 hash-max-ziplist-entries 配置(默认512个),同时所有值都小于 hash-maxziplist-value 配置(默认为64字节)
- hashtable(哈希表): 当哈希类型无法满足 ziplist 要求时
常用指令:
-
HMSET
同时将多个 field-value (域-值)对设置到哈希表 key 中 -
HMGET
获取所有给定字段的值 -
HSET
将哈希表 key 中的字段 field 的值设为 value -
HGET
获取存储在哈希表中指定字段的值 -
HKEYS
获取哈希表中的所有字段 -
HVALS
获取哈希表中的所有值 -
HEXISTS
查看哈希表 key 中,指定的字段是否存在 -
HDEL
删除一个或多个哈希表字段
应用场景:
- 对象存储:hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
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(列表)
list 是简单的字符串列表,按照插入顺序排序,可以在头部和尾部插入新的元素,同时可以在头部或尾部取出元素
编码方式:
- ziplist(压缩列表):当列表的元素个数小于 list-max-ziplist-entries 配置(默认512个),同时列表中每个元素的值都小于 list-max-ziplist-value 配置时(默认64字节)
- linkedlist(链表):当列表类型无法满足 ziplist 的条件时
常用指令:
-
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(集合)
set 是 string 类型的无序集合(没有排序,不重复)
编码方式:
- intset(整数集合):当集合中的元素都是整数且元素个数小于 set-max-intset-entries 配置(默认512个)
- hashtable(哈希表):当集合类型无法满足 intset 的条件时
常用指令:
-
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"
Sorted Set(有序集合)
SortedSet
也叫zset
一方面它是个set
,保证了内部value
的唯一性,另一方面,它可以给每个value
赋予一个score
,代表这个 value 的排序权重
编码方式:
- ziplist(压缩列表):当有序集合的元素个数小于 zset-max-ziplist-entries 配置(默认128个),同时每个元素的值都小于 zset-max-ziplist-value 配置(默认64字节)时
- skiplist(跳跃表):当 ziplist 条件不满足时
常用指令:
-
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"
(如有错误,欢迎指正)
网友评论