Redis初步教程

Redis初步教程

安装

下载、安装

下载: 官网地址

tar zxvf redis-xxxx.tar.gz
ln -s redis-xxxx redis # 建立版本号无关的软链接
cd redis
make
make install

默认安装到/usr/local/bin目录下

可执行文件如下:

可执行文件作用
redis-server启动redis
redis-cliredis命令行客户端
redis-benchmarkredis基准测试工具
redis-check-aofredis AOF持久化文件检测和修复工具
redis-check-dumpredis RDB持久化文件先检测和修复工具
redis-sentinel启动redis sentinel

启动服务端

三种方式启动:

  1. 默认配置:

    redis-server
  2. 运行启动:加上要修改的配置键值对,没设置的使用默认设置

    redis-server --configKey1 configValue1 --configKey2 configValue2
  3. 配置文件启动:例如放到/opt/redis/redis.conf中

    redis-server /opt/redis/redis.conf

redis有60多个配置,基本配置项如下:

配置名配置说明
port端口
logfile日志文件
dirredis工作目录(存放持久化文件和日志文件)
daemonize是否以守护进程的方式启动redis

配置文件以redis.conf为模板进行修改

启动客户端

进入交互式命令行

redis-cli -h{host} -p{port}

直接获取命令结果

redis-cli -h{host} -p{port} {command}

host默认127.0.0.1port默认6379

停止服务

redis-cli shutdown [nosave|save]

nosave/save表示是否生产持久化文件

API入门

常用命令

命令说明
keys *查看所有键
dbsize键总数
rpush val1 val2…插入list
exists key键是否存在,存在返回1,否则0
del key [key…]删除key,返回成功删除的key个数
expire key seconds键过期秒数
ttl key返回key剩余过期时间>0, -1 无过期, -2 不存在
type键类型,不存在返回none

数据结构

5种对外数据结构

类型说明内部编码
string字符串raw, int, embstr
hash哈希hashtable, ziplist
list列表linkedlist, ziplist, quicklist
set集合hashtable, intset
zset有续集和skiplist, ziplist

查看内部编码实现:

object encoding key

为什么快

  • 纯内存访问
  • 非阻塞I/O:使用epoll作为I/O多路复用
  • 单线程:避免线程切换和竞态消耗

单线程的问题:对每个命令执行时间有要求,如果某个命令执行过长,会阻塞其他命令

redis是面向快速执行场景的数据库

数据结构详解

string

最大不超过512MB

命令

  1. 设置

    set key value [ex seconds] [px milliseconds] [nx|xx]

    ex, px分别用于设置秒级和毫秒级过期时间

    nx key不存在才能设置(用于添加), xx key存在才能设置(用于更新)

    setex key seconds value
    setnx key value 可用作分布式锁 参见 http://redis.io/topics/distlock

  2. 获取:不存在返回nil

    get key

  3. 批量

    mset key value [key value …]

    mget key [key …]

  4. 计数

    incr key 自增,不是整数返回错误

    decr

    incrby

    decrby

    incrbyfloat

  5. 不常用

    append key value 字符串末尾追加

    strlen key

    getset key value 设置并返回旧值

    setrange key offset value 设置指定位置的值

    get range key start end

内部编码

  1. int: 8字节长整型
  2. embstr: <= 39 byte 字符串
  3. raw: > 39 byte 字符串

典型应用场景

  1. 缓存
  2. 计数
  3. 共享session
  4. 限速

hash

value本身又是键值对结构:field-value

命令

  1. 设置

    hset key field value 成功返回1,否则0

    hsetnx key field value 类比setnx,不存在才能设置

  2. 获取

    hget key field 不存在返回nil

    hkeys key 获取所有field

    hvals key 获取所有value

    hgetall key 获取所有的field-value,元素过多可能会组设redis,使用hmget或者hscan

  3. 删除

    hdel key field [field …] 删除一个或多个field,返回成功个数

  4. 计算field个数

    hlen key

  5. 批量

    hmget key field [field …]

    hmset key field value [field value …]

  6. 判断field存在

    hexists key field 存在返回1,否在返回0

  7. 计数

    hincrby key field

    hincrbyfloat key field

  8. 计算value字符串长度

    hstrlen key field

内部编码

  1. ziplist: 压缩列表,hash元素个数小于hash-max-ziplist-entries(默认512个)、同时所有值都小于hash-max-ziplist-value(默认64 byte)时使用,更加紧凑实现多个元素连续存储,比hashtable省内存
  2. hashtable: 不满足ziplist条件则使用hashtable,其读写时间复杂度为 O(1) O ( 1 )

list

用来存储多个有序字符串,一个列表最多存储 2321 2 32 − 1 个元素

操作类型

操作类型操作
rpush, lpush, linsert
lpop, rpop, lrem, ltrim
lset
lrange, lindex, llen
阻塞blpop, brpop

1. 添加

>   rpush key value \[value ...\] 右插入
>
>   lpush key value \[value ...\] 左插入
>
>   linsert key before | after pivot value 向某个元素前或后插入
  1. 查找

    lrange key start end 获取指定范围内的元素列表,从左到右0到N-1,反之-1到-N

    lrange listkey 0 -1从左到右获取所有元素

    lindex key index 获取指定索引下标的元素

    llen key 获取列表长度

  2. 删除

    lpop key 左侧弹出

    rpop key 右侧弹出

    lrem key count value 删除指定元素,count>0从左到右最多count个,<0从从右到左,=0删所有

    ltrim key start end 按索引范围修剪列表,保留范围内的

  3. 修改

    lset key index newValue 修改指定下标元素

  4. 阻塞弹出, 阻塞到列表有数据返回,或者超时返回,timeout为0则一直阻塞

    blpop key [key …] timeout

    brpop key [key …] timeout

    如果是多个key,则从左至右遍历key,某个key可返回就返回

