redis入门

redis入门

一、redis概述

1.redis是什么:

redis是NoSQL中的一种,基于键-值型的存储,与memcache类似,但是memcache中只是内存的缓存,而redis不仅是内存中的缓存,还是提供久存储。
Redis全称(REmote Dlctionary Server)远程字典服务器,而这个字典服务器从本质上讲,主要提供数据结构的远程存储功能,可以理解为reids是一个高级K-V存储,和数据结构存储,因为redis除了能够存储K-V这种简单的数据之外,还能够存储列表,字典,hash表。等对应的数据结构。
在性能上redis不比memcache差,因为redis整个运行统统是在内存中实现,他的所有数据及都是保存在内存中的,内存中的数据会周期性的写入到磁盘上,以实现数据的持久功能,而这种写磁盘并不是用于访问,而仅是冗余功能,所以redis所有功能都是内存中完成。
redis与mamcache不同之处在于redis有一个周期性的将数据保存到磁盘上的机制,而且不只一种,有两种机制,这也是redis持久化的一种实现,另外与mamcache有所区别的是,redis是单线程服务器,只有一个线程来响应所有的请求。
redis支持主从模式,但是redis的主从模式默认就有一个sentinel工具,从而实现主从架构的高可用,也就是说,redis能够借助于sentinel工具来监控主从节点,当主节点发生故障时,会自己提升另外一个节点成为新的主节点。
在redis3.0版本发布,开始支持redis集群,从而可以实现分布式,可以将用户的请求分散至多个不同节点。

2、redis所支持的数据类型

支持存储的数据类型有、String(字符串,包含证书),List(列表),hash(关联数组),Set(集合 ),Sorted Sets(有序集合),Bitmaps(位图),Hyperloglog。

3.redis性能评估:

(1)100万较小的键存储字符串,大概消耗100M内存
(2)由于redis是单线程,如果服务器主机上有多个cpu,只有一个能够使用,但并不意味着CPU会成为瓶颈,因为redis是一个比较简单的K-V数据存储,CPU通常不会成为瓶颈的
(3)在常见的Linux服务器上,500K(50万)的并发,只需要一秒钟处理,如果主机硬件较好的情况下,每秒钟可以达到上百万的并发。

4.Rdies与memcache对比:

memcache是一个分布式的内存对象缓存系统
redis是可以实现持久存储
memcache是一个lru的缓存
redis支持更多的数据类型
memcache是多线程的
redis是单线程的
两者性能几乎不相上下,实际上redis会受到硬盘持久化的影响,但是性能仍然保持在于memcache不相上下,是非常了不起的。

5.Redis优势

丰富的(资料形态)操作
支持存储的数据类型有、String(字符串,包含证书),List(列表),hash(关联数组),Set(集合 ),Sorted Sets(有序集合),Bitmaps(位图),Hyperloglog。
内建Replication和culster(自身支持复制及集群功能)
支持就地更新(in-place update)操作,直接可以在内存中完成更新操作
支持持久化(硬盘)
避免雪崩效应,万一出现雪崩效应,所有的数据都无法恢复,但redis由于有持久化的数据,可以实现恢复。

6.memcached的优势

多线程
善用多核cpu
更少的阻塞操作
更少的内存开销
更少的内存分配压力
可能有更少的内存碎片

二、安装redis

redis官网:https://redis.io/ 下载redis安装包

1 升级gcc

在编译redis6.0.1之前需要升级gcc的版本,默认情况yum安装的gcc版本是4.8.5,由于版本过低,在编译时会报如下错误(部分截取)。
安装scl源
yum install centos-release-scl scl-utils-build
安装8版本的gcc、gcc-c++、gdb工具链(toolchian)
yum install -y devtoolset-8-toolchain
scl enable devtoolset-8 bash
gcc --version

2 安装配置Redis6.0.1

tar -zxvf redis-6.0.1.tar.gz
cd redis-6.0.1
make PREFIX=/opt/redis-6.0.1/ install

3 make test(可不做)

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz  
tar xzvf tcl8.6.1-src.tar.gz  -C /usr/local/  
cd  /usr/local/tcl8.6.1/unix/  
./configure && make && make install
make test

