为什么用Redis

  • 是什么

    • 一个小程序
    • 缓存 & 数据库
    • 单线程worker
    • 新版本:IO threads
    • epoll:多路复用
  • 与Memcache区别
    • 支持持久化:RDB快照、AOF日志
    • 丰富的数据类型
  • 速度
    • 硬盘:寻址时间ms,带宽(吞吐)百兆~G/s(固态硬盘pci-e nvme)
    • 内存:寻址时间ns,比硬盘快10w倍
  • 文件
    • 全量扫描(高IO),过大(T级)时,查询会变慢
  • 数据库
    • 对数据进行规划,分页存储
    • 为1kb的数组建立索引,若将数组分成4bit的数据块,索引大小为1byte
    • 索引大小可设置,窗口越小,索引越大
    • 索引也是数据,存在磁盘中
    • B+树,树干在内存,索引磁盘
    • datapage->索引->B+树
    • 读取数据:先扫描B+树,读取相应索引到内存扫描,再读取相应datapage到内存扫描
    • 表很大时,增删改(写)查(读)中,写操作会变慢
    • 读操作单线程不受影响,但并发很大或查询复杂时会受影响(分布式、微服务解决并发问题)

  • 把数据全部放到内存,且支持sql查询

    • SAP HANA:关系型数据库(内存中运行),内存2T(erp+hana+2T服务器=¥2E)
    • 数据在内存中比在硬盘中小:如有1000个user对象,住址字段是“Beijing”,JVM中只有一个“Beijing”字段,但序列化到磁盘后有1000个(内存指针实现了数据复用)
  • 公司全部数据存在哪?
    • 折中方案:将全量数据中频繁使用的数据放到内存中,其他放在硬盘数据库中
    • 内存型数据库:redis、memcache
    • 为什么是key-value型?内存中只有部分数据,无法按SQL的范式进行设计(空间换时间)
    • 关系型数据库中的约束(范式)设计减少了数据冗余
    • key-value的使用者只需关注每条记录自身,而不需查看其他记录
    • worker 单线程,6.x io threads 多线程(多线程读取,单线程处理)
    • Value类型:String、list、set、hash,每种类型有自己的本地方法
    • 先用json把所有对象序列化为字符串,再存到memcache

事务

  • 不是真正的事务,是一种模拟
  • 本质:将一组操作放入队列中,一次执行(批处理)
  • Oracle中事物的本质:将事务的DML操作写入日志

  • 执行事务操作时,如果监视的值发生了变化,则提交失败
  • exec后,返回(nil),表示提交失败

消息

  • 消息类型

    • Queue:队列,点对点
    • Topic:主题,广播 / 群发
  • 常用消息系统
    • Redis:只支持Topic
    • Kafka:只支持Topic,需要Zookeeper支持
    • JMS(Java Messaging Service):支持Queue和Topic
  • Reids消息机制
    • publish:发布消息
    • subscribe:订阅消息
    • psubscribe:使用通配符来订阅消息

持久化

  • 本质上是一种备份和恢复
  • RDB:默认
    • 可看成一种快照,每隔一段时间将内存中数据保存到硬盘(dump.rdb)
    • 配置参数:redis.conf
    • 优点:恢复快
    • 缺点:两次RDB之间,可能发生数据丢失
  • AOF:记录日志(append only file)
    • 配置参数

      • appendonly yes
      • bin/redis-server conf/redis.conf
    • 日志重写
      • 将过程日志改为最终状态记录(最终一致性),减小日志文件占用空间
      • 使用压力测试模拟,模拟10万次操作,可观察到日志文件先变大后变小
      • bin/redis-benchmark -n 100000

    • 参数设置

      • no-appendfsync-on-rewrite no :执行重写的时候,不写入新的日志
      • auto-aof-rewrite-percentage 100 :当AOF文件比上次的大小超过了100%,执行重写
      • auto-aof-rewrite-min-size 64mb  :当AOF日志文件达到了64M,执行重写
    • RDB和AOF同时存在时,优先读取AOF进行恢复(持久性保证更好)

主从复制

  • 主从复制集群

    • 作用

      • 主从复制,主从备份,防止主节点宕机
      • 任务分离,分摊主节点压力(如朋友圈读比写压力大很多)
      • 读写分离,主节点写入,从节点读取
    • 架构
      • 星型模型:效率较高,HA复杂
      • 线型模型:效率较低,HA简单  

  • 分片

    • 使用第三方软件Twemproxy实现负载均衡
    • Twemproxy作为代理接收来自多个程序的访问,按照路由规则转发给Redis服务器再返回

  • 配置

    • 主节点

      • 关闭RDB和AOF(任务分离)
      • bind 0.0.0.0(允许所有网段IP连接)
      • 查看主从关系:info replication
    • 从节点
      • replicaof localhost 6379
      • 开启rdb和aof
      • bin/redis-cli -p 6380
    • 默认从节点只读
    • 第一次同步RDB(较大),后面同步AOF
    • 一次不要启动太多从节点

