redis
一.命令相关:
1.总体命令:
1.1 常用命令
- dbsize 看有多少键
- exists key 查看key是否存在 存在返回1 不存在返回0
- del key [key...] 返回成功删除key的个数
- type key 可以查看key的数据结构
- object encoding key 查看redis的内部编码
- rename key newkey 键重命名 如果在重命名之前newkey已经存在 那么会被覆盖
renamenx 这个可以确保只有newkey不存在才会被覆盖 注:(1.重命名会删掉旧的key 如果对应的value比较大可能会阻塞 2 redis3.2之前是不允许newkey==key的)
- randomkey 随机返回一个key
1.2 时间相关的命令
- expire key seconds 设置一个key的过期时间 秒级的
- ttl key 查看一个key的剩余过期时间 大于0就是剩余过期时间 -1是没设置过期时间 -2是键不存在 秒级
- expireat key timestamp 键在秒级时间戳timestamp后过期
- pexpire ky milliseconds 键在milliseconds毫秒后过期
- pttl key 查看一个key的剩余过期时间 大于0就是剩余过期时间 -1是没设置过期时间 -2是键不存在 毫秒级
- pexpireat key timestamp 键在毫秒级时间戳后过期
- 注:
- redis内部其实使用的都是pexpireat
- 如果expire key的键不存在直接返回0
- 如果过期时间为负值key会被删除
- persist可以将key的过期时间清除(相当于没设置过)
- 对于字符串类型如果执行set会去掉过期时间
1.3 遍历键
1.3.1 全局遍历
- keys pattern
- pattern可能的形式
- * 任意字符
- ?一个字符
- [] 部分字符 [1,3] [1-3] 1和3 1到3
- \x 用来转义
1.3.2 渐进遍历
- scan cursor [match pattern] [count number]
- cursor 代表游标 从0开始 每次遍历完都会返回当前游标的值 如果返回0说明遍历结束 下次scan用上次返回的值就可以
- match 代表一次遍历多少个
- 注:scan遍历可能会出现新增的键没有遍历到 或者遍历出了重复的键 需要考虑到
2.字符串类型:(key是字符串类型 value不能超过512M)
2.1设置值
- set key value [ex seconds] [px milliseconds] [nx|xx]
- nx:键必须不存在才可以设置成功,用于添加
- xx:与nx相反,键必须存在,才能设置成功用于更新
- setex key seconds values
- setnx key value(分布式锁)
- mset key value [key value ....] 批量set
2.2获取值
- get key
- mget key [key ...]
2.3计数
- incr key自增
- 键不是整数 返回错误
- 键是整数 返回自增后的结果
- 键不存在 按照值为0自增
- 还有decr(自减),incrby(自增指定数字),decrby(自减指定数字),incrbyfloat(自增浮点数)
2.4内部编码
- int 8个字节的长整形
- embstr 小于等于39个字节的字符串
- raw 大于39个字节的字符串
3哈希类型
3.1 删除filed
- hdel key field [field ...]
3.2 计算field的个数
- hlen key
3.3 判断field是否存在
- hexists key field 包含返回1 不包含返回0
3.4 获取所有的field
- hkeys key
3.5 获取所有的value
- hvals key
3.6 自增
- hincrby key field
- hincrbyfloat key field
3.7 计算value的长度
- hstrlen key field
3.8 内部编码
- 当field个数比较少(默认小于512) 且 value全部小于(默认是64)个字节 会使用ziplist
- 其他情况使用hashtable
4.列表类型:(最多存储2^32-1个元素) 列表是有序的
4.1 添加操作
- rpush key value [value ...] 从右向左插入
- lpush key value [value ...] 从左向右插入
- linsert key before|after prvot value 会在整个列表里找到prvot这个value 在这个value的 before|after 插入新的value 这个是从左往右找 并且只找一个prvot
4.2 查询操作
- lrange key start end 从左到右获取所有value 下标从左到右是0~N-1 从右到左是-1~-N,end选项会包含自身
- lindex key index 根据下标获取元素
- llen key 获取列表的长度
4.3 删除操作
- lpop key 从列表左侧弹出元素
- rpop key 从列表右侧弹出元素
- lrem key count value 在列表中找到value的元素进行删除 具体删除多少个取决于count的取值
- ltrim key start end 按照范围取start-end (如果是1 3 就代表第二个到第四个元素)
4.4 修改操作
- lset key index value 需要传入修改元素的下标
4.5 阻塞弹出
- blpop key [key ...] timeout
- brpop key [key ...] timeout 如果timeout为0就一直等 否则等timeout的秒数 如果多个key 那么从左向右遍历只要有一个key能够弹出就会返回
4.6 内部编码
- 当列表元素个数小于(默认512个) 并且每个元素的值都小于(默认64字节)的时候使用ziplist 其他情况使用linkedlist
5.集合: 集合是无序的,不能有重复元素的 一个集合最多有2^32-1个元素
5.1 添加元素
- sadd key element [element ...]
5.2 删除元素
- srem key element [element ...]
5.3 计算元素个数
- scard key 这个复杂度是o(1)
5.4 计算元素是否在集合中
- sismember key element
5.5 随机返回指定个数的元素
- srandmember key [count] count默认是1
5.6 随机弹出元素
- spop key [count] 3.2版本之后支持count参数
5.7 获取所有元素
- smembers key
5.8 集合的交并补
- sinter key [key ...] 交集
- sunion key [key ...] 并集
- sdiff key [key ...] 差集 (第一个有第二个没有的)
- sinterstore destination key [key ...] 将交集保存到destination(这个是一个新集合的key)里面 并集和差集同理 在后面加上stroe
5.9 内部编码
- intset 整数集合 如果元素小于512(可以配置 默认值是512) 且当前元素都是数字 用intset 否则用hashtable
- hashtable 哈希表
6.有序集合 有序 不可重复 有分值的概念按照分值排序
6.1 添加成员
- zadd key score member [score member ...] 有四个选项
- nx member必须不存在
- xx member 必须存在
- ch 返回此次操作后 有序集合元素和分数变化的个数
- incr 对sorce增加
6.2 计算成员个数
- zcard key 获取元素个数
6.3 获取某个成员的分数
- zscore key member
6.4 计算成员的排名
- zrank key member 分数从低到高
- zrevrank key member 分数从高到低,排名是从0开始计算 比如分数最高 那么zrevrank的结果就是0
6.5 删除成员
- zrem key member [member ...]
6.6 增加成员的分数
- zincrby key increment member 这里面increment是一个数值 为增加的具体分数
6.7 返回指定排名范围的成员
- zrange key start end [withscores]
- zrevrange key start end [withscores]
- zrange是从低到高返回 zrevrange是从高到低返回
- start和end 分别是下标 比如0 2 就代表返回前三个元素
- withscores 如果加上这个字母 就连带着分数一起返回
6.8 返回指定分数范围的成员
- zrangebyscore key min max [withscores] [limit offset count]
- zrevrangebyscore key min max [withscores] [limit offset count]
- 其中上面的是从低到高返回 下面的是从高到低
- 默认min和max都是闭区间 可以通过小括号或者中括号来设置 -inf和+inf代表无限小和无限大 比如可以 min=(200 max=+inf 就是200到正无穷不包括200 min=(200 max=(250 同理
- limit offset count 类似于mysql limit 2 5 相当于越过两个成员 并取出5个成员
6.9 返回指定分数范围的成员个数
- zcount key min max
6.10 删除
- zremrangebyrank key start end 删除指定排名内的元素
- zremrangebyscore key min max 删除指定分数范围的元素
6.11 集合间的操作
6.11.1 交集
- zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
- destination : 交集的结果保存到这个key
- numkeys 计算交集的个数
- weights weight 每个键的权重 默认是1 每个成员都会用自己的分数 * 这个权重 比如 zinterstore inter 2 k1 k2 weights 1 0.5 这个就是k1的分数和k2*0.5 最终交集取他们的和(默认是sum)
- 交集计算完了之后分值可以按照sum min max做汇总 默认是sum 这个就是说两个一样的member 最后交集的score是取max的还是min的还是sum
6.11.2 并集
- zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max] 和交集一样
6.12 内部编码
- ziplist 如果元素个数小于128 每个元素的值小于64个字节 就使用这个 否则使用skiplist (128 和 64都是默认的配置)
- skiplist
7. Bitmaps 这个东西本质是个数组 不过只能存0和1
7.1 设置值
- setbit key offset value 里面的offset就是偏移量 从0开始 value只能是0或者1 如果offset比较大可能会阻塞redis
7.2 获取值
- getbit key offset 如果没有或者本身就是0 都会返回0
7.3 获取指定范围为1的个数
- bitcount key [start end] 其中start和end对应的是字节数 而数组是位数要*8 比如 bitcount key [1,3] 其实是在找下标[8,31]
7.4 bitmaps间的运算
- bitop op destkey key [key ...] 其中的op可以为and(交集) or(并集) not(非) xor(异或)
- 会将多个key处理的结果保存到destkey中
7.5 计算bitmaps里第一个值为targetbit的偏移量
- bitpos key targetBit [start] [end]
- targetBit 只能是0或1 start和end代表的都是字节数