API

通用

字符串类型

屏幕截图 2020-09-26 145223

set key value [ex seconds] [px milliseconds] [nx|xx] # 设置值
# ex 以秒为单位的过期时间
# px 毫秒单位的过期时间
# nx:set if not exists
# xx set if exists
get key # 获取值

mset name cxk age 18 # 批量设置值
mget name age # 批量获取值

incr a # 自增1
incrby a 15 # 自增指定值
decrby a 15 # 自减指定值
incrbyfloat a 10.5 # 自增浮点数

append name jntm # 字符串追加值
strlen name # 获取字符串长度
set name 蔡徐坤
strlen name # redis将中文序列化为byte数组 中文的长度取决于终端的编码集
getset name world # 设置新值并返回旧值
setrange name 2 kd # 从指定位置设置字符串
getrange name 0 -1 # 获取指定范围的字符串

屏幕截图 2020-09-24 143108

bitmap

这个数据类型适合用来处理海量数据

setbit map 5 1 # 将偏移量为5的bit设置为1 在第一次初始化Bitmaps时,假如偏移量非常大,那么整个初始化过程执行会比较慢,可能会造成Redis的阻塞
getbit map 5 # 获取偏移量为5的值
bitcount map 0 -1 # 获取指定范围内1的个数
bitop and|or|not|xor ret map map1 # bitmap 集合运算
bitpos map 1 # bitmap 第一个值为1的bit的偏移量

例子:

统计某个时间窗口内的登录天数

setbit cxk 1 1 # 第一天登录
setbit cxk 364 1 # 第364天登录
bitcount cxk 0 10 # 0 - 10天这个时间窗口登录了几天

统计某个时间窗口活跃用户数

setbit 200618 1 1 # 18号1号用户登录
setbit 200619 1 1 # 19号1号用户登录
setbit 200619 7 1 # 19号7号用户登录
bitop or ret 200618 200619 # 使用或运算合并bit
bitcount ret 0 0 # 统计有多少位1

HyperLogLog

通过HyperLogLog可以利用极小的内存空间完成大量元素的独立总数的统计

用小空间来估算如此巨大的数据,其中一定存在误差率(类似于布隆过滤器)

使用这个来估算数据 可以容忍一定的误差率

pfadd users user1 user2 user3 user4 # 添加元素
pfcount users # 统计个数

哈希类型

屏幕截图 2020-09-26 145321

hset user:1 name cxk age 18 # 设置field
hsetnx user:1 name cxk # set if not exists
hget user:1 name # 获取field
hdel user:1 name age # 删除field
hlen user:1 # 计算field个数
hmget user:1 name age # 批量获取field
hexists user:1 name # 判断field是否存在
hkeys user:1 # 获取所有field名称
hvals user:1 # 获取所有field value
hgetall user:1 # 获取全部kv对
hincrby user:1 age 1 # 对指定field自增
hincrbyfloat user:1 age 1.5 # 浮点数自增

内部编码:

使用场景:

列表类型

屏幕截图 2020-09-26 145350

内部编码:

使用场景:

屏幕截图 2020-09-24 153949

其他:

·lpush+lpop=Stack ·lpush+rpop=Queue ·lpsh+ltrim=Capped Collection ·lpush+brpop=Message Queue

集合类型

屏幕截图 2020-09-26 145411

sadd set a b c # 添加元素
srem set b # 删除元素
scard set # 计算元素个数(维护一个变量得到)
sismember set c # 判断元素是否在集合内
srandmember set 2 # 随机从集合返回指定个数元素
# 正数:取出一个去重的结果集(不能超过已有集)
# 负数:取出一个带重复的结果集,一定满足你要的数量
# 如果:0,不返回
spop set 1 # 随机弹出元素
smembers set # 获取所有元素

sinter s1 s2 # 求交集
sunion s1 s2 # 求并集
sdiff s1 s2 # 求差集
sinterstore s3 s1 s2 # 交集结果存储到s3
# ...

内部编码:

例子:用户标签

sadd user1 food movie sport music
sadd user2 food music network
sinter user1 user2 # 计算用户共同感兴趣的标签

例子:抽奖

sadd k 1 2 3 4 5 6 7 8 9 # 9个用户
SRANDMEMBER k 3 # 抽取三个不重复用户
SRANDMEMBER k -3 # 抽取三个可能会重复的用户

有序集合类型

屏幕截图 2020-09-26 145503

help @sorted_set

批注 2020-06-19 113509

物理内存左小右大

zadd users 251 tom # 添加成员 分数251
zcard users # 计算成员个数
zscore users tom # 获取某个成员分数
zrank users tom # 计算某个成员排名
zrem users tom # 删除成员
zincrby users 8 jerry # 增加某个成员的分数
zrange users 0 10 # 正序返回指定排名范围的成员
zrevrange users 0 10 # 倒序返回指定排名范围的成员
zrangebyscore users 0 255 # 正序返回指定分数范围的成员
zrevrangebyscore users 0 255 # 正序返回指定分数范围的成员
zcount users 0 255 # 计算指定分数范围的成员个数
zremrangebyrank users 0 1 # 删除指定排名范围内的成员
zremrangebyscore users 0 10 # 删除指定分数范围内的成员

zinterstore user:ranking:1_inter_2 2 user:ranking:1 user:ranking:2 weights 1 0.5 aggregate max # 并集

内部数据结构:

例子:点赞

zadd video 0 cxk # cxk发布了一个视频 0赞
zincrby video 1 cxk # 有人给cxk视频点了一个赞
zrem video cxk # 清空cxk的视频点赞
zrevrange video 0 9 # 获取点赞排行榜

键管理

单键管理:

rename name newname # 键重命名
randomkey # 随机返回数据库里的一个键
expire name 10 # 设置键10秒后过期
expireat name timestamp # 设置键在指定时间戳后过期
# 对于字符串 set 会清除其过期时间
# Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能
persist name # 去除键的过期时间

键迁移:

遍历键:

keys * # 获取所有键 如果Redis包含了大量的键,执行keys命令很可能会造成Redis阻塞
scan 0 # 渐进式遍历 该命令返回两个部分:1. 下一个游标 2. 遍历结果
# 如果要继续遍历 下一次scan后面接的就是返回的游标

数据库管理:

select 2 # 切换到2号数据库
flushdb # 清空数据库 如果当前数据库键值数量比较多,flushdb/flushall存在阻塞Redis的可能
flushall

Redis3.0后已经逐渐弱化多数据库这个功能