4 生成配置文件

mkdir /opt/redis-6.0.1/conf/6379
cd /opt/redis-6.0.1/conf/6379

拷贝默认配置文件至6379实例目录下

cp /application/redis-6.0.1/redis.conf /opt/redis-6.0.1/conf/6379/

5 修改配置文件

# bind本地ip
bind 192.168.0.100

根据需求去修改端口

port 6379

以daemon方式运行

daemonize yes

日志文件

logfile "/opt/redis-6.0.1/conf/6379/logs/redis_6379.log"

数据保存目录

dir /opt/redis-6.0.1/conf/6379/data

内存最大使用量

maxmemory 512MB

I/O线程数,官方建议配置系统核心数量的3/4,我这里是2核,所以最多配置2就可以了 # 可以通过 lscpu 命令去查看本地系统的CPU核心数

io-threads 2

默认情况下,如果不开启多线程读功能,那么多线程只能进行写操作,是否开启多线程读功能看需求

io-threads-do-reads yes

SNAPSHOTTING# //定义RDB的持久化相关

save <seconds><changes>   //使用save指令,并指定每隔多少秒,如果发生多大变化,进行存储。

实例:

save 900 1 //表示900秒,如果至少有1个键发生改变,则做一次快照。

REPLCATION#### //配置主从相关

#slaveof <masterip><masterport> //此项不启用时,则为主,如果启动则为从,但是需要指明主服务器的IP 端口
#mastertrauth<master-password>//如果主服务器设置里密码认证,那么从的则需要启用此项并指明主的认证密码。
#slave-read-only yes // 定义从服务器对主服务器是否读写

limits#### //定义与连接和资源限制相关的配置

#maxclients 10000 //定义最大连接限制数(并发数)
#maxmemory <bytes> //定义使用主机上的最大内存,默认此项关闭,表示最大将使用主机上的最大可用内存。

6 启动redis,并配置开机自启

启动

/opt/redis-6.0.1/bin/redis-server /opt/redis-6.0.1/conf/6379/redis.conf

配置开机自启

echo "/opt/redis-6.0.1/bin/redis-server /opt/redis-6.0.1/conf/6379/redis.conf" >> /etc/rc.local

7 访问测试

[root@www bin]# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> KEYS *
(empty array)
127.0.0.1:6379> set a bbb
OK
127.0.0.1:6379> get a
"bbb"

三、redis基本操作

1.登录redis

redis-cli -h
-h <hostname>
-p<port>
-s<socker>
-a<password>
-r<repeat>
-i<interval>
-n<db>

2.redis获取帮助:

help @<group>
127.0.0.1:6379[2]> help APPEND
APPEND key value		//命令方法
summary: Append a value to a key	
since: 2.0.0				//说明此命令在哪个版本中引入的
group: string				//该命令所属哪一个组

查看有哪些组:

help TAB键

切换数据库:

select 1

3.键的遵循:

可以使用ASCII字符
键的长度不要过长,键的长度越长则消耗的空间越多
在同一个库中,键的名称不得重复,如果复制键的名称,实际上是修改键中的值
在不同的库中,键的名称可以重复
键可以实现自动过期

4.String的操作

设置键值:set 1  bbb
	NX:如果一个键不存在,才创建并设定值,否则不允许设定
	XX:如果一个键存在则设置键的值,如果不存在则不创建并不设置其值
	EX:定义一个键设置时间为60S
取得值: get 1
添加键中的值:append 1 xxx
获取键中值的字段长度:strlen 1
增加键中的整数值:incr fda  //注:incr命令只能对整数使用
删除键:def 1
查看所有键:keys *

5.列表的操作

键值指向一个列表,而列表可以理解为是一个字符串的容器,列表是有众多元素的集合,可以在键所指向的列表中附加一个值。
LPUSH	//在键所指向的列表前面插一个值(左边加入)
RPUSH	//在键所指向的列表后面插一个值(右边加入)
LPOP	//在键所指向的列表前面删除一个值(左边删除)
RPOP	//在键所指向的列表后面删除一个值(右边删除)
LINDEX	//根据索引获取值,指明索引位置进行获取对应的值
LSET	//用于修改指定索引的值为制定的值
指定一个新的列表,在帮助中并没阐明哪个命令用于创建一个新的列表,实际创建一个新的列表使用LPUSH或RPUSH都可以。

