微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【Java从0到架构师】Redis - 基础、数据类型

Redis 原理与实战

@H_502_8@
  • Redis 基础
  • @H_502_8@
  • 为什么 Redis 这么快?
  • Redis 安装、启动
  • Redis 常用配置
  • Redis 数据类型
  • @H_502_8@
  • 通用命令
  • String - value 可以是字符串、数值、二进制、json数据
  • Hash - 存在 key-value,key 是无序的,value 是 map 结构
  • List - 元素有序、可以重复
  • Set - 元素无序、不可重复
  • ZSet - 元素根据 score 排序、不可重复
  • Java 从 0 到架构师目录:【Java从0到架构师】学习记录

    关系型数据库OracelMysqLsqlServer,DB2

    Nosql 数据库:Nosql 数据库是为了解决大规模数据集合和多重数据种类带来的挑战

    @H_502_8@
  • key-value 存储数据库:Tokyo Cabinet / Tyrant、Redis、Voldemort、Oracle BDB
  • 列存储数据库:Cassandra、HBase、Riak

    500 万条数据就会对 MysqL 性能有影响,但对列式存储数据库几乎没有影响

  • 文档性数据库::CouchDB、MongoDb、SequoiaDB(国内)
  • 图形数据库:Neo4J
  • 非关系型数据库的特点:

    @H_502_8@
  • 数据模型比较简单
  • 需要灵活性更强的应用系统
  • 数据库性能要求较高
  • 不需要高度的数据一致性
  • 对于给定 key,比较容易映射复杂值的环境
  • Redis 基础

    资料参考:

    @H_502_8@
  • Redis 在线入门:http://try.redis.io/
  • Redis 中文资料站: http://www.redis.cn/
  • Github:https://github.com/antirez/redis
  • Redis 官网:https://redis.io/
  • Redis 命令参考:http://redisdoc.com/
  • Redis一个简单的、高效的、分布式的,基于内存缓存工具,架设好服务器后,通过网络链接(类似数据库),提供 Key - Value 式缓存服务。


    拓展类型

    @H_502_8@
  • 水平拓展:在平行的基础上,增加主服务器或者从服务器
  • 垂直拓展:直接在主服务器中增加内存或者加硬盘
  • 高可用

    @H_502_8@
  • 主从形式:只有一台机器是主节点,有多台机器是从节点
  • 哨兵形式(Redis 2.x):主从模式下,有一台机器充当哨兵,监控其他机器的状态;当主节点挂了,哨兵会在从节点之间进行选举出性能较好的机器作为主节点;挂掉的主节点修复好后自动加进来变成从节点
  • 集群模式(Redis 3.x):拥有多主多从,如果其中一台主节点挂了,选举下面的从节点为主节点(无需哨兵)
  • 数据可靠性:在服务器断电之后重新启动,数据还能恢复(数据持久化)

    @H_502_8@
  • RDB:周期性的同步内存中的数据到所在的机器的硬盘上
  • AOF:将 DML 操作写到一个日志中,实时记录,断电后可以通过日志知道之前的操作

  • Reids 的特点

    @H_502_8@
  • 速度快:读数据 11w/s、写数据 8w/s
  • 丰富的数据类型:String、List、Set、Zset、Hash …
  • 原子性操作:Redis 所有操作都是原子性,要么执行成功,要么执行失败完全不执行
    多个操作也支持事务,通过 MULTI 和 EXEC 指令包起来
  • 丰富的特征:Redis 支持 publish / subscribe、通知、key 过期 等特征
  • 持久化机制
  • 高可用分布式
  • 为什么 Redis 这么快?

    @H_502_8@
  • 内存存储:所有的数据存放到内存当中(主要原因)
  • 数据处理模型:工作线程是单线程处理

    在这里插入图片描述

  • 避免上下文切换和竞态消耗
  • 使用 epoll 模型,非阻塞 IO
  • 只有工作线程是单线程(指令执行),备份和同步都是多线程的
  • Redis 安装、启动

    安装 gcc:Redis 是 C 语言编写的

    yum -y install gcc automake autoconf libtool make
    

    安装 Redis

    1. 下载 wget:http://download.redis.io/releases/redis-5.0.8.tar.gz
    2. 解压:
      tar -zxvf redis-5.0.8.tar.gz -C /usr/local
      
    3. 编译:
      make
      
    4. 安装:将对应的执行脚本生成到指定目录的 bin 目录下
      make PREFIX=/usr/local/redis-5.0.8 install
      

    bin 目录下可执行文件说明:

    redis-server # 启动redis服务命令
    redis-cli # redis的客户端连接命令
    
    redis-check-aof # 检查aof命令
    redis-check-rdb # 检查rdb备份命令
    redis-benchmark # redis性能测试命令
    redis-sentinel # redis的哨兵机制启动命令
    

    启动命令:进入目录 cd /usr/local/redis-5.0.8/bin,启动服务 ./redis-server

    @H_502_8@
  • 方式 1:直接使用
    ./redis-server
    
  • 方式 2:使用动态参数
    ./redis-server --port=6380
    
  • 方式 3:使用配置文件启动(推荐)
    # 启动时指定配置文件的路径
    ./redis-server ../conf/redis_6300.conf
    
  • 客户端访问./redis-cli

    redis-cli -h <IP地址> -p <端口>
    

    退出客户端 Ctrl + C

    Redis 常用配置

    以下配置都是在 redis.conf 文件修改

    @H_502_8@
  • 配置后台启动:daemonize yes
  • 配置远程登录bind 0.0.0.0
    可以通过 netstat -ntlp 查看绑定的网卡信息
  • 端口配置:port: 6379
  • 工作目录:dir /usr/local/redis-5.0.8/data
  • 日志文件 logfile "6379.log"
  • 密码配置:requirepass pwd1234,配置密码为 pwd1234
    配置密码关闭 Redis./redis-cli -a pwd1234 shutdown
  • 后台启动状态下关闭 Redis

    @H_502_8@
  • 非正常关闭
    # 查询PID 
    ps -ef |grep redis-server
    
    # 通过PID强制关闭
    kill -9 <PID>
    
  • 正常关闭
    bin/redis-cli.sh shutdown
    
    # 不指定 -p, -h 认情况连接的是本机的6379端口
    bin/redis-cli.sh -p <port> -h <host> 	
    
  • Redis 数据类型

    通用命令

    KEYS:查看所有的键;会扫描所有的数据,阻塞其他操作,不建议使用

    DBSIZE:查看 key 的数量性能很快,时间复杂度 O(1)

    EXISTS [key]:判断是否存在对应的 key;存在返回 1, 不存在返回 0

    EXPIRE [key] [seconds]:给对应的 key 设置过期时间,单位是秒

    TTL [key]获取 key 的有效时间;-1 代表永久有效,-2 代表无效的键

    PERSIST [key]:把一个有过期时间的 key 设置为永久有效

    DEL [key1] [key2] […]:根据指定 key 删除记录,可以一次删除多个

    TYPE [key]获取 key 对应的数据类型

    FLUSHDB:清空数据库记录(不进行持久化操作,rdb 文件不变)

    如果想恢复数据库,可以直接 kill 掉 redis-server 进程,然后重新启动服务,这样 Redis 重新读取 rdb 文件,数据恢复到 flushdb 操作之前的状态
    注意:如果通过 shutdown 关闭服务会触发持久化操作,无法恢复数据,必须 kill 关闭服务

    FLUSHALL:清空数据库记录(进行持久化操作,rdb 文件变化)

    rdb 文件变成76个字节大小(初始状态下为76字节),数据库真正意义上清空

    INFO:查看服务器信息

    String - value 可以是字符串、数值、二进制、json数据

    在这里插入图片描述

    命令说明
    set设置一个 key/value
    get根据 key 获得对应的 value
    mset一次设置多个 key value
    mget一次获得多个 key 的 value
    getset获得原始 key 的值,同时设置新值
    strlen获得对应 key 存储 value 的长度
    append为对应 key 的 value 追加内容
    getrange 索引0开始截取 value 的内容
    setex设置一个 key 存活的有效期(秒)
    psetex设置一个 key 存活的有效期(毫秒)
    setnx存在不做任何操作,不存在添加
    msetnx 原子操作(只要有一个存在不做任何操作)可以同时设置多个 key,只要有一个存在都不保存
    decr进行数值类型的 -1 操作
    decrby根据提供的数据进行减法操作
    incr进行数值类型的 +1 操作
    incrby根据提供的数据进行加法操作
    incrbyfloat根据提供的数据加入浮点数

    应用场景:

    @H_502_8@
  • 在线网站的访问量
  • 缓存秒杀订单

    在这里插入图片描述

  • 分布式 ID 生成

    在这里插入图片描述

  • Hash - 存在 key-value,key 是无序的,value 是 map 结构

    在这里插入图片描述

    命令说明
    hset设置一个 key/value 对
    hget获得一个 key 对应的 value
    hgetall获得所有的 key/value 对
    hdel删除一个 key/value 对
    hexists判断一个 key 是否存在
    hkeys获得所有的 key
    hvals获得所有的 value
    hmset设置多个 key/value
    hmget获得多个 key 的 value
    hsetnx设置一个不存在的 key 的值
    hincrby为 value 进行加法运算
    hincrbyfloat为 value 加入浮点值

    应用场景

    @H_502_8@
  • 用户主页的访问量
  • List - 元素有序、可以重复

    在这里插入图片描述

    命令说明
    lpush将某个值加入到一个 key 列表头部
    lpushx同 lpush,但是必须要保证这个 key 存在
    rpush将某个值加入到一个 key 列表末尾
    rpushx同 rpush,但是必须要保证这个 key 存在
    lpop返回和移除列表左边的第一个元素
    rpop返回和移除列表右边的第一个元素
    lrange获取一个下标区间内的元素
    llen获取列表元素个数
    lset设置某一个指定索引的值(索引必须存在)
    lindex获取一个指定索引位置的元素
    lrem删除重复元素
    ltrim保留列表中特定区间内的元素
    linsert在某一个元素之前,之后插入新元素

    应用场景:

    @H_502_8@
  • 消息队列
  • 朋友圈点赞
  • Set - 元素无序、不可重复

    在这里插入图片描述

    命令说明
    sadd为集合添加元素
    smembers显示集合中所有元素(无序)
    scard返回集合中元素的个数
    spop随机返回一个元素 并将元素在集合中删除
    smove一个集合中向另一个集合移动元素(必须是同一种类型)
    srem从集合中删除一个元素
    sismember判断一个集合中是否含有这个元素
    srandmember随机返回元素
    sdiff去掉第一个集合中其它集合含有的相同元素,求第一个集合与第二个集合的差集
    sinter求交集
    sunion求和集

    应用场景:

    @H_502_8@
  • 抽奖系统
  • 共同好友
  • ZSet - 元素根据 score 排序、不可重复

    在这里插入图片描述

    命令说明
    zadd添加一个有序集合元素
    zcard返回集合的元素个数
    zrange 升序 zrevrange 降序返回一个范围内的元素
    zrangebyscore按照分数查找一个范围内的元素
    zrank返回排名
    zrevrank倒序排名
    zscore显示一个元素的分数
    zrem移除某一个元素
    zincrby给某个特定元素加分

    应用场景:

    @H_502_8@
  • 排行榜
  • 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