基础

http://redis.cn/ 中文官网
https://redis.io/ 英文官网

​ Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 与范围查询, bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

常识

  • 数据都存在文件中的
  • 磁盘中
    • 寻址 ms级别 带宽 G/M
  • 内存中
    • 寻址 ns 级别 带宽 很大
    • 磁盘寻址比内存慢了10w 倍。单位:秒 > 毫秒 > 微秒 > 纳秒
  • I/O buffer 成本问题
    • 磁盘与磁道、扇区 一个扇区512Byte
    • 引出成本问题: 如果按512Byte读取 ,上层建立索引 需要消耗更大的空间
    • 所以在格式化磁盘时 引入 4K 对齐,在真正使用磁盘读取 其实按4K大小为一次读写量
    • 操作系统 中 无论读多少数据,都是最少4k从磁盘拿
  • 结论:随着文件的变大,访问会越来越慢,为什么?因为硬盘的 I/O 成为瓶颈

数据库的出现

  • 提出一个概念 data page 也是 4k 大小,所以底层存储分成 4k小格子。读取是正好符合磁盘 一次I/O

  • 关系型数据库中: 必须给出 schema类型,这样就确定了行的宽度。提前用0去填充,未来增删改数据时,数据不会在磁盘中移动, 更倾向于行级存储。

  • 问? 随着表的变大 , 性能是否下降?

    • 答 :如果表有索引 增删改 会变慢,因为索引列会调整
    • 查询数据呢?
      • 1个或少量的数据 依然很快
      • 并发大的时候会受硬盘带宽的影响速度

    数据库存储结构

  • 有个 SAP HANA 内存级 关系型数据库 (2T内存)

    • 为什么有 内存级 关系型数据库存在? 引出一个问题,数据在磁盘和内存中存储 体积 不一样
      • 磁盘中没有指针的概念 (不可能像对象那样,存在一份,各处引用)
      • 因此 建立在磁盘中的索引 必然有 胀出的数据,因此 在磁盘的数据要比内存中体积 大。
      • HANA中还可以 启动 压缩策略

以上 体现出 两个极端, 一个买不起, 一个随着数据的变大会变慢。由此出现了折中的方案 缓存

所以才引出 redis memcache 缓存

redis 出现 建立在两个基础设施

​ 1 冯诺依曼体系的硬件 2 以太网 tcp/ip的网络

https://db-engines.com/en/ 数据库排名 做技术选型, 可参考该网站

数据类型

redis数据类型

安装

wget    http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xf    redis...tar.gz
cd redis-src
看 README.md 里面有详细介绍
make  ....yum install  gcc  ....  make distclean
make
cd src   ....生成了可执行程序
make install PREFIX=/opt/redis5
vi /etc/profile...   
	export  REDIS_HOME=/opt/redis5...   
	export PATH=$PATH:$REDIS_HOME/bin..
	source /etc/profile
cd utils
./install_server.sh  (可以执行一次或多次)    
	a)  一个物理机中可以有多个redis实例(进程),通过port区分    
	b)  可执行程序就一份在目录,但是内存中未来的多个实例需要各自的配置文件,持久化目录等资源    
	c)  service   redis_6379  start/stop/stauts     >   linux   /etc/init.d/****     
	d)脚本还会帮你启动!
ps -ef |  grep redis 

命令查找

[root@node01 ~]# redis-cli 
127.0.0.1:6379> help
redis-cli 6.2.6
To get help about Redis commands type:
      "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit

To set redis-cli preferences:
      ":set hints" enable online hints
      ":set nohints" disable online hints
Set your preferences in ~/.redisclirc

help  @符号 分组命令  查看命令如何使用

@generic 通用组
@string  字符串组
@list  	 数组
@hash    哈希
@sorted_set 有序集合
@transactions 事务



redis 作者比较细腻的地方

  • getset 命令 将get set 命令合并 ,可以减少一次命令发送
  • MSETNX 原子性操作 同时设置多个key key存在时设置失败, 所有命令回滚

管道操作

适用于redis 冷启动时 大量数据写入操作,一下两种方法

Redis 使用

redis底层原理

redis底层原理

redis 集群知识

redis集群知识

常见问题

redis常见问题