6.认证方法

(1)redis.conf
requirepass foobared   //启用此项,修改密码

7.清空数据库

flushdb  清空当前数据库
flushall  清空所有库

四、持久化

1.持久化概述:

默认情况下,redis工作时所有数据及都是存储于内存中的,不论是否有磁盘上的持久化数据,都是工作中内存当中,redis本身就是一个内存的数据库,把所有数据库相关的存储都存储的内存中,如果redis崩溃或断电导致所有数据丢失,所以redis提供了持久化功能来保证数据的可靠性,redis持久化有两种实现,RDB和AOF

2.RDB:

存储为二进制格式的数据文件,默认启动的持久化机制,按事先定制的策略,周期性地将数据保存至磁盘,使用save命令即可设定周期和策略即可;数据文件默认为dump.rdb,客户端连接服务器以后可以用去使用save命令进行保存数据至磁盘。
保存快照有两种方式:
(1)客户端也可显式使用SAVE或BGSAVE命令启动快照保存机制;
(2)借助于配置文件所定义的SAVE和策略进行保存:
SAVE:是同步保存,在客户端使用SAVE保存快照时,是在redis主线程中保存快照;因为redis的主线程是用于处理请求的,所以此时会阻塞所有客户端请求,每次的保存快照都是把内存中的数据完整的保存一份,并非是增量的,如果内存中的数据比较大,而还有大量的写操作请求时,此方式会引起大量的I/O,会导致redis性能下降。
BGSAVE:异步方式,将立即返回结果,但自动在后台保持操作,所以BGSAVE命令启动以后,前台不会被占用,客户端的请求是不会被阻塞(主进程不会被阻塞)
如果是在配置文件中定义的save,那么redis在持久化的时候,则会开启另外的进程去处理,不会阻塞的redis的主进程。
reids的RDB持久化不足之处则是,一旦数据出现问题,由于RDB的数据不是最新的,所以基于RDB恢复过来的数据一定会有一部分数据丢失,也就是RDB保存之后的修改的数据会丢失。

3.AOF:

有着更好的持久化能力的解决方案,AOF类似于Mysql的二进制日志,记录每一次redis的写操作命令,以顺序IO方式附加在指定文件的尾部,是使用追加方式实现的,这也叫做一种附加日志类型的持久化机制,由于每一次的操作都记录,则会随着时间长而增大文件的容量,并且有些记录的命令是多余的,AOF不像RDB,RDB是保存数据及的本身。
BGREWRITEAOF:AOF文件重写。
不会独缺正在使用的AOF文件,而通过将存储中的数据,为内存的所有数据生成一个命令集,以命令的方式保存到临时文件中,完成之后替换原来的AOF文件;所以AOF文件是通过重写将其变小。

4.配置文件中的与RDB相关的参数:

stop-writes-on-bgsave-error yes   //在进行快照备份时,一旦发生错误的话是否停止
rdbcompression yes   //RDB文件是否使用压缩,压缩会消耗CPU
rdbchecksum yes //是否对RDB文件做校验码检测,此项定义在redis启动时加载RDB文件是否对文件检查校验码,在redis生成RDB文件是否生成校验信息,在redis再次启动或装载RDB文件时,是否检测校验信息,如果检测的情况下会消耗时间,会导致redis启动时慢,但是能够判断RDB文件是产生错误
dbfilename dump.rdb  //定义RDB文件的名称
dir /var/lib/redis    //定义RDB文件存放的目录路径

127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/opt/redis-6.0.1/conf/6379/data"

5.配置文件中与AOF相关的参数:

