Redis的基础介绍与API详解
常识性的知识介绍 磁盘和内存的对比 磁盘: 1.寻址: 毫秒级 2.带宽:一般情况下是G/M 内存: 1.寻址: 纳秒级 2.带宽:很大很大 秒>毫秒>微秒>纳秒 磁盘比内存在寻址上慢了10W倍
I/O buffer:成本问题 磁盘与磁道,扇区,一扇区 512Byte带来一个成本变大:索引 4K 操作系统,无论你读多少,都是最少4k从磁盘拿
MemCache和Redis的对比
MemCache: k-v结构,value没有类型概念,不能持久化,不够灵活 Redis : k-v结构,value有类型概念(String,List,Hash,Set,Sorted Set),能够持久化,非常灵活可以操作某个value的单个元素
Redis API
String
字符串
- GET key:获取key的值
- SET key value:设置key的值value
- APPEND key value:把value追加到存在key的值末尾
- SETRANGE key offset value:从offset位置起覆盖并追加value
- GETRANGE key start end:返回 key 中字符串值的子字符
- STRLEN key:返回 key 所储存的字符串值的长度。
- SETNX key value :只有在key不存在时才能设置value. 使用场景:一般用于分布式锁
数值类型
INCR和DECR使用场景 抢购,秒杀,详情页,点赞,评论 规避并发下 对数据库的事务操作 完全由redis内存操作代替
- INCR key:给key的数值增加1
- INCRBY key increment:给key的数值增加increment
- DECR key:给key的数值减少1
- DECRBY key decrement:给key的数值减少decrement
BitMap
- SETBIT key offset value:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
- GETBIT key offset:获取key的offset偏移量的bit位的值
- BITCOUNT key [start end]:获取key字符串类型的值的bit位是1的个数 使用场景:统计用户登录天数(时间窗口随机的情况下优势更大) 思路,一般情况下,我们把一个年份和用户的id或者名称等作为key(要求唯一性),把每一个bit位当作一天,哪一天登录了就修改成1. 一般操作步骤: 1.setbit sean 1 1 ,setbit sean 7 1 ,setbit sean 364 1 2.STRLEN sean 3.BITCOUNT sean -2 -1
- BITTOP operation destkey key [key …] BITOP AND destkey k1 k2 k3 … kN ,对一个或多个 key 求逻辑与,并将结果 保存到 destkey 。逻辑与两个都是1才是1 BITOP OR destkey k1 k2 k3 … kN,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。 逻辑或两个都是0才是0,一般可以用作去重操作 BITOP XOR destkey k1 k2 k3 … kN,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。两个位相同位0,不同为1 BITOP NOT destkey k,对给定 key 求逻辑非,并将结果保存到 destkey 。 使用场景:活跃用户统计!随即窗口 求某个时间段有多少用户活跃 一般的思想是key是时间,bit位代表id是几的用户是否活跃 操作步骤: setbit 20190101 1 1 setbit 20190102 1 1 setbit 20190102 7 1 bitop or destkey 20190101 20190102 BITCOUNT destkey 0 -1
List
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的左边或者右边。列 表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
-
BLPOP key1 [key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
-
BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
-
BRPOPLPUSH source destination timeout 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
-
LINDEX key index 通过索引获取列表中的元素
-
LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素
-
LLEN key 获取列表长度
-
LPOP key 移出并获取列表的第一个元素
-
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
-
LPUSHX key value 将一个值插入到已存在的列表头部
-
LRANGE key start stop 获取列表指定范围内的元素
-
LREM key count value 移除列表元素
-
LSET key index value 通过索引设置列表元素的值
-
LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
-
RPOP key 移除并获取列表最后一个元素
-
RPOPLPUSH source destination 移除列表的最后一个元素,并将该元素添加到另一个列表并返回
-
RPUSH key value1 [value2] 在列表中添加一个或多个值
-
RPUSHX key value 为已存在的列表添加值
Hash
-
HDEL key field1 [field2] 删除一个或多个哈希表字段
-
HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
-
HGET key field 获取存储在哈希表中指定字段的值。
-
HGETALL key 获取在哈希表中指定 key 的所有字段和值
-
HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。
-
HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
-
HKEYS key 获取所有哈希表中的字段
-
HLEN key 获取哈希表中字段的数量
-
HMGET key field1 [field2] 获取所有给定字段的值
-
HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
-
HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
-
HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。
-
HVALS key 获取哈希表中所有值
-
HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的键值对。
Set
-
SADD key member1 [member2] 向集合添加一个或多个成员
-
SCARD key 获取集合的成员数
-
SDIFF key1 [key2] 返回给定所有集合的差集
-
SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
-
SINTER key1 [key2] 返回给定所有集合的交集
-
SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
-
SISMEMBER key member 判断 member 元素是否是集合 key 的成员
-
SMEMBERS key 返回集合中的所有成员
-
SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
-
SPOP key
移除并返回集合中的一个随机元素
-
SRANDMEMBER key [count]
返回集合中一个或多个随机数
-
SREM key member1 [member2]
移除集合中一个或多个成员
-
SUNION key1 [key2]
返回所有给定集合的并集
-
SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
-
SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
ZSet
zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 zset的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。 底层原理:skipList 跳表思想 时间复杂度从On-->Ologn
-
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
-
ZCARD key 获取有序集合的成员数
-
ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
-
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
-
ZINTERSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
-
ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
-
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员
-
ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
-
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
-
ZRANK key member 返回有序集合中指定成员的索引
-
ZREM key member [member ...] 移除有序集合中的一个或多个成员
-
ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
-
ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
-
ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
-
ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底
-
ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
-
ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
-
ZSCORE key member 返回有序集中,成员的分数值
-
ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
-
ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)