一, 简介
存储系统背景
存储系统有三类:
- RDBMS
- oracle,dh2,PostgreSQL,MySQL,sql server
- NoSQL:
- KV NoSQL:Redis,Memcached
列式 Column Family NoSQL: HBase, 每一行每一字段可以保留 n 份, 也是按照字段存储
文档 Documentation NoSQL: MongoDB
图式 Graph NoSQL: Neo4j
NewSQL
aerospike,foundationDB,RethinkDB...
1, 什么是 Redis
Redis 是一个开源的使用 ANSI C 语言编写, 支持网络, 可基于内存即可持久化的日志型, key-value 数据库 (是一个 key-value 存储系统), 支持多种语言的 API
它是一个高级 key-value 数据库, 跟 Memcached 类似, 但是 Redis 的数据可以持久化, 并且支持数据类型更丰富, 同时还支持服务端的计算集合的并, 交, 和补集等, 支持多种排序功能.
2, 特点:
常用来和 memcache 做比较, 但 Redis 是 nosql, 基于 key-value(键值) 的数据结构的存储, 可以存储键值, 字典, 图表
完全工作在内存中, 数据保存在内存, 性能不错, 数据周期性备份到硬盘,(持久化) 的单线程服务器
可以通过 lua 脚本扩展
支持 sentinel 主从架构高可用
分布式
3, 性能
虽然是单线程, kv 是一个单纯简单的存储 CPU 通常不会形成瓶颈的, 官方测试 50 个并发请求 10w 次, 写的速度是 110000 次 / s, 读的速度是 81000 次 / s, 读写大小为 256bytes 的字符串;
4, 持久化 persistence
RDB: snapshot, 二进制格式; 按事先定制的策略, 周期性地将数据保存至磁盘; 数据文件默认为 dump.rdb;
客户端也可显式使用 SAVA 或 BGSAVE 命令启动快照保存机制;
SAVE: 同步, 在主线程中保存快照; 此时会阻塞所有客户端请求;
BGSAVE: 异步,
AOF:Append Only File
记录每一次写操作至指定的文件尾部实现持久化; 当 Redis 重启时, 可通过重新执行文件中的命令在内存重建数据库;
BGREWRITEAOF:AOF 文件重写;
不会读取正在使用 AOF 文件, 而通过将内存中的数据以命令的方式保存到临时文件中, 完成之后替换原来的 AOF 文件;
5, 是一个数据结构服务器它支持的 value 类型有:
String 字符串, List 链表, Hash 哈希, Set 集合, Sorted Set 有序集合, Bitmap, HyperLoglog
- Strings:
- SET key value [EX #] [NX|XX]
- GET
- INCR
- DECR
- EXIST
- Lists:
- LPUSH
- RPUSH
- LPOP
- RPOP
- LINDEX
- LSET
- Sets:
- SADD
- SINTER
- SUNION
- SPOP
- SISMEMBER
- Sorted Sets:
- ZADD
- ZRANGE
- ZCARD
- ZRANK
- Hashes:
- HSET
- HSETNX
- HGET
- HKEYS
- HVALS
- HDEL
- Bitmaps, HyperLogLog
6, 守护进程
监听端口为 6379/tcp
7, 数据库对比
常见数据库功能对比
名称 | 数据库类型 | 数据存储选项 | 操作类型 | 备注 |
redis | 内存存储,nosql 数据库 | 支持字符串、列表、集合、散列标、有序集合 | 增、删、修改、更新 | 支持分布式存储,主从同步及高可用,单线程 |
memcached | 内存缓存数据库 | 键值之间得映射 | 增、删、修改、更新 | 支持多线程 |
mysql | 典型关系数据库,RDBMS | 数据库由多表组成,每张表包含多行 | 增、删、修改、更新 | 支持 ACID 性质 |
postgresql | 典型关系数据库,RDBMS | 数据库由多表组成,每张表包含多行 | 增、删、修改、更新 | 支持 ACID 性质 |
mongodb | 硬盘存储,nosql 数据库 | 数据库包含多个表 | 增、删、修改、更新 | 主从复制,分片,副本集、空间索引 |
8, 简述和 Memcached 之间的对比
Redis 不仅仅支持简单的 kv 类型数据, 还支持 list,set,hash 等数据结构
Redis 支持数据备份
Redis 支持数据持久化, 可以将内存中的数据保持在磁盘中, 重启的时候可以在加载使用
集群, memcache 不支持集群, 多台 memcache 共处
9,Redis 的 master/slave 复制:
支持一个 master 多个 slave
slave 可以介绍其他 slave 的链接来替代他链接 master
复制在 master 是非阻塞的, 在 slave 是阻塞的
复制被利用来提供扩展性, 在 slave 端只提供查询功能及数据的冗余
10, 应用场景
缓存 (数据查询, 短连接, 新闻内容, 商品内容等)
分布式集群架构中 session 分离
聊天室在线好友列表
任务队列 (秒杀, 抢购, 12306)
应用排行
网站访问统计
数据统计
为了解决高并发, 高可用, 高可扩展, 大数据存储等一系列问题而产生的数据库解决方案
二, 主从复制工作机制
Redis 持久化解决了 Redis 服务重启后能够将硬盘的持久化数据恢复到内存中, 但当 Redis 服务器硬盘坏掉就会导致数据丢失, 为了避免这种单点故障就有了主从复制工作机制
一主多从结构
主从复制不会阻塞 master, 在同步数据时, master 可以继续处理 client 请求
一个 Redis 即可以是主也可以是从
三, 多实例 Redis 配置
1, 下载软件及安装源
http://download.redis.io/releases/redis-5.0.4.tar.gz
如果源码安装下载源码
如果 yum 安装请配置源
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
2, 安装有两种安装方式
1),yum 安装
直接 yum install Redis
- systemctl enable Redis
- systemctl start Redis
- Dependencies Resolved #一些依赖
- ====================================================================================================================
- Package Arch Version Repository Size
- ====================================================================================================================
- Installing:
- Redis x86_64 3.2.12-2.el7 epel 544 k
- Installing for dependencies:
- jemalloc x86_64 3.6.0-1.el7 epel 105 k
- Transaction Summary
- ====================================================================================================================
- Install 1 Package (+1 Dependent package)
- Complete!
- [root@web1 ~]# systemctl start Redis
- [root@web1 ~]# systemctl enable Redis
- Created symlink from /etc/systemd/system/multi-user.target.wants/Redis.service to /usr/lib/systemd/system/Redis.service.
- [root@web1 ~]# netstat -untlp
- Active Internet connections (only servers)
- Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
- tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/Redis-server 1
- tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2050/nginx: master
- tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2176/dnsmasq
- tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd
- tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 879/cupsd
- tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2035/master
- tcp6 0 0 :::111 :::* LISTEN 1/systemd
- tcp6 0 0 :::80 :::* LISTEN 2050/nginx: master
- tcp6 0 0 :::22 :::* LISTEN 875/sshd
- tcp6 0 0 ::1:631 :::* LISTEN 879/cupsd
- tcp6 0 0 ::1:25 :::* LISTEN 2035/master
- udp 0 0 0.0.0.0:5353 0.0.0.0:* 574/avahi-daemon: r
- udp 0 0 127.0.0.1:323 0.0.0.0:* 2334/chronyd
- udp 0 0 0.0.0.0:52822 0.0.0.0:* 574/avahi-daemon: r
- udp 0 0 192.168.122.1:53 0.0.0.0:* 2176/dnsmasq
- udp 0 0 0.0.0.0:67 0.0.0.0:* 2176/dnsmasq
- udp 0 0 0.0.0.0:177 0.0.0.0:* 890/lightdm
- udp6 0 0 ::1:323 :::* 2334/chronyd
- udp6 0 0 :::177 :::* 890/lightdm
- [root@web1 ~]#
2), 编译安装
解压 --> 编译 -->copy--> 启动
这次编译安装一个新版本
- mkdir /data
- cd /data
上传下载的包到此目录
- Redis-5.0.4.tar.gz
- tar Redis-5.0.4.tar.gz
- cd rredis-5.0.4
- make
3, 编译安装及启动
1) 创建文件夹及拷贝关键文件
- mkdir /data/redis2
- cp Redis.conf /data/redis2
- cp src/Redis-server /data/redis2
- cd /data/redis2/
2) 编辑配置文件
- VIM Redis.conf
- port 6380
- appendonly no yes // 日志开关, 不是包报错的日志, 是二进制, 记录数据变化
- pidfile /var/run/redis_6380.pid //pid 名字
- logfile "/data/redis2/redis.log" //log 日志
- daemonize yes // 后台启动
- dbfilename dump.rbd // 持久化数据文件
3) 启动
- [root@web1 redis2]# ./Redis-server ./Redis.conf
- [root@web1 redis2]# netstat -tunlp
- Active Internet connections (only servers)
- Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
- tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2570/Redis-server 1
- tcp 0 0 192.168.216.51:6380 0.0.0.0:* LISTEN 15434/./Redis-serve
- tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2050/nginx: master
- tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2176/dnsmasq
- tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 875/sshd
- tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 879/cupsd
- tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2035/master
- tcp6 0 0 :::111 :::* LISTEN 1/systemd
- tcp6 0 0 :::80 :::* LISTEN 2050/nginx: master
- tcp6 0 0 :::22 :::* LISTEN 875/sshd
- tcp6 0 0 ::1:631 :::* LISTEN 879/cupsd
- tcp6 0 0 ::1:25 :::* LISTEN 2035/master
- udp 0 0 0.0.0.0:5353 0.0.0.0:* 574/avahi-daemon: r
- udp 0 0 127.0.0.1:323 0.0.0.0:* 2334/chronyd
- udp 0 0 0.0.0.0:52822 0.0.0.0:* 574/avahi-daemon: r
- udp 0 0 192.168.122.1:53 0.0.0.0:* 2176/dnsmasq
- udp 0 0 0.0.0.0:67 0.0.0.0:* 2176/dnsmasq
- udp 0 0 0.0.0.0:177 0.0.0.0:* 890/lightdm
- udp6 0 0 ::1:323 :::* 2334/chronyd
- udp6 0 0 :::177 :::* 890/lightdm
- [root@web1 redis2]#
4) 变量, 赋值取值, 正常关闭, 非正常的关闭
- [root@web1 redis2]# Redis-cli -h 192.168.216.51 -p 6380
- 192.168.216.51:6380>
- 192.168.216.51:6380>
- 192.168.216.51:6380>
- 192.168.216.51:6380> set home zxg // 赋值
- OK192.168.216.51:6380> get home // 取值
- "zxg"
- 192.168.216.51:6380> get abc 123
- (error) ERR wrong number of arguments for 'get' command
- 192.168.216.51:6380> set abc 123
- OK
- 192.168.216.51:6380> get abc
- "123"192.168.216.51:6380> KEYS *// 查看所有的 key
- 1) "abc"
- 2) "home"
- 192.168.216.51:6380>
- 192.168.216.51:6380> SHUTDOWN // 正常关闭, 非正常关闭就是 kill 了
四, 主从配置
1, 配置从服务器
Redis 主从配置非常简单, 只需要把从服务器改一个配置即可
- VIM Redis.conf
- slaveof 192.168.216.51 6379
2, 启动服务
- [root@web2 ~]# systemctl start Redis
- [root@web2 ~]# systemctl enable Redis
3, 查看主从状态测试结果
- [root@web1 redis2]# Redis-cli -h 192.168.216.51 -p 6379
- 192.168.216.51:6379> info replication
- # Replication
- role:master
- connected_slaves:1
- slave0:ip=192.168.216.52,port=6379,state=online,offset=99,lag=0
- master_repl_offset:99
- repl_backlog_active:1
- repl_backlog_size:1048576
- repl_backlog_first_byte_offset:2
- repl_backlog_histlen:98
- 192.168.216.51:6379>
- 127.0.0.1:6379> info replication
- # Replication
- role:slave
- master_host:192.168.216.51
- master_port:6379
- master_link_status:up
- master_last_io_seconds_ago:3
- master_sync_in_progress:0
- slave_repl_offset:253
- slave_priority:100
- slave_read_only:1
- connected_slaves:0
- master_repl_offset:0
- repl_backlog_active:0
- repl_backlog_size:1048576
- repl_backlog_first_byte_offset:0
- repl_backlog_histlen:0
- 127.0.0.1:6379>
注意 1: 从服务器只读
master 新建 key test zxg
- 192.168.216.51:6379> set test zxg
- OK
- 192.168.216.51:6379> get test
- "zxg"
- 192.168.216.51:6379>
slave 查看有没有值
- 127.0.0.1:6379> get test
- "zxg"
- 127.0.0.1:6379>
来源: https://www.cnblogs.com/zhangxingeng/p/10743476.html