redis简介
redis是一款开源的高性能的非关系型数据库(NoSQL, Not only sql)
redis特点
- 高性能(在内存中,高IO)
- 数据类型丰富
- 能够持久化
- 支持master-slave模式的备份
- 所有操作都是原子性的
redis 数据类型
字符串、列表、散列、集合、有序集合
字符串 String
字符串是Redis最基本的数据类型,一个key对应一个value,一个key最大能存储512MB。
常用字符串命令
SET key value
设置指定 key 的值
SETX key timeout value
设置指定 key 的值及过期时间
GET key
获取指定 key 的值
GETRANGE key start end
截取key中的字符串
GETSET key value
重置key的值,并返回key的旧值(key没有旧值时,返回nil)
SETBIT key offset value
设置key所存储的字符串,offset位上的值(offset上的值为0或1)
GETBIT key offset
获取key所存储的字符串,offset位上的值
STRLEN key
返回 key 所存储的字符串的长度
INCRBY key increment
将 key 所存储的值加上特定的增量 increment
DECRBY key decrement
将 key 所存储的值减去特定的减量值 decrement
APPEND key value
如果 key 已经存在,并且是一个字符串,APPEND命令将 value 追加到原value的末尾
特点
自增、自减
位运算
常用应用场景
利用 setbit、getbit、bitcount 统计用户签到、活跃用户
利用 INCR做原子计数器,生成唯一序列号
设置 key 有效期,上操作锁或者防止短时间内频繁发送短信验证
列表
一个列表,包含了N个字符串
常用的指令
LPUSH key string1
往列表左侧插入一个或多个值
RPUSH key string1
往列表右侧插入一个或多个值
LINSERT key BEFORE/AFTER oldString newString
在列表指定元素前(后)插入一个值(元素不存在或列表不存在,则不执行任何操作)
LSET key index string
通过索引设置列表元素的值
LINDEX key sindex
通过索引获取列表中的元素
LLEN key
获取列表的长度
LRANGE key start stop
获取列表指定范围内的元素
LPOP key
移出列表中的第一个元素,并返回移出的元素
RPOP key
移出列表中的最后一个元素,并返回移出的元素
BLPOP key time
移出列表中的第一个元素,并返回移出的元素,如果列表为空,则在time秒之后弹出nil
BRPOP key time
移出列表中的最后一个元素,并返回移出的元素,如果列表为空,则在time秒之后弹出nil
BRPOPLPUSH key1 key2 time
将key1最右侧的元素弹出到key2的最左侧,如果key1没有元素,则等待time秒后,弹出nil
LREM key count string
移除列表中与string相等的元素,共移除count个,如果count大于0,则从表头向表尾搜索,如果count小于0,则从表尾向表头搜索
LTRIM key start stop
只保留start到stop区间的元素,其余元素均移除
特点
有序,自由实现堆、栈的功能
轮询监控
索引取区间
常用应用场景
利用 LTRIM key start stop获取网站最后5个访问用户、最新消息排行榜
利用PUSH POP当成队列,进行多任务处理
利用BRPOPLPUSH key1 key1 time,使用相同的key作为BRPOPLPUSH的两个参数,无限循环整个列表,比如:一个服务器监控程序,并行检查一组网站,确保网站的可访问性
利用BRPOP key time进行事件提醒,在新元素到
哈希
一个哈希数据,里面包含了N对键值对
常用哈希命令
常用的指令
HSET key field value
将哈希表 key 中的字段 field 的值设为 value
HMSET key field1 value1 field2 value2
将多个 field-value(域-值)对设置到哈希表 key 中
HSETNX key field value
当字段 field 不存在时,设置哈希表字段值
HLEN key
获取哈希表中字段的数量
HKEYS key
获取哈希表中所有的字段
HGET key field
获取存储在哈希表中指定字段的值
HMGET key field1 field2
获取所有给定字段的值
HGETALL key
获取哈希表 key 中,所有的字段和值
HVALS key
获取哈希表中所有的值
HEXISTS key field
查看哈希表 key 中,指定的字段是否存在
HINCRBY key field increment
为哈希表 key 中指定字段加上增量 increment
HSCAN key cursor [MATCH pattern] [COUNT count]
分批次遍历哈希表 key 中的键值对,cursor为0时表示开始一次新的遍历,每次遍历返回来的cursor,作为下次遍历的cursor,直至遍历返回的cursor为0时,代表刚好结束一次完整的key遍历
HDEL key field1 field2
删除一个或多个字段
特点
数据结构有明显的层级关系
常用应用场景
存储有层级关系,并且部分数据需要变更的,如用户信息
集合(Set)
一个集合(key),包含了N个集合成员(value)。集合成员是无序的,且是唯一的,一个集合最多可以有2^32 - 1个成员
常用指令
SADD key value1 value2
向集合添加一个或多个成员
SMEMBERS key
获取一个集合中所有的成员
SCARD key
获取集合的成员数
SISMEMBER key member
判断member是否是集合key的成员
SPOP key
移除并返回集合中的一个随机元素
SRANDMEMBER key [count]
返回集合中一个或多个随机元素
SREM key member1 [member2]
移除集合中一个或多个成员
SDIFF key1 key2
返回 key1相对于key2的差集(key1有,key2没有)
SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中(key1有,key2没有)
SINTER key1 [key2]
返回给定所有集合的交集
SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
SUNION key1 [key2]
返回所有给定集合的并集(key1Ukey2)
SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
SSCAN key cursor [MATCH pattern] [COUNT count]
分批次遍历集合 key 中的键值对,cursor为0时表示开始一次新的遍历,每次遍历返回来的cursor,作为下次遍历的cursor,直至遍历返回的cursor为0时,代表刚好结束一次完整的key遍历
特点
唯一性
差集、并集
常用应用场景
利用交并集操作,可以查找共同好友、好友推荐
利用差集操作,可以求出新增用户(例: 利用Redis集合(Set)统计新增用户和次日留存率)
利用唯一性,可以统计网站UV
有序集合(sorted set)
和集合相似(一个key,N个value,value唯一),不同点是每个元素都会关联一个double类型的分数,Redis通过分数为集合成员进行排序
常用指令
ZADD key score1 value1 [score2 value2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key
获取有序集合的成员数
ZCOUNT key min max
计算在指定区间内的成员数
ZINCRBY key increment value
对指定成员加上增量increment
ZINTERSTORE newKey numbers key1 key2
将key1、key2的交集存入newKey中,newKey中元素的分数是key1和key2中分数之和(使用时一定要指定正确的 Key Number)
ZLEXCOUNT key min max
当元素的分数都相等时,此命令返回指定字符区间之内的元素(如:ZLEXCOUNT z1 [a [c 在z1有序集合所有元素分数相同的情况下,返回z1中a~c之间的元素)
ZRANGE key start stop
返回指定索引区间的元素(下标参数start``stop都以0为底)
ZRANGEBYLEX key min max
返回指定字典区间内的元素(例:ZRANGEBYLEX Z1 [a [b返回集合Z1中a到b之间的元素)
ZRANGEBUSCORE key min max
返回指定分数之间的元素
ZRANK key value
返回有序集合中指定元素的索引
ZREM key value
移除有序集合中的指定成员
ZREMRANGEBYLEX key min max
删除指定字典区间的元素
ZREMRANGEBYRANK key start stop
删除指定索引区间内的元素
ZREMRANGEBYSCORE key min max
删除指定分数区间的所有元素
ZREVRANGE key start stop
返回指定索引区间内的成员,分数从高到低
ZREVRANGEBYSCORE key max min
返回指定分数区间的成员,分数从高到低
ZREVRANK key member
返回有序集合中指定元素的排名(排名由分数值从大到小排列,分数最大的元素排名为0)
ZSCORE key value
返回指定元素的分数
ZUNIONSTORE newKey numkeys key [key ...]
计算给定的有序集合的并集,并存储在newKey中
ZSCAN key cursor [MATCH pattern] [COUNT count]
分批次遍历有序集合 key 中的键值对,cursor为0时表示开始一次新的遍历,每次遍历返回来的cursor,作为下次遍历的cursor,直至遍历返回的cursor为0时,代表刚好结束一次完整的key遍历
特点
可以按照索引、字典区间、分数区间3个不同的维度取数据、删数据
可以自定义数据的顺序
可求并集、交集
应用场景
带权重的队列(List只是按照时间排序的队列,有序集合可以实现自定义权重的队列)
列出游戏中前100名高分的选手
利用区间取值和排序的功能,可以用做分页