跳到主要内容

Redis初探


  1. Redis 安装
  2. Redis 基础配置
  3. 通用的命令
  4. 常用的数据类型

Redis 安装

本文采用6.2.6版本进行编写

  1. 下载地址:https://download.redis.io/releases/redis-6.2.6.tar.gz

  2. 进行解压

    tar -zxvf redis-6.2.6.tar.gz
    cd redis-6.2.6
  3. 编译测试

    make test

    编译结果如下,才代表编译成功

     All tests passed without errors!
  4. 执行安装

    # PREFIX = 文件路径,默认为/usr/local/bin下面
    make install PREFIX=/home/redis
  5. 安装完成,上面的目录下的bin有如下内容

    • redis-benchmark 性能测试
    • redis-check-aof -> redis-server aof文件校验
    • redis-check-rdb -> redis-server rdb文件校验
    • redis-cli 客户端应用
    • redis-sentinel -> redis-server 哨兵应用
    • redis-server 服务应用
  6. 复制配置文件,配置文件放到conf文件夹下面

    # 安装目录
    cd /home/redis
    # 创建conf目录
    mkdir conf
    # 拷贝redis.conf
    cp redis-6.2.6/redis.conf ./conf/
  7. 启动redis-server 服务应用

    # 此种采用当前窗口进行启动
    ./bin/redis-server ./conf/redis.conf

Redis 基础配置

在此只介绍基础配置,其他配置在后续中介绍,redis.conf

## 网络配置
# 绑定IP
bind 127.0.0.1 -::1
# 端口
port 6379
# 保护模式,默认启用,当没有绑定IP和没有设置密码时生效,只能本地访问,限制外网访问
protected-mode yes

## 一般配置
# 后台运行
daemonize no
# 密码
requirepass xxxx
# 数据库,默认是16
databases 16

通用的命令

命令说明时间复杂度
TYPE key获取key类型O(1)
OBJECT ENCODING key获取key的内部存储结构O(1)
DEL key [key]删除keyO(1)/O(N/M)
EXPIRE key seconds设置key的过期时间,时间单位为秒O(1)
TTL keykey的存活时间(秒)O(1)
PTTL keykey的存活时间(毫秒)O(1)
EXISTS key判断key是否存在O(1)
SCAN cusor MATCH pattern COUNT count TYPE type根据游标遍历,cursor 初始值为0 ,match 匹配可能返回没有元素 TYPE key类型,等返回的游标为0就代表结束O(1)

常用的数据类型

String类型

常用命令

命令说明时间复杂度
GET key获取值O(1)
GETDEL key获取并删除值O(1)
GETEX key EX(AT)/PX(AX)/PERSIST获取值并更新过期时间 EX为秒,PX为毫秒 AT 为具体时间对应的秒和毫秒 PERSIST 移除过期时间O(1)
GETRANGE key start end截取值信息O(1)
GETSET key value获取旧值放入新值O(1)
MGET key [key]批量获取值O(N)
SET key value EX(AT)/PX(AX) NX/XX GET放入值 EX为秒,PX为毫秒 AT 为具体时间对应的秒和毫秒 NX 不存在放入 XX 存在放入 GET 返回旧值O(1)
SETEX key seconds value放入带过期时间(秒)的值O(1)
SETNX key value值不存在的时候放入O(1)
SETRANGE key offset value在位置offset放入值O(1)/O(M)
MSET key value [key value]批量放入多个值O(N)
MSETNX key value [key value]批量放入多个不存在的值,有一个值存在都不处理,返回0O(N)
PSETEX key milliseconds value放入带过期时间(毫秒)的值O(1)
STRLEN key值的长度O(1)
APPEND key value值拼接O(1)
DECR key64位整数值 -1O(1)
DECRBY key decrement64位整数值 -decrementO(1)
INCR key64位整数值 +1O(1)
INCRBY key increment64位整数值 + incrementO(1)
INCRBYFLOAT key increment整数值 + increment/17位的小数O(1)

使用场景

  1. 通用的缓存(比如session等)
  2. 分布式锁(NX)
  3. 计数/限流/唯一序列

