redis
简介
简单的讲,redis 是一个非常高效的简单数据库,这个数据库只有5种数据结构.
因为 redis 具有速度快,可以设置过期时间的特性,常被用来做缓存.
数据结构
- string 字符串
- hash 多个键值对的集合
- set 集合
- sorted set 有序集合
- list 列表
基本命令
redis 的五种数据结构其实也都是键值对,区别在于键值对的值不一样,不一样的数据结构的值可能又是另一个键值对,或者是一系列的键值对.
但是就像 JavaScript 中所有的数据结构都是从 Object 类型继承来的一样,redis 也可以类比成这样.五种数据结构都继承于键值对,所以也会有一些通用的方法.
redis基本命令
其中比较常用的有:
- del key - 删除 key
- exists key - 判断可以是否存在,存在返回1,不存在返回0
- expire key - 给 key 设置过期时间,单位为秒
- pexprie key - 给 key 设置过期时间,单位是毫秒
- expireat key - 给key 设置过期时间,区别在于这里的参数是 Unix 时间戳
- rename key newKey - 重命名 key, 这个操作如果key 不存在会报错,所以使用前需要先用 exists key 判断一下,并且如果 newKey 已经存在的话会覆盖,所以最好也判断一下 exists newKey
- renamenx key newKey - 重命名key, 仅当 newKey 不存在时成功,就可以少判断一次 exists newKey 了
string 类型
string 类型非常简单,就是最简单的键值对,key 是一个 string, value 也是一个 string.
最常用的命令也就是 get,set,可以说是其他类型的一个基类了.
string 基本命令
set方法可直接设置过期时间,需要几个可选参数
redis.set(key, value, timeType[opt], time[opt], NX|XX[opt])
其中 timeType:
- ‘EX’ 指的是 time 的单位是秒
- ‘PX’ 指的是 time 的单位是毫秒
这 NX|XX 意思是:
- ‘NX’ 只有当 key 不存在时才设置过期时间
- ‘XX’ 只有当 key 存在时才设置过期时间
hash 类型
hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
这里引入了一个 field的概念,其实 hash 就是一个 value 是多个 string 类型键值对集合的键值对,这里的 field 就是 一个二级 key.
不过不能无限分级下去,这个 field 对应的 value 就一定是一个 string 字符串
hash 的命令主要是在 string 的基础上最前面加个h,类似的:
- hdel key field1 field2 … - 删除 field
- hexists key field - 判断存在与否
- hset key field value - 写入 field 的值
- hget key field - 获取key 下某 field 的值
- hlen key - 获取 field 的数量
- hkeys key - 获取所有 field 的name
因为一个 key下可以有几乎无数个 field,所以就会有批量操作:
- hmset key field1 value1 field2 value2.. - js 中把 field 和 value 按顺序的放入数组中,就可以批量写入例如
redis.hset(key, [field1, value1, field2, value2...])
- hmget key filed1 field2 field3.. - 同理,会按field 的顺序返回value 数组
- hgetall key - 获取 key 下的所有 field,但如果 field 数量过多,可能会导致 redis 堵塞,所以在不确定一个 hash key 下有多少 field 的情况,不推荐使用.
- hscan key cursor [MATCH pattern] [COUNT count] - 扫描器,可以做类似分页查询的操作,还可以做模糊查询 cursor 就是游标起点,count 就是 pagesize. 模糊查询就是 match 后面加正则匹配查询但是用hscan 做分页查询是不能排序,只能按原 key 的 field 排序获取, 返回[field, value]
hash 基本命令
set 类型
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
简单的说,set 就是一个 field 不可重复,且 value=field 的 hash
set 类型大多用在统计人数等不可重复的情况下.
常用的命令有:
- sadd key member1 member2 - 给集合添加成员,这里又引入了 member 的概念,应该是为了区分 field
- sismember key member - 判断 member 是否是 key 的成员
- scard key - 获取 key 的总 member 数
- srem key member1 member2 - 移除 key 中的一个或多个成员
- smembers key - 返回集合中的所有成员,同样的可能会出现堵塞,所以也有扫描器
- sscan key cursor [match pattern] [count count] - 扫描器,返回 member
set 还有一些差集,交集的离散数学操作.
set 基本命令
sorted set 类型
有序集合就是在集合 set 的基础上,给每个 member 再附上一个double 类型的分数score.member 虽然要是唯一的,但是 score 是可以重复的.我们可以用这个 score 来实现排序.
常用的命令有:
- zadd key [score1,member1,score2,member2…] - 给key 添加带 score 的成员,sore 是必选参数.
- zcard key - 获取集合成员数
- zrem key [member1,member2..] - 移除一个或多个成员
- zscore key member - 获取成员的分数值
除了常规是增加删除外还有关于 score 的操作:
- zcount key min max - 计算 score 在这个区间内的 member 有多少
- zrangebyscore key min max [withscore] [limit offset count] - 返回分数在这个区间的成员,其中,无穷小,无穷大用-inf,+inf 表示. 如果withscore 的话就会返回 [member,score]这样的结构,还可以指定 limit, offset, count来做分页查询.js 中一般是
redis.zrangebyscore([key, '-inf', '+inf', 'limit', offset, pagesize])
返回值是从小到大排序 - zrevrangebyscore key max min [withsocre] [limit offset count] - 同上,不过是最大最小反过来
- zremrangebyrank key min max - 删除 score 从min 到 max 之间的 member
- zremrangebylex key start stop - 删除在 start成员到 stop 成员之间的所有成员(包括边界),lex指的是在有序 set 中的某一成员
- zrange key start stop [withscore] - 返回下角标在 start 到 stop 之间(包括边界)的所有成员,这里是 start 和 stop 就是成员在 sorted set 中的排序,从0开始. 如果是
redis.zrange(key, 0, -1)
就是 返回所有成员, 想知道成员的下角标可以用 zrank - zrank key member - 返回成员的索引指,即下角标
- zscan key cursor [match pattern] [count count] - 有序集合同样也有扫描器
sorted set 基本命令
list 类型
list 类型就是数据结构中的队列加栈,因为 list 类型既可以从头部(左边)添加元素,也可以从尾部(右边)添加元素,删除元素也是一样,但必须是按序的,不能添加或者删除中间的元素.
常用的命令有:
- lpush key [value1, value2..] - 添加一个或多个元素到队首
- lpop key - 移出队首的第一个元素
- rpush key [value1, value2..] - 添加一个或多个元素到队尾
- rpop key - 移出队尾的第一个元素
- llen key - 获取队列长度
用以上的几个命令就可以组成队列操作和栈操作
lpush + lpop 或者 rpush + rpop就是栈操作
lpush + rpop 就是队首在右边的队列操作
rpush + lpop 就是队首在左边的队列操作