内部编码

  1. ziplist: 当列表元素个数小于list-max-ziplist-entries(默认512个),同时每个元素值小于list-max-ziplist-value(默认64 byte)时,使用ziplist为list内部实现,减少内存使用
  2. linkedlist: 无法满足ziplist条件时,使用linkedlist为内部实现
  3. quicklist: v3.2提供,结合了ziplist 和 linkedlist的优势

使用场景

  1. 消息队列:一个lpush多个brpop
  2. 文章列表

    • lpush+lpop = Stack(栈)
    • lpush+rpop = Queue(队列)
    • plush+ltrim = Capped Collection(有限集合)
    • lpush+brpop = Message Queue(消息队列)

set

set用于保存多个不重复的字符串元素,元素无序,最多 2321 2 32 − 1 个元素

支持增删改查以及交并差集

  1. 集合内操作:

    添加

    sadd key element [element …] 返回成功添加个数

    删除

    srem key element [element …] 返回成功删除个数

    个数

    scard key

    判断存在

    sismember key element 存在返回1,否则返回0

    随机返回指定个数

    srandmember key [count] 默认返回一个,不会删除

    随机弹出

    spop key [count] 3.2开始支持count参数,会删除

    取所有元素

    smembers key 元素过多可能阻塞,使用sscan

  2. 集合间操作

    求交集

    sinter key [key …]

    求并集

    sunion key [key …]

    求差集

    sdiff key [key …]

    保存交并差的结果

    sinterstore destination key [key …]

    sunionstore destination key [key …]

    sdiffstore destination key [key …]

内部编码

  1. intset: 整数集合,集合中元素都是整数且元素个数小于set-max-intset-entries(默认512)时,使用intset作为内部实现,减少内存使用
  2. hashtable: 哈希表,无法满足intset条件时,使用hashtable

使用场景

  1. tag:获取共同喜好

    • sadd=Tagging(标签)
    • spop/srandmember=Random item(生成随机数,比如抽奖)
    • sadd+sinter=Social Graph(社交需求)

zset

zset中的元素不能重复但是可以排序,使用score排序

集合内

添加成员

zadd key [nx|xx] [ch] [incr] score member [score member …] 返回成功添加个数

nx xx 同前面,分别用于添加和更新,ch返回元素和分数变化个数,incr对score做增加

计算个数

zcard key

计算分数

zscore key member

计算排名

zrank key member 从低到高

zrevrank key member 从高到低

删除

zrem key member [member …]

增加分数

zincrby key increment member

返回指定排名范围成员

zrange key start end [withscores]

zrevrange key start end [withscores]

返回指定分数范围成员

zrangebyscore key min max [withscores] [limit offset count]

zrevrangebyscore key min max [withscores] [limit offset count]

返回指定分数范围成员个数

zcount key min max

删除指定排名内的升序元素

zremrangebyrank key start end

删除指定分数范围的成员

zremrangebyscore key min max

集合间

交集

zinterstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum | min | max]

并集

zunionstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum | min | max]

内部编码

  1. ziplist: 元素个数小于zset-max-ziplist-entries(默认128),同时每个元素值小于zset-max-ziplist-value(默认64 byte)时,使用ziplist减少内存使用
  2. skiplist: 不满足ziplist条件时,使用skiplist

使用场景

排行榜系统

键管理

  1. 重命名

    rename key newkey rename前已存在则值会被覆盖

    renamenx key newkey 只有newkey不存在时才能成功

    重命名会执行del,如果value比较大可能会阻塞redis

  2. 随机返回key

    randomkey

  3. 键过期

    expire key seconds

    ttl key

    expireat key timestamp 键在秒级时间戳timestamp后过期

    pexpire key milliseconds

    pexpireat key milliseconds-timestamp

    pttl key 查看毫秒级的过期时间

    persist key 清除过期时间

    key不存在返回0,过期为负值立即删除,persist将过期时间清除

    对字符串类型key,执行set会去掉过期时间

    redis不支持二级数据结构内部元素的过期功能

    setex作为set+expire组合,为原子执行,且减少了一次网络通讯

  4. 键迁移

    move key db

    redis内部数据迁移,redis内部可以有多个数据库(不建议生产环境使用)

    dump key

    restore key ttl value

    在不同 redis间进行数据迁移,由客户端分步完成,非原子性

    migrate host port key|”” destination-db timeout [copy] [replace] [keys key [key …]]

    不同redis间迁移,组合dump, restore, del,具有原子性,数据在两个redis上传输

  5. 遍历键

    keys pattern 全量遍历

    通配符: * ? []

    scan cursor [match pattern] [count number] 渐进式遍历

    对应 hash, set ,zset的 hgetall, smembers, zrange分别为hscan, sscan, zscan

    scan的过程中键有变化可能会有为

数据库管理

  1. 切换数据库

    select dbIndex 默认配置16个数据库databases 16

    redis 3.0逐渐弱化该功能,redis-cluster只允许使用0号数据库

  2. 清除数据库

    flushdb 清除当前数据库

    flushall 清除所有数据库

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值