HA(哨兵)

  • 2.4后开始有
  • 配置文件:sentinel.conf

  • +try-failover master mymaster 192.168.174.111 6379
  • switch-master mymaster 192.168.174.111 6379 127.0.0.1 6381
  • +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381

原理

  • memcache和redis:都是k-v,但redis的value有类型,以及基于类型的方法
  • memcache的k,v都是string类型,数据向计算移动
  • redis实现了计算向数据移动,减少IO量

安装

  • 在Redis官网进入下载页面,复制下载链接
  • 进入linux命令行,创建目录
  • wget 下载链接
  • tar xf 压缩包文件
  • 进入redis目录
  • vi READMI.md
  • make:编译源码
  • make PREFIX=安装路径 install:安装
  • yum install gcc -y:安装gcc(如果没有的话)
  • make distclean:清理
  • vi ~/.bash_profile:添加环境变量
    • REDIS_HOME=/root/training/redis-5.0.8
    • export REDIS_HOME
    • PATH=$REDIS_HOME/bin:$PATH
    • export PATH
  • source /etc/profile:环境变量生效
  • cd utils
  • sudo ./install_server.sh:开启服务,设置端口号,配置文件,日志文件,持久化目录
  • service redis_6379 status:查看redis进程状态
  • ps -fe | grep redis:查看所有redis进程状态
  • 核心配置文件:redis.conf(从安装文件拷贝到安装目录)
  • 设置后台运行:daemonize no

  • strace -ff -o ~/stracedir/ooxx ./redis-server:追踪线程文件

  • cd /proc/task/8625

  • cd /proc/8625/fd

  • redis-cli
  • >bgsave:记录日志
  • 业务处理是单线程的
  • 一个线程如何处理多个客户端请求
  • BIO->NIO->epoll(多路复用)
  • yum install man man-pages
  • fcntl(可设置非阻塞)
  • 用户很多时(如1000个),轮询的代价太大(用户态 / 内核态切换1000次)
  • select(多路复用,同步非阻塞,用户态 / 内核态切换1次,拷贝1000个fd到内核,内核遍历1000次,然后告诉redis需要读哪个用户)
  • 缺点在于redis->kernel传参太多,且内核遍历次数太多
  • 多路复用器:在内核中,如select、poll、epoll,告诉redis有没有数据到达,再由redis自己去读取
  • 单线程不足:只能工作在一个CPU上,不能发挥硬件资源
  • IO thread 事务性:保证一个client的一个connection中发送的指令是有顺序的
  • 不需使用分布式锁/事务
  • 类似:kafka k,v 消息构建
  • 6.x之后,io threads多线程(io读写),无论哪个版本,工作线程就一个

  

使用

  • 方法一

    • redis-cli
  • 方法二
    • nc localhost 6379
  • 方法三
    • exec 8<> /dev/tcp/localhost/6379
    • echo -e 'keys *' >& 8
    • cat <& 8
  • 常用命令
    • flushall:清除所有内容
    • help @String:查看String的使用方法
  • 5种value类型
  • String
    • 字符串
      • strlen:字节个数
      • 二进制安全:客户端根据自身编码方式发送byte数组
      • hbase、zookeeper、kafka
    • 数值
      • incr
      • decr
      • 单线程原子
      • 秒杀限流
    • 二进制bitmap
      • setbit k1 1 1
      • 从左向右,自动扩容
      • 场景1:统计用户任意时间窗口内登录几次(如一年内)
        • setbit sean 3 1:sean在第4天登录了
        • setbit sean 364 1:sean在第365天登录了
        • bitcount sean 0 -1:统计一共登录了几次
        • strlen sean:用了多大空间
      • 场景2:统计一段时间内有多少人登录
        • setbit 20200101 7 1
        • setbit 20200101 3 1
        • setbit 20200102 3 1
        • bitop or res 20200101 20200102
        • bitcount res 0 -1

    

  • list

    • 模拟栈、队列、数组
    • 操作
      • lpush k1 a b c d:左侧插入数据
      • lrange k1 0 -1:查看范围内元素
      • rpush k1 x y z:右侧插入数据
      • ltrim k1 0 -1:删除区间之外的元素
  • hash
    • 场景:详情页 / 聚合,数据来自不同的库
  • set
    • 无序,去重
    • 操作
      • sadd k1 ooxx xxoo oxox ooxx:添加元素
      • smembers k1:显示元素
      • srandmember k1 3:不重复地取出3个元素
      • srandmember k1 -8:可重复地取出8个元素
      • sunion k1 k2:k1 k2 并集
      • sinter k1 k2:k1 k2 交集
      • sdiff k1 k2:
    • 场景
      • 随机事件:抽奖
      • 集合运算:单线程串行,成本较大,通常会独立到一个redis实例
  • sorted_set
    • 有序,去重,动态维护顺序,底层是跳表(skiplist)
    • 操作
      • zadd k1 3.1 apple 2.5 orange 7 banana:插入数据
      • zrange k1 0 -1 withscores:按分值排序
      • zrange k1 0 1:取出前两名
    • 场景
      • 排行榜
      • 动态翻页