appendonly no	//定义是否开启AOF功能,默认为关闭
appendfilename "appendonly.aof"   //定义AOF文件
appendfsync always //标识每次收到写命令式,立即写到磁盘上的AOF文件,虽然是最好的持久化功能,但是每次有些命令时都会有磁盘的I/O操作,容易影响redis的性能。
appendfsync everysec  //表示每秒钟写一次,不管每秒钟收到多少个写请求都往磁盘中的AOF文件中写一次
appendfsyn no    //表示append功能不会触发写操作,所有的写操作都是提交给OS,由OS自行决定是如何写的 
no-appendfsync-on-rewrite no //当此项为yes时,表示在重写时,对于新的写操作不做同步,而暂存在内存中
auto-aof-rewrite-percentage 100 //表示当前AOF文件的大小是上次重写AOF文件的二倍时,则自动日志重写过程
auto-aof-rewrite-min-size 64mb //定义AOF文件重写过程的条件,最少为定义大小则触发重要过程
注意:持久本身不能取代备份,还应该制定备份策略,对redis数据定期进行备份。

6.RDB与AOF同时启用:

(1)BGSAVE和BGREWRITEAOF不会同时执行,为了避免对磁盘的I/O影响过大,在某一时刻只允许一者执行;
(2)在Redis服务器启动用于恢复数据时,会优先使用AOF

五、redis主从架构(实现读写分离)

1.复制的工作过程:

主库会基于pingcheck方式检查从库是否在在线,如果在线直接同步数据文件至服务端,从服务端也可以主动发送同步请求到主服务端,主库如果是启动了持久化功能时,会不断的同步数据到磁盘上,主库一旦受到从库的同步请求时,主库会将内存中的数据同步给从库,从库得到以后是保存在本地文件中(磁盘),而后则把该文件装载到内存中完成数据重建,链式复制也同步如此,因为主是不区分是真正的主还是另外的从。
(1)启动-slave
(2)slave会向master发送同步命令,请求主库上的数据,不论从是第一次连接还是非第一次连接,master此时都会启动一个后台的紫禁城将数据快照保存在数据文件中,然后把数据文件发送给slave
(3)slave收到数据文件以后会保存到捉本地,而后把文件重载装入内存

2.特点

(1)一个Master可以有多个slave
(2)支持链式复制(一个slave也可以是其他的slave的slave)
(3)master以非阻塞方式同步数据至slave(master可以同时处理多个slave的读写请求,slave端在同步数据时也可以使用非阻塞方式)

3.启用复制功能:

(1)使用用户端启用:
在slave上:
>SLAVAOF MASTER_IP MASTER_PORT
例:
127.0.0.1:6379>slaveof 192.168.1.64 6379   //成为从库
(2)在配置文件中修改
SLAVAOF <MASTER_IP> <MASTER_PORT>
slaveof 192.168.1.64 6379

######## info

# Replication
role:master
connected_slaves:0
master_replid:a856339b7bd8bf6f13ddd867b7ac5d87e6ebfbf6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
master_repl_meaningful_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

4.主从相关配置:

slave-server-stale-data yes    //表示当主服务器不可以用时,则无法判定数据是否过期,此时从服务器仍然接收到读请求时,yes表示仍然响应(继续使用过期数据)
slave-read-only yes //启用slave时,该服务器是否为只读
repl-diskless-sync no //是否基于diskless 机制进行sync操作,一般情况下如果disk比较慢,网络带宽比较大时,在做复制时,此项可以改为YES
repl-diskless-sync-delay 5  //指定在slave下同步数据到磁盘的延迟时间,默认为5S,0表示不延迟
slave-priority 100   //指定slave优先级,如果有多个slave时,那一个slave将优先被同步
mim-slaves-to-write 3 //此项表示在主从复制模式当中,如果给主服务器配置了多个从服务器时,如果在从服务器少于3个时,那么主服务器将拒绝接受写请求,从服务器不能少于该项的指定值,主服务器才能正常接收用户的写请求。
min-slaves-max-lag 10 //表示从服务器与主服务器的时差不能够相差与10秒钟以上,否则写操作将拒绝进行
注意:如果Mastershiyong requirepass开启了认证功能,从服务器要使用masterauth<PASSWORD>来连入服务请求使用此密码进行认证
主从复制的问题:
例:有一主三从,如果主服务器离线,那么所有写操作操作则无法执行,为了比年此情况发生,redis引入了sentinel(哨兵)机制

六、使用sentinel实现主从架构高可用

1.sentinel的工作过程:

