基础
http://redis.cn/ 中文官网
https://redis.io/ 英文官网
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(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/ 数据库排名 做技术选型, 可参考该网站
数据类型

安装
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完整的命令列表,以及他们的说明文档。
-
管道(Pipelining):学习如何一次发送多个命令,节省往返时间。
-
Redis 发布/订阅(Pub/Sub):redis是一个快速、稳定的发布/订阅的信息系统。
-
Redis Lua 脚本:Redis 2.6 Lua 脚本相关文档。
-
Lua 脚本调试:Redis 3.2 Lua 脚本调试相关文档。
-
内存优化:了解如何使用内存和学习一些使用技巧。
-
过期(Expires):Redis允许为每一个key设置不同的过期时间,当它们到期时将自动从服务器上删除。
-
将Redis当做使用LRU算法的缓存来使用:如何配置并且将Redis当做缓存来使用,通过限制内存及自动回收键。
-
Redis 事务:将一组命令放在同一个事务中进行处理。
-
适用于redis 冷启动时 大量数据写入操作
- 大量插入数据:如何在短时间里向Redis写入大量数据。
- 从文件中批量插入数据:将文件中的指令批量执行。
-
分区(Partitioning):如何将你的数据分布在多个Redis里面。
-
分布式锁(Distributed locks):用Redis实现分布式锁管理器。
-
key事件通知(Redis keyspace notifications):通过发布/订阅获得key事件的通知(版本2.8或更高)。
-
创建二级索引(Creating secondary indexes with Redis):使用redis的数据结构创建二级索引。
-
布隆过滤器:如何加入到redis中
安装布隆过滤器 github https://github.com/RedisBloom/RedisBloom redis-server --loadmodule /path/to/redisbloom.so redis-cli bf.add ooxx abc bf.exits abc bf.exits sdfsdf12, cf.add
redis底层原理
redis 集群知识
常见问题
