Redis学习记录

本文介绍了Redis,一个单线程、高并发的键值对数据库,支持多种数据类型,包括字符串、list、hash、set和sortset,并详细阐述了其持久化策略、数据操作、分布式应用及Jedis的Java操作。此外,还涵盖了RDB和AOF持久化方式的区别,以及主从复制、哨兵和集群的高级用法。
摘要由CSDN通过智能技术生成

redis简介

redis(REmote DIctionary Server)是C语言开发的一个开源的高性能的键值对(key-value)数据库。

特征

  1. 数据间没有关系
  2. 单线程工作方式
  3. 高性能
  4. 多数据类型支持
    • 字符串类型
    • list
    • hash
    • set
    • sortset5.
  5. 持久化支持

应用

  1. 热点信息
  2. 任务队列,如秒杀、抢购、购票排队
  3. 及时信息,如排行榜、在线人数、设备信号等
  4. 分布式数据共享
  5. 分布式锁

数据类型

string:

  • 添加/修改数据

    set key value

  • 添加/修改多个数据

    mset key1 value1 key2 value2...

  • 获取数据

    get key

  • 获取多个数据

    mget key1 key2...

  • 删除数据

    del key

  • 获取数据字符串长度

    stelen key

  • 追加信息(有就添加,否则新建)

    append key value

  • 数值操作

    incr key//加一

    incrby key increment//加指定值

    incrbyfloat key increment//加指定值(小数)

    decr key//减一

    incrby key increment//减指定值

  • 设置有生命周期的数据

    setex key seconds value

    psetex key milliseconds value

hash:

  • 添加/修改数据

    hset key field value

  • 添加/修改多个数据

    hmset key field1 value1 field2 value2...

  • 获取数据

    hget key field

    hgetall key

  • 获取多个数据

    hmget key field1 field2...

  • 删除数据

    hdel key field1 fields

  • 获取hash表中字段数量

    hlen key

  • 获取hash表中是否存在指定字段

    hexists key field

  • 获取hash表中所有字段名或者字段值

    hkeys key

    hvals key

  • 数值操作

    hincrby key field increment

    hincrbyfloat key field increment

  • 没有值才操作

    hsetnx key field value

list:底层使用双向列表实现

  • 添加/修改数据

    lpush key value1 value2...

    rpush key value1 value2

  • 获取数据

    lrange key start stop

    lindex key index

    llen key

  • 获取数据并移除

    lpop key

    rpop key

  • 规定时间内获取并移除数据

    blpop key1 key2 timeout

    brpop key1 key2 timeout

  • 移除指定数据

    lrem key count value

