3.1 热身
-
通配符
? 匹配一个字符 * 匹配任意个(包括0)个字符 [] 匹配括号内任意一个字符,可用"-"表示范围。 \x 匹配字符x,用于转义符号,如要匹配"?"需要使用"\?"
-
判断一个键是否存在
exists key
-
删除键
DEL key[key ...]
删除一个或多个键,返回删除个数
-
获得键值的数据类型
TYPE key
-
清除数据库的所有证据
FLUSHALL -- 清空所有数据库数据
3.2 string类型
一个字符串类型键允许存储的数据的最大容量是512MB
b. 介绍
a. 命令
- 赋值与取值
SET key value GET key
- 递增数字
INCR key // int +1 INCRby key num // int +num INCRbyfloat key num // float + num DECR key // int -1
c. 实践
-
计数功能
-
各类场景下(单机或分布式)的识别号
-
集群环境下的session共享
d. 命令拾遗
- 向尾部增加值
append key value
- 获取字符串长度
STRLEN key
- 同时获取多个值
MGET key [key...]
- 位操作
3.3 hash类型
a. 介绍
Hash的字段值只能是字符串,不支持其它数据类型
一个Hash类型键可以包含至多 2^32-1个字段
其它数据类型同样不支持数据类型嵌套
b. 命令
-
单个赋值、取值
HSET key field value HGET key field
-
批量赋值、取值
HMSET key field value [field value] HMGET key field [field...] HGETALL key 获取所有的字段和值
Redis中每个键都属于一个明确的数据类型
-
判断字段是否存在
HEXISTS key field
-
判断字段是否存在,不存在则赋值
HSETNX key field value
-
增加数字
HINCRBY key field increment
-
删除字段
HDEL key field [field ...]
c. 实践
-
存储文章数据
表头、作者、日期、内容等按字段存储
无论获取还是修改,都可以只对某一个属性操作;同时比string更加节约空间 -
存储文章缩略名
文章缩略名为构建该文章网址的一部分
d. 命令拾遗
- 只获取字段名或字段值
HKEYS key HVALS key
- 获取字段数量
HLEN key
3.4 list类型
a. 介绍
LIST可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表
某一片段。
列表类型内部是使用双向链表实现的,所以向列表两端添加元素的时间复杂度为O(1)
链表的代价是索引元素比较慢
b. 命令
- 向列表两端增加元素
LPUSH key value [value ...] RPUSH key value [value ...]
- 从两端读取元素
LPOP key RPOP key
- 队列长度
LLEN key
- 获得列表片段
LRANGE key start stop //负数表示右边计数 -1指右边第一个
- 删除列表中指定的值
count为负指从右遍删,为0贼是删除所有LREM key count value //删除前count个值为value的元素
c. 实践
- 存储文章ID列表
- 存储评论列表
- 微信订阅号
- 发布消息 lpush mes:004 999
- 展示消息列表 lrange mes:004 0 5
d. 命令拾遗
- 获得/设置指定索引的元素值
LINDEX key index LSET key index value
- 只保留列表指定片段
LTRIM key start end // 和LPUSH一起,限制元素数量
- 向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
- 将一个元素转移到另一个列表
RPOPLPUSH source destination
3.5 Set集合
a. 介绍
一个map类型可以存储至多2^32-1个字符串
唯一 、 无序
b. 命令
- 增加/删除元素
SADD key memeber [member ...] SREM key memeber [member ...]
- 获得集合中的所有元素
SMEMBERS key
- 获取集合的个数
SCARD key
- 判断是否在集合中
SISMEMBER key memeber
- 集合间运算
SDIFF key [key ...] // 差集,第一个key SINTER key [key ...] // 交集 SUNION key [key ...] // 并集
c. 实践
- 存储文章标签
- 微博关系实现
d. 命令拾遗
- 进行集合运算并将结果存储
SDIFFSTORE destination key [key ...] SINTERSTORE destination key [key ...] SUNIONSTORE destination key [key ...]
- 随机获得集合中的元素
count > 0 && count < max 返回不重复的元素SRANDMEMBER key [count]
count >= max 返回所有元素
count < 0 返回 |count| 个元素,可能重复 - 从集合中弹出一个元素
SPOP key // 随机弹出一个元素
3.5 Zset类型
a. 介绍
有序集合和列表类型
-
相同点
- 两者都是有序的
- 二者都可以获得某一范围的元素
-
不同点
- 列表类型是通过链表实现的,获取看靠近两端的数据速度极快,而当元素增多后,访
问中间数据会变慢,适合新鲜事
或日志
这样很少访问中间元素的应用 - 有序集合类型是使用散列表和跳跃表(Skip list)实现的,所以读取中间数据的速
度也很快(时间复杂度O(log(N))) - 列表不能简单调整某个元素的位置,有序集合可以(更改元素的分数)
- 有序集合比列表更耗费内存
- 列表类型是通过链表实现的,获取看靠近两端的数据速度极快,而当元素增多后,访
b. 命令
- 增加元素
ZADD key score member [socre member]
- 获得元素的分数
ZSCORE key member
- 获得排名在某个范围的元素列表
ZRANGE key start stop [WITHSCORES] ZREVRANGE key start stop [WITHSCORES]
- 获得指定分数范围的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 增加某个元素的分数
ZINCRBY key increment memeber
c. 实践
-
实现按点击量排序
-
改进按时间排序
-
腾讯新闻话题榜设计
- 点击话题
zincrby topic:0423 1 article:1 - 右侧排行实现
topic:0212 0 9 withscores - 统计近3日点击数据
zunionstore topic:3day 3 topic:0212 topic:0211 topic:0210 - 展示近3日的排行前9名
zrevrange topic:3day 0 9 withscores
- 点击话题
d. 命令拾遗
- 获得集合中元素的数量
ZCARD key
- 获得指定分数范围的元素个数
ZCOUNT key min max
- 删除一个或多个元素
ZREM key memeber [member ...]
- 按照排名范围删除元素
ZREMRANGEBYRANK key start sop
- 按照分数范围删除元素
ZREMRANGEBYSCORE key min max
- 获得元素排名
ZRANK key member ZRERANK key memeber
- 计算有序集合的交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
- AGGREGATE是SUM时,参与计算的集合中该元素分数的和