Redis高性能内存数据库

一、什么是Redis?

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。

二、Redis与Memcached的区别

(1)持久化:
Redis可以用来做缓存,也可以做存储;支持ADF和RDB两种持久化方式
Memcached只能缓存数据

(2)数据结构:
Redis有丰富的数据类型:字符串、链表,Hash、集合,有序集合
Memcached一般就是字符串和对象

三、Redis的安装与配置

解压:tar -zxvf redis-3.0.5.tar.gz

make

make PREFIX=/usr/local/redis install

cp /usr/local/redis-3.0.5/redis.conf /usr/local/redis/

(1)Redis的核心配置文件:redis.conf
在这里插入图片描述
(2)Redis的命令脚本:

redis-benchmark  //性能测试工具
redis-check-aof  //检查AOF日志
redis-check-dump //检查RDB日志
redis-cli        //启动命令行客户端
redis-sentinel  
redis-server     //启动Redis服务

(3)启动Redis:

[root@node3 redis]# ./bin/redis-server conf/redis.conf 

通过ps命令查看:

[root@node3 redis]# ps -ef | grep redis

(4)启动Redis的客户端:redis-cli

默认连接端口:

[root@node3 redis]# ./bin/redis -cli

四、Redis的操作

4.1 键值操作

键值命令:

keys pattern
randomkey
exists key
type key
expire key
pexpire key
persist key

4.2 数据类型

(1)字符串:
在这里插入图片描述
(2)链表:
在这里插入图片描述
(3)Hash:
在这里插入图片描述
(4)无序集合:
在这里插入图片描述
(5)有序集合:
在这里插入图片描述

4.3 Redis数据类型案例分析:网站统计用户登录的次数

a.1亿个用户,有经常登录的,也有不经常登录的
b.如何来记录用户的登录信息
c.如何查询活跃用户:比如:一周内,登录3次的

(1)解决方案一:采用关系型数据库
在这里插入图片描述
(2)解决方案二:采用Redis存储登录信息

可以使用Redis的setbit,登录与否:有1和0就可以表示
在这里插入图片描述

4.4 Java客户端

(1)基本操作:
在这里插入图片描述
(2)连接池:
在这里插入图片描述
(3)使用Redis实现分布式锁:

使用Maven搭建工程:

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.9.0</version>
</dependency>

五、Redis的事务和消息机制

5.1 Redis的事务

Redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就 结束事务上下文。
在这里插入图片描述
redis不是真正的事务,是一种事务的模拟

5.2 Redis的事务示例:银行转账

从Tom转100块钱给Mike

127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set mike 1000
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 100
QUEUED
127.0.0.1:6379> incrby mike 100
QUEUED
127.0.0.1:6379> exec
1) (integer) 900
2) (integer) 1100

5.3 dis的锁机制:watch

举例:买票

(1)没有使用锁机制:

127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 500
QUEUED
127.0.0.1:6379> decr ticket 
QUEUED
在提交之前从另一个窗口把票买了
127.0.0.1:6379> exec
1) (integer) 500
2) (integer) -1

(2)使用Redis锁机制:
执行事务操作的时候,如果监视的值发生变化,则提交失败。

127.0.0.1:6379> set tom 1000
OK
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby tom 500
QUEUED
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> exec
(nil)   //打印出nil代表操作没有执行,或者操作执行失败
127.0.0.1:6379> get tom
"1000"
127.0.0.1:6379> get ticket
"0"

在这里插入图片描述

5.4 Java应用程序中的事务和锁

(1)事务:
在这里插入图片描述
(2)锁:
在这里插入图片描述

5.5 Redis的消息机制:

消息的发布与订阅,适合做在线聊天

(1)消息类型:

Queue消息:队列(点对点) 张三发给李四,只有李四收到。消息可以是字符串,也可以是对象。
Topic消息:主题(广播、群发):发布消息、订阅消息

(2)常见的消息系统:

Redis:只支持Topic消息
Kafka:只支持Topic消息,需要zookeeper支持。
JMS:Java Messaging Service。Java消息服务标准,支持Queue,也支持Topic。
产品:Weblogic

(3)Redis的消息机制

publish:发布消息

publish channel 名称 “消息内容”

subscribe: 订阅消息

subscribe channel 名称

psubscribe: 使用通配符定义消息

psubscribe channel * 名称

(4)使用Java程序实现消息的发布与订阅,需要继承JedisPubSub类
在这里插入图片描述

六、Redis的持久化

Redis 提供了多种不同级别的持久化方式:

(1)RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

(2)AOF (Append-only file)持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

(3)Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

(4)甚至可以关闭持久化功能,让数据只在服务器运行时存在。

6.1 RDB

本质:备份和恢复
弥补memcached不足

(1)工作原理:每隔一定时间给内存照一个快照,将内存中的数据写入文件(rdb文件)
当内存数据崩溃,重新启动redis时,会读这个文件。

(2)配置参数:redis.conf文件

(3)RDB生成策略

147 save 900 1900秒内,如果有1个key发生变化,就执行rdb
148 save 300 10300秒内,如果有10个key发生变化,就执行rdb
149 save 60 1000060秒内,如果有10000个key发生变化,就执行rdb
    