set:

  • 添加数据

    sadd key mumber1 mumber2...

  • 获取全部数据

    smembers key

  • 删除数据

    srem kay member1 member2...

  • 获取数据总量

    scard kay

  • 判断集合中是否包含指定数据

    sismember key member

  • 随机获取指定数量的数据

    srandmember key count

  • 随机获取指定数量的数据并移除

    spop key count

  • 求交并补

    sinter key1 key2

    sunion key1 key2

    sdiff key1 key2

  • 求交并补并存储到指定集合中

    sinterstore destination key1 key2

    sunionstore destination key1 key2

    sdiffstore destination key1 key2

  • 将指定数据从原始集合移动到目标集合

    `smove source destination member

sorter_set:

  • 添加数据

    zadd key score1 member1 score2 member2...

  • 获取全部数据

    zrange key start stop [withscores]

    zrevrange key start stop [withscores]

  • 删除数据

    zrem key member1 member2...

  • 按条件获取数据

    zrangebyscores key min max [withscores] [limit]

    zrevrangebyscores key min max [withscores] [limit]

  • 条件删除数据

    zremrangebyrank key start stop

    zremrangebyscore key min max

  • 获取集合数量的总量

    zcard key

    zcard key min max

  • 求交并

    zinterstore destination numkeys key [key...]

    zunionstore destination numkeys key [key...]

  • 获取数据对应的索引

    zrank key member

    zrevrank key member

  • score值的获取与修改

    zscore key member

    zincrby key increment member

key通用操作

  • 删除指定key

    del key

  • 获取key是否存在

    exists key

  • 获取key的类型

    type key

  • 为指定key设置有效期

    expire key seconds

    pexpire key milliseconds

    expireat key timestamp

    pexpireat key milliseconds-timestamp

  • 获取key的有效时间

    ttl key

    pttl key

  • 切换key从时效性转为永久性

    persist key

  • 查询key

    keys pattern //其中pattern规则:*匹配任意数量的任意字符;?匹配一个任意字符;[]匹配任意一个指定符号

  • 为key改名

    rename key newkey

    renamenx key newkey

  • 对所有key排序

    sort key

  • 获得帮助

    help @generic

数据库通用操作

  • 切换数据库

    select index

  • 其他操作

    quit

    ping

    echo message

  • 数据移动删除(相当于剪切)

    move key db-index

  • 数据清除

    flushdb

    flushall

  • 查看数据量

    dasize

Jedis

用java操作redis

  • 连接redis

    Jedis jedis = new Jedis("127.0.0.1",6379);
    
  • 操作redis

    jedis.set("name","zhangsan");
    System.out.prientln(dedis.get("name"));
    
  • 关闭redis连接

    jedis.close();
    

Linux环境下安装redis

  • 下载安装包

    wget http://download.redis.io/releases/redis-4.0.0.tar.gz
    
  • 解压

    tar -xvf redis-4.0.0.tar.gz
    
  • 编译

    make
    
  • 安装

    make install
    
  • 服务启动方式

    #默认启动
    redis-server 
    redis-server --port 6380
    #指定配置文件启动
    redis-server xxx.conf
    

持久化

RDB:保存某个时间点的快照

  • 手动命令

    save

  • 后台保存

    bgsave

  • 自动保存

    通过配置文件

    #限定时间内key的变化数量达到指定数量即进行持久化
    save seconds changes
    
    save 900 1
    save 300 10
    save 60 1000
    
  • RDB的特殊启动形式

    1. 全量复制

    2. 服务器运行过程中重启

      debug reload

    3. 关闭服务器时指定保存数据

      shutdown save

AOF(append only file):记录操作过程

存数据策略appendfsync :
  • always

    每次操作均同步到AOF文件中,零误差,性能低

  • everysec

    准确性较高,性能较高

    宕机的时候丢1秒的数据

  • no

    系统控制,过程不可控

配置
  • 开启AOF,默认不开启

    appendonly yes|no

  • 配置AOF写数据策略

    appendfsync always|everysec|no

  • 自定义文件名

    appendfilename filename

  • 文件路径

    dir path

AOF重写规则
  • 已经超时的数据不再写入

  • 忽略无效指令,只保留最终写数据的指令

  • 对同一条数据的多条写命令合并为一条

  • 指令

    1. 手动重写
      bgrewriteaof

    2. 自动重写

      • 触发条件设置

        auto-aof-rewrite-min-size size

        auto-aof-rewrite-percentage percent

      • 自动重写触发对比参数

        aof_current_size

        aof_base_size

      • 自动重写触发条件

        aof_current_size > auto-aof-rewrite-min-size

        (aof_current_size-aof_base_size)/aof_base_size >= auto-aof-rewrite-percentage

RDB和AOF的区别
持久化方式RDBAOF
占用存储空间小(数据级:压缩)大(指令集:重写)
存储速度
恢复速度
数据安全性会丢失数据依据策略决定
资源消耗高/重量级低/轻量级
启动优先级

事务

  • 开启事务

    multi

  • 执行事务

    exec

  • 取消事务

    discard

在这里插入图片描述

  • 对key添加监视锁

    watch key1 key2...

  • 取消对所有key的监视

    unwatch

分布式锁

  • 使用setnx 设置一个公共锁

    setnx lock-key value

  • 释放锁使用del

分布式锁改良

  • 使用expire为锁key添加时间限定,到时间不释放就放弃锁

    expire lock-key second

    pexpire lock-key milliseconds

删除策略

过期的数据真的删除了吗?

删除策略的目标是在内存占用和cpu占用之间寻找一种平衡

  • 定时删除

    创建一个定时器,当key设置有过期时间,时间到达时,由定时器立即执行对键的删除操作

    优点:节约内存,到时就删除,快速释放不必要的内存占用

    缺点:cpu压力大

    拿时间换空间

  • 惰性删除

    数据到达过期时间不做处理,下次访问该数据的时候再删除

    优点:节约cpu,到必须删除的时候才删除

    缺点:内存压力大,有长期占用内存的数据

    拿空间换时间

  • 定期删除

    轮询每个库,随机检测删除

逐出算法

  • 最大可用内存

    maxmemory

  • 每次选取待删除数据的个数

    maxmemory-samples

  • 删除策略

    maxmemory-policy

    • 检测易失数据

      1. volatile-lru:挑选最近最少使用的数据淘汰
      2. volatile-lfu:挑选最近使用次数最少的数据淘汰
      3. volatile-ttl:挑选将要过期的数据淘汰
      4. volatile-random:任意随机选择数据淘汰
    • 检测全库数据

      1. allkeys-lru:挑选最近最少使用的数据淘汰
      2. allkeys-lfu:挑选最近使用次数最少的数据淘汰
      3. allkeys-random:任意随机选择数据淘汰
    • 放弃数据驱逐

      no-enviction:禁止驱逐数据

服务器配置基础

  • 设置服务器以守护进程的方式进行

    daemonize yes|no

  • 绑定主机地址

    bind 127.0.0.1

  • 设置服务器端口号

    port 6379

  • 设置数据库数量

    databases 16

日志配置

  • 设置服务器指定日志级别

    loglevel debug|verbose|notice|warning

  • 日志记录文件名

    logfile 端口号.log

客户端配置

  • 最大客户端连接数

    maxclients 10

  • 客户端闲置等待最大时长

    timeout 300

多服务器快捷配置

  • 导入并加载指定配置文件信息,用于快捷创建redis公共配置较多的redis实例配置文件,便于维护

    include /path/server-端口号.conf

高级数据类型

Bitmaps

  • 获取指定key对应偏移量上的bit值

    getbit key offset

  • 设置指定key对应偏移量上的bit值,value只能是1或者0

    setbit key offset value

  • 对指定key按位进行交、并、非、异或操作,并将结果保存到destkey中

    bitop op destkey key1 key2...

    • and
    • or
    • not
    • xor
  • 统计指定key中的数量

    bitcount key [start end]

HyperLogLog

  • 添加数据

    pfadd key element1 element1...

  • 统计数据

    pfcount key1 key2...

  • 合并数据

    pfmerge destkey sourcekey1 sourcekey2...

GEO

  • 添加坐标点

    geoadd key longitude latitude member [longitude latitude member]

  • 获取坐标点

    geopos key member [member]

  • 计算坐标点距离

    geodist key member1 member2 [unit]

  • 根据坐标求范围内的数据

    georadius key longitude latitude radius m|km|ft|mi

  • 根据点求范围内的数据

    georadiusbymember key member radius m|km|ft|mi

  • 获取指定点对应的坐标hash值

    geohash key member [member]

主从复制

“三高”架构:

  • 高并发
  • 高性能
  • 高可用

将master中的数据及时有效的复制到slave中

一个master(写数据),多个slave(读数据)

作用:

  • 读写分离,提高读写负载能力
  • 负载均衡
  • 故障恢复
  • 数据冗余
  • 高可用基石

工作流程:

  1. 建立连接

在这里插入图片描述

连接方式:

  • 客户端发指令

    slaveof masterip masterport

  • 启动服务器参数

    redis-server --slaveof masterip masterport

  • 服务器配置

    slaveof masterip masterport

断开连接

slaveof no one

授权访问:

  • master配置文件设置密码

    requirepass password

  • master客户端发送命令设置密码

    config set requirepass password

    config get requirepass

  • slave客户端发送命令设置密码

    auth password

  • slave配置文件设置密码

    masterauth password

  • 启动客户端设置密码

    redis-cli -a password

  1. 数据同步
    在这里插入图片描述

  2. 命令传播
    在这里插入图片描述

心跳机制:

  • master心跳:
    • 指令:ping
    • 周期:由repl-ping-slave-period决定,默认10秒
    • 作用:判断slave是否在线
    • 查询:info replication 获取slave最后一次连接时间间隔,lag项维持在0或1视为正常
  • slave心跳
    • 指令:replconf ack{offset}
    • 周期:1秒
    • 作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
    • 作用2:判断master是否在线

哨兵

哨兵是一个分布式系统,在主从结构中当出现故障的时候投票选择新的master并将所有的slave连接到新的master。

工作原理

  1. 监控
    在这里插入图片描述

  2. 通知
    在这里插入图片描述

  3. 故障转移
    在这里插入图片描述
    在这里插入图片描述

集群

配置:

  • cluster-enabled yes
  • cluster-config-file nodes-6379.conf
  • cluster-node-timeout 30000
  • cluster-migration-barrier 1

节点操作指令:

  • 查看集群节点信息

    cluster nodes

  • 进入一个从节点redis,切换其主节点

    cluster replicate master-id

  • 发现一个新节点,新增主节点

    cluster meet ip:port

  • 忽略一个没有solt的节点

    cluster forget id

  • 手动故障转移

    cluster failover

企业级解决方案

  • 缓存预热
  • 缓存雪崩
  • 缓存击穿
  • 缓存穿透
  • 性能指标监控
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值