List类型

常用命令

命令说明时间复杂度
LPUSH key element [element]左边入对元素O(N)
LPUSHX key element [element]key存在的时候左边入队元素O(N)
LRANGE key start stop获取范围的元素,-1表示最大O(S+N)
LREM key count element删除元素(count = 0 删除所有等于element的元素,整数是从头到尾删除,负数是从尾到头删除)O(N+M)
LSET key index element改变index位置的元素O(N)
LTRIM key start stop保留范围内的元素O(N)
LPOS key element RANK COUNT MAXLEN查找元素的位置,RANK 表示查第几个元素,COUNT 元素的个数,MAXLEN 检索队列的长度O(N)
LPOP key count左边出队count元素O(N)
LMOVE source destination LEFT| RIGHT LEFT| RIGHT从源左边/右边出队到目标左边/右边入队O(1)
LLEN key元素个数O(1)
LINSERT key BEFORE/AFTER pivot element在pivot 之前/之后插入元素O(N)
LINDEX key indexindex位置的元素出队O(N)
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout阻塞从源左边/右边出队到目标左边/右边入队O(1)
BLPOP key [key] timeout阻塞左边出队O(N)
BRPOP key [key] timeout阻塞右边出队O(N)
BRPOPLPUSH source destination timeout阻塞从源右边出队目标左边入队O(1)
RPOP key count右边出队count元素O(N)
RPOPLPUSH source destination从源右边出队目标左边入队O(1)
RPUSH key element [element]右边入对元素O(N)
RPUSHX key element [element]key存在的时候右边入队元素O(N)

使用场景

  • 消息队列
  • 限制数量的列表(比如100条的慢日志)

Stream类型

常用命令

命令说明时间复杂度
XADD key NOMKSTREAM MAXLEN|MINID =/~ threshold LIMIT count *|id field value [field value]添加队列消息信息 NOMKSTREAM 不自动创建key MAXLEN 最大长度 MINID 最小IDO(N)
XREAD COUNT count BLOCK milliseconds STREAMS key [key] id [id]读取消息,id表示从哪个消息读取,从头读取为0-0,从当前读取为$O(N)
XINFO STREAM key FULL COUNT count队列的信息,默认值显示第一条和最后一条消息O(1)
XDEL key id [id]删除对应id的信息O(1)
XLEN key消息的长度O(1)
XRANGE key start end COUNT count范围内的消息,- 最小值 + 最大值O(N)
XREVRANGE key end start COUNT count范围内的消息逆序,- 最小值 + 最大值O(N)
XTRIM key MAXLEN|MINID =|~ threshold LIMIT count截断消息O(N)
XGROUP CREATE key groupname id|$ MKSTREAM消息队列创建组O(1)
XGROUP CREATECONSUMER key groupname consumername创建组的消费者O(1)
XGROUP DELCONSUMER key groupname consumername删除组的消费者O(1)
XGROUP DESTROY key groupname消息队列删除组O(1)
XGROUP SETID key groupname id|$设置组的起始消息ID,0为从头开始O(1)
XINFO GROUPS key显示所有消费组O(1)
XINFO CONSUMERS key groupname消费组的所有消费者O(1)
XREADGROUP GROUP group consumer COUNT count BLOCK milliseconds NOACK STREAMS key [key] id [id]消费组内读取消息,NOACK 不确认,>为起始idO(M)
XACK key group id [id]消息确认O(N)
XPENDING key group IDLE min-idle-time start end count consumer获取未确认消息O(N)

使用场景

  • 消息队列

Set类型

常用命令