save 时间(秒) 数字(key变化个数)
从下往上看

其他参数:

164 stop-writes-on-bgsave-error yes
当后台写进程出错的时候,禁止写入新的数据
     
bgsave 手动触发RDB命令
    
170 rdbcompression yes
是否压缩  如果看中性能,选择no
压缩会节约空间,但会影响备份和恢复性能。
    
182 dbfilename dump.rdb
192 dir ./

(4)RDB示例测试:可以使用redis-benchmark进行压力测试

./bin/redis-benchmark -n 100000  //表示执行100000个操作

(5)RDB的优缺点:

优点:恢复速度快

缺点:

在两次快照之间,如果发生断电,数据会丢失
举例:在生成rdb后,插入新值。突然断电,数据可能会丢失。解决办法:AOF

6.2 AOF:通过日志的方式

(1)工作原理:记录操作的命令
客户端在操作redis时,把所有客户端的操作记录到文件中,如果发生崩溃,把操作完全恢复一遍,就恢复了数据。

(2)配置参数:

默认是禁用的。需要修改参数,来启动。

509 appendonly yes //将no改为yes,启动aof

在这里插入图片描述
(3)AOF记录日志策略

538 # appendfsync always  每个操作都记录日志:优点 安全。缺点:慢。
539 appendfsync everysec
540 # appendfsync no   由操作系统来决定记录日志的方式。不会用得到
 

默认是每秒记录一次日志

(4)AOF的日志重写:rewrite

将内存中的key逆向生成命令,如同一个可以,反复操作了100次,aof文件会记录100次操作,这样会导致AOF文件过大

例如:
set age 0
incr age
incr age
... 自增100次

最后 age的值是101      
经过重写后,直接执行: 
set age 100  //这句话效果和上面101条效果一样

可以通过观察aof日志文件的大小

测试:

./redis-benchmark -n 100000 //模拟10万次redis操作

aof参数设置:

561 no-appendfsync-on-rewrite no
执行重写的时候,不写入新的日志
      
581 auto-aof-rewrite-min-size 64mb
执行重写的aof文件大小。超过64M就触发重写

6.3 Redis持久化注意的问题

(1)RDB恢复的速度快

(2)如果RDB和AOF都有,默认使用AOF进行恢复

七、Redis的集群

7.1 集群的作用

(1)主从备份 防止主机宕机

(2)读写分离,分担master的任务

(3)任务分离,如从服分别分担备份工作与计算工作

7.2 Redis集群的两种部署方式

主从复制架构:
1、星型模型
2、线性模型

优缺点:
    
    星型结构:
     优点:效率高,两个slave地位一样,可以直接从主节点读取数据
     缺点:实现HA比较困难。主节点挂了,把一个slave变成主,其他的slave再去连他。
     提供哨兵机制来解决这个问题。
     
    线性模型:
     优点:HA简单。
     缺点:效率不如星型模型高。

生产中大多使用星型模型
在这里插入图片描述

7.3 Redis主从服务的通信原理

在这里插入图片描述

7.4 配置Redis的集群(主从模式)

搭建:

[root@node3 redis]# ./bin/redis-cli shutdown
[root@node3 redis]# ps -ef | grep redis
[root@node3 redis]# cd conf/
[root@node3 conf]# cp redis.conf redis6379.conf 
[root@node3 conf]# cp redis.conf redis6380.conf 

(1)主节点:关闭rdb和aof即可

147 #save 900 1
148 #save 300 10
149 #save 60 10000
   
509 appendonly no

启动主节点:

[root@node3 redis]# ./bin/redis-server conf/redis6379.conf

[root@node3 redis]# ./bin/redis-cli

127.0.0.1:6379> set money 100

(2)从节点:
开启rdb和aof

50 port 6380
182 dbfilename dump6380.rdb
211 slaveof 192.168.109.133 6379
514 appendfilename "appendonly6380.aof"

启动从节点:

[root@node3 redis]# ./redis-cli -p 6380

127.0.0.1:6380> get money
"100"


//注意:从节点不能写入数据,写入的话会报错
127.0.0.1:6380> set tom 1000
(error) READONLY You can't write against a read only slave.

注意:一次启动从节点的个数不要太多,因为如果有太多从节点,会给主节点增加很多同步压力。

7.5 Redis集群的高可用性

(1)Redis 2.4+自带了一个HA实现Sentinel
Redis 2.4之后,有哨兵
正常情况下,哨兵就是监控master状态,接收master心跳
如果接收不到心跳,认为master死掉。进行HA切换。

(2)配置文件:sentinel.conf
在这里插入图片描述

redis-sentinel ../etc/sentinel.conf

(3)查看日志:
在这里插入图片描述

7.6 实现Redis的代理分片

(1)Twemproxy是一种代理分片机制,由Twitter开源。

(2)Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。
在这里插入图片描述
(3)安装

./configure --prefix=/root/training/proxy

make

make install

(4)配置文件
在这里插入图片描述

(5)检查配置文件是否正确

./nutcracker -t conf/nutcracker.yml

(6)启动代理服务器

./nutcracker -d -c conf/nutcracker.yml
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读