sentinel安装的另外的主机上,sentinel主机即能监控又能提供配置功能,想sentinel指明主redis服务器即可(仅监控主服务器),sentinel可以从主服务器中获取主从架信息,并分辨从节点,sentinel可以监控当前整个主从服务器架构的工作状态,一旦发现master离线的情况,sentinel会从多个从服务器中选择并提升一个从节点成为主节点,当主节点被从节点取代以后,那么IP地址则发生了,客户所连接之前的主节点IP则无法连接,此时可以向sentinel发起查询请求,sentinel会告知客户端新的主节点的IP,所以sentinel是redis在主从架构中实现高可用的解决方案,sentinel为了误判和单点故障,sentinel也应该组织为集群,sentinel多个节点同时监控redis主从架构,一旦有一个sentinel节点发现redis的主节点不在线时,sentinel会与其他的sentinel节点写上其实的sentinel节点是否也为同样发现redis的主节点不在线的情况,如果sentinel的多个点节点都发现redis的主节点都为离线的情况,那么则判断redis主节点为离线状态,以此方式避免误判,同样也避免了单点故障。

2.sentinel

用于管理多个redis服务实现HA;
监控多个redis服务节点
自动故障转移
sentinel也是一个分布式系统,可以在一个架构中运行多个sentinel进程,多个进程之间使用“留言协议”接收redis主节点是否离线,并使用“投票协议”是否实现故障转移,选择哪一个redis的从服务器成为主服务器。

3.启用sentinel

redis-sentinel可以理解为运行有着特殊代码的redis,redis自身也可以运行为sentinel,sentinel也依赖配置文件,用于保存sentinel不断收集的状态信息
程序:
redis-sentinel /path/to/file.conf
redis-server /path/to/file.conf  --sentinel
运行sentinel的步骤
(1)服务器自身初始化(运行redis-server中专用于sentinel功能的代码);
(2)初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表
(3)创建连向master的连接;

4.专用配置文件:/etc/redis-sentinel.conf

(1)#sentinel monitor<master-name><ip><redis-port><quorum>  //此项可以出现多次,可以监控多组织redis主从架构,此项用于监控主节点<master-name>自定义的主节点名称,<ip>主节点的ip地址,<redis-port>主节点的端口号,<quorum>主节点对应的quorum法定数量,用于定义sentinel的数量,是一个大于值尽量使用奇数,如果sentinel有3个,则指定为2即可,如果有4个,不能够只定位2,避免导致集群分裂,注意<master-name>为集群名称,可以自定义,如果同时监控有多组redis集群时,<master-name>不能同样
(2)sentinel down-after-milliseconds <master-name><milliseconds>  //sentinel连接其他节点超时时间,单位为毫秒(默认为30秒)
(3)sentinel parallel-syncs <master-name> <numreplicas>  //提升主服务器时,允许多少个从服务器向新的主服务器发起同步请求
(4)sentinel failover-timeout <master-name> <milliseconds> //故障转移超时时间,在指定时间没能完成则判定为失败,单位为毫秒(默认为180秒)

5.命令

#启动sentinel 命令 
./redis-sentinel /opt/data/redis/redis-6.0.3/sentinel.conf
#查看sentinel信息
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1
#查看master信息
sentinel masters
#查看从信息
sentinel slaves mymaster 

七.高可用配置部署

1.复制redis.conf文件

cp redis.conf redis2.conf  
cp redis.conf redis3.conf

2.修改redis2.conf ,redis3.conf

vim redis2.conf
port 6380
bind 127.0.0.1
pidfile "/var/run/redis_6380.pid"
logfile "/opt/redis-6.0.1/conf/6379/logs/redis_6380.log"
dir "/opt/redis-6.0.1/conf/6379/data2"
slaveof 192.168.1.64 6379

3.启动redis,redis2,redis3

./redis-server /opt/redis-6.0.1/conf/6379/redis.conf
./redis-server /opt/redis-6.0.1/conf/6379/redis2.conf
./redis-server /opt/redis-6.0.1/conf/6379/redis3.conf

4.修改sentenel.conf文件

vim sentenel.conf
sentinel monitor mymaster 127.0.0.1 6380 1

5.启动sentenel.conf

./redis-sentinel /opt/data/redis/redis-6.0.3/sentinel.conf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值