参考

数据库知识网站

https://db-engines.com/en/

redis主从设置

https://blog.csdn.net/qq_24113267/article/details/79150533

[DB] Redis的更多相关文章

  1. 分布式锁三种实现方式(DB,redis,zookeeper)比较

    先贴出看到的一篇博客,后续补充自己总结分析的. https://blog.csdn.net/u010963948/article/details/79006572

  2. Redis与DB的数据一致性解决方案(史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  3. redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作

    前段时间在做用户画像的时候,遇到了这样的一个问题,记录某一个商品的用户购买群,刚好这种需求就可以用到Redis中的Set,key作为productID,value 就是具体的customerid集合, ...

  4. Basic Tutorials of Redis(2) - String

    This post is mainly about how to use the commands to handle the Strings of Redis.And I will show you ...

  5. Redis连接

    using System; using System.Configuration; using StackExchange.Redis; namespace Redis { public sealed ...

  6. Redis到底该如何利用(三)?

    上两篇受益匪浅,秉着趁热打铁,不挖到最深不罢休的精神,我决定追加这篇.上一篇里最后我有提到实现分级缓存管理应该是个可行的方案,因此今天特别实践了一下.不过缓存分级之后也发现了一些问题,例如下图: 当a ...

  7. Redis 数据库入门指南

    Redis 是一个开源数据库,它使用内存数据结构存储,可作为数据库.缓存和消息代理使用.Redis 支持丰富的数据结构,有:字符串(Strings).哈希(Hashs).列表(Lists).集合(Se ...

  8. redis——学习之路五(简单的C#使用redis)

    redis官方推荐使用的客户端程序 打星星表示推荐使用的客户端程序,一个笑脸表示最近6个月内有过正式活动的.http://redis.io/clients/#c 从这里我们可以判断官方推荐我们使用Se ...

  9. Redis 详解 (一) StackExchange.Redis Client

    这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...

随机推荐

  1. Logstash生产环境实践手册(含grok规则示例和ELKF应用场景)

    ELKF应用场景: 1) datasource->logstash->elasticsearch->kibana 2) datasource->filebeat->log ...

  2. Recoil 默认值及数据级联的使用

    Recoil 中默认值及数据间的依赖 通过 Atom 可方便地设置数据的默认值, const fontSizeState = atom({ key: 'fontSizeState', default: ...

  3. 有关指针和C语言中的常量

    常量类型(五种): 字面常量(2,3,6....) ;                           enum 定义的枚举常量; 字符常量('a','b'....) ;              ...

  4. [Fundamental of Power Electronics]-PART I-5.不连续导电模式-5.1 DCM来源和模式边界

    引子: 当使用电流单向和/或电压单向半导体开关实现DC-DC变换器的理想开关时,可能会出现一种或多种被称为不连续导电模式(DCM)的新工作模式.当电感电流或电容电压的纹波大到足以导致所施加的开关电流或 ...

  5. HTML5和CSS3 PC端静态网页琐碎知识点

    1.PC端为了兼容IE9以及IE9以下,尽量要使用float进行布局,兼容性好,一般不要用flex进行布局. 2.问起CSS选择器的分类,先说id选择器,类选择器,属性选择器,伪类选择器,伪元素选择器 ...

  6. 201871010113-贾荣娟 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三-软件工程结对项目 这个课程学习目标 掌握软件开发流程,提高自身能力 这个作业在哪些方面帮助我实现了学习目标 本次实验让我对软件工程 ...

  7. 1.PreparedStatement VS Statement

    两者都是Sun公司定义的接口,PreparedStatement属于Statement的子接口.二者类似信使,向数据库中执行sql语句: Statement存在拼串的操作,比较繁琐:存在SQL注入问题 ...

  8. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之基础配置-04

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之基础配置-04 欢迎加QQ群:1026880196 进行交流学习 近期我发现网上有人转载或者复制原创博 ...

  9. Spring Boot demo系列(一):Hello World

    2021.2.24 更新 1 新建工程 打开IDEA选择新建工程并选择Spring Initializer: 可以在Project JDK处选择JDK版本,下一步是选择包名,语言,构建工具以及打包工具 ...

  10. 源码编译安装MySQL8.0.20

    1 概述 本文章主要讲述了如何从源码编译安装MySQL社区版8.0.20,首先会介绍一些编译安装的相关知识,然后开始编译安装 2 源码编译安装的相关知识 2.1 make与configure make ...