命令说明时间复杂度
SADD key member [member]添加元素O(N)
SCARD key元素个数O(1)
SDIFF key [key]获取key在后面key中不同的元素O(N)
SDIFFSTORE destination key [key]获取不同的元素并存入集合O(N)
SINTER key [key]获取交集O(N * M)
SINTERSTORE destination key [key]获取交集并存入结合O(N * M)
SISMEMBER key member判断元素是否存在O(1)
SMEMBERS key返回所有元素O(N)
MSISMEMBER key member [member]判断多个元素是否存在O(N)
SMOVE source destination member从源移动元素到目标O(1)
SPOP key [count]随机出队多元素O(N)
SRANDMEMBER key [count]随机获取元素,不出队O(N)
SREM key member [member]移除元素O(N)
SSCAN key curson [pattern] COUNT遍历元素O(1)
SUNION key [key]获取并集O(N)
SUNIONSTORE destination key [key]获取并集并存入集合O(N)

使用场景

  • 标签
  • 不重复的集合信息

SortedSet类型

常用命令

命令说明时间复杂度
ZADD key NX/XX GT/LT CH INCR score member [score member]添加排序元素 NX 只新增 XX 只更新 GT 更新大于得分 LT 更新小于得分 CH 添加和修改总数(默认值返回添加的总数) INCR 递增得分O(log(N))
ZCARD key元素的个数O(1)
ZCOUNT key min max得分在区间的元素个数O(log(N))
ZDIFF numberkeys key [key] WITHSCORES比较多个key不同的元素O(L+(N-K)log(N))
ZDIFFSTORE destination numberkeys key [key]比较多个key不同的元素并存入集合O(L+(N-K)log(N))
ZINCREBY key increment member元素得分递增incrementO(log(N))
ZINTER numberkeys key [key] WEIGHTS AGGREGATE SUM|MIN|MAX WITHSCORES多个key的交集 WEIGHT 得分权重 AGGREGATE 聚合,默认是SUMO(NK)+O(Mlog(M))
ZINTERSTORE destination numberkeys key [key] WEIGHTS AGGREGATE SUM多个key的交集并存入集合O(NK)+O(Mlog(M))
ZLEXCOUNT key min max根据元素范围(得分排序后)获取元素个数,min 最小值 - ,max 最大值 + , 其他字符必须以( [开头,表示不包含和包含O(log(N))
ZMSCORE key member [member]批量获取元素得分O(N)
ZPOPMAX key count出队最大得分元素 count 默认值 1O(Mlog(N)
ZPOPMIN key count出队最晓得分元素 count 默认值 1O(Mlog(N)
ZRANDMEMBER key count WITHSCORES随机获取count元素,正数会去重,负数会重复O(N)
ZRANGE key min max BYSCORE|BYLEX REV LIMIT offset count WITHSCORES根据得分排序,得分一样根据元素排序 REV 倒排序 获取元素O(log(N)+M)
ZRANGBYLEX key min max LIMIT offset count(根据得分排序,得分一样根据元素排序)根据元素范围获取元素 min 最小值 - ,max 最大值 + , 其他字符必须以( [开头,表示不包含和包含O(log(N)+M)
ZRANGBYSCORE key min max WITHSCORES LIMIT offset count根据元素的得分范围获取元素 -inf 最小 +inf 最大,默认是包含得分,不包含是使用(前缀O(log(N)+M)
ZRANGESTORE dst src min max BYSCORE|BYLEX REV LIMIT offset count WITHSCORES根据得分排序,得分一样根据元素排序 REV 倒排序 获取元素并存入集合O(log(N)+M)
ZRANK key member元素的排名,最低排名为0O(log(N))
ZREM key member [member]元素出队O(Mlog(N)
ZREMRANGEBYLEX key min max根据元素范围出队,O(log(N)+M)
ZREMRANGEBYRANK key min max根据元素排名出队,-1 最高排名O(log(N)+M)
ZREMRANGEBYSCORE key min max根据得分名出队O(log(N)+M)
ZREVRANGE key start top WITHSCORES得分反排序,-1 最大值O(log(N)+M)
ZREVRANGEBYLEX key max min LIMIT offset count元素反排序,- 最小值 + 最大值 ( 不包含 [ 包含O(log(N)+M)
ZREVRANGEBYSOCRE key max min WITHSCORES LIMIT offset count元素反排序,-inf 最小值 +inf 最大值 ( 不包含 [ 包含O(log(N)+M)
ZREVRANK key member获取元素的倒序排名O(log(N))
ZSCAN key cursor MATCH pattern COUNT count游标方式遍历元素O(1)
ZSCORE key member获取元素得分O(1)
ZUNION numberkeys key [key] WEIGHTS AGGREGATE SUM|MIN|MAX WITHSCORES多个key的并集 WEIGHT 得分权重 AGGREGATE 聚合,默认是SUMO(N)+O(Mlog(M))
ZUNIONSTORE destination numberkeys key [key] WEIGHTS AGGREGATE SUM|MIN|MAX多个key的并集并存入集合O(N)+O(Mlog(M))

使用场景

  • 排序的列表(日排行、月排行)

Hash类型

常用命令

命令说明时间复杂度
HDEL key field [field]删除属性O(N)
HEXISTS key field判断属性是否存在O(1)
HGET key field获取某个属性的值O(1)
HGETALL key获取所有属性和值O(N)
HINCRBY key field increment属性递增increment(整数)O(1)
HINCRBYFLOAT key field increment属性递增increment(小数)O(1)
HKEYS key所有属性O(N)
HLEN key属性的数量O(1)
HMGET key field [field]批量获取多个属性O(N)
HMSET key field value [field value]批量设置多个属性值(4.0.0之后标记废弃)O(N)
HRANDFIELD key count WITHVALUES随机获取属性和值,count 正数不会重复,负数会重复O(N)
HSCAN key cusor MATCH pattern COUNT count游标方式遍历获取属性和值O(1)
HSET key field value [field value]批量放入多个值(4.0.0之前只可以单个)O(1)
HSETNX key field value没属性的时候进行创建,有不做任何处理O(1)
HSTRLEN key field属性值的长度O(1)
HVALS key获取所有的值O(1)

使用场景

  • 多个对象信息

Bitmap类型

常用命令

命令说明时间复杂度
BITCOUNT key start end值bit位的数量O(N)
BITTOP operation deskey key [key]多个key操作并存入另一个key AND/OR/XOR/NOTO(N)
BITPOS key bit start end范围内检索第一个bit的位置O(N)
GETBIT key offsetoffset位置的bit值O(1)
SETBIT key offset valueoffset位置存入bit位,value 只能为0和1,offset 为0 - 2^32-1O(1)

使用场景

  • 位图
  • 布隆过滤器

hybridloglog类型

常用命令

命令说明时间复杂度
PFADD key element [element]添加多个元素O(N)
PFCOUNT key [key]元素的个数O(N)
PFMERGE destkey sourcekey [sourcekey]多个key合并存入另一个keyO(N)

使用场景

  • 大数据量的统计

QA问题

  1. Redis安装编译报错,提示版本低了

    You need tcl 8.5 or newer in order to run the Redis test
    make[1]: *** [test] Error 1
    make[1]: Leaving directory `/home/redis/redis-6.2.6/src'
    make: *** [test] Error 2

    处理tcl后,再进行编译测试make test

    # 先查看是否已进行安装其他版本
    yum list installed | grep tcl
    # 没有的话进行
    yum install -y tcl
    make test
  2. List与Stream实现消息队列的有啥不同?

    比较元素/实现方式List方式Stream 方式
    消息保存顺序使用LPUSH/RPOP使用XADD/XREAD
    阻塞读取使用BRPOP使用XREAD BLOCK
    重复消息处理生产者自行实现全局唯一ID自动生成全局唯一ID
    消息可靠性使用BRPOPLPUSH,多维护一个队列使用PENDING List自动留存消息,使用XPENDING查看,使用XACK确认消息
    使用场景Redis 5.0前版本,消息总量小Redis 5.0后版本,消息总量大,需要消费组形式读取数据

参考文献

  1. Redis 快速启动:https://redis.io/topics/quickstart
  2. Redis 配置:https://redis.io/topics/config
  3. 数据类型汇总:https://redis.io/topics/data-types
  4. 数据类型介绍:https://redis.io/topics/data-types-intro
  5. 所有命令:https://redis.io/commands
  6. 极客时间Redis专栏:https://time.geekbang.org/column/intro/100056701?tab=catalog