一.Redis

1. 什么是Redis

Redis是Remote Dictionary Server(远程数据服务)的缩写

 

由意大利人 antirez(Salvatore Sanfilippo)  开发的一款 内存高速缓存数据库

该软件使用C语言编写,它的数据模型为 key-value

它支持丰富的数据类型(结构),比如 String  list  hash   set  sorted set。

可持久化(随时把数据备份到硬盘中一份),保证了数据安全。

 

同一个select 查询sql语句,每天需要被执行查询100万次,并且每次查询获得的数据还是一样的。为了减轻数据库的负载,就把查询好的数据给缓存起来(存储在内存中),第一个用户执行从mysql中获得数据并存储到内存中,第二个 到 第100万次查询就直接从内存中获得数据。

 

使用缓存减轻数据库的负载。数据库是整个网站资源的“瓶颈”。

在开发网站的时候如果有一些数据在短时间之内不会发生变化,而它们还要被频繁访问,为了提高用户的请求速度和降低网站的负载,就把这些数据放到一个读取速度更快的介质上(或者是通过较少的计算量就可以获得该数据) ,该行为就称作对该数据的缓存。

该介质可以是文件、数据库、内存,内存介质经常用于数据缓存。

数据缓存经常会用在页面的具体数据里边使用

京东网站的一个页面从业务上看,数据有分类(推广商品、商品精选、普通商品),这些商品从数据库读取出来,为了降低数据库负载,可以给它们设置三个数据缓存,这样独立更新、独立读取。

二. 具体使用

redis中数据模型为:key-value

类似在php中定义变量:名称 = 值;

1. key的操作

给被存储信息取的的一个“名字”。

在redis里边,除了”\n”和空格 不能作为名字的组成内容外,其他键盘可见内容都可以作为key的名字部分。名字长度不做要求。

redis-trib.rb详解 redistic_数据


redis-trib.rb详解 redistic_持久化_02

2. String类型操作

string是redis最基本的类型

redis的string可以包含任何数据。包括jpg图片或者序列化的对象。

单个value值最大上限是1G字节。

 

redis-trib.rb详解 redistic_服务器_03

incr:  increment增长

      给变量进行数字累加一操作,类似i++

      用于计数器使用

  该指令可以用于新key 或 旧key的使用

  ① 新key:创建该key,同时设置为1的信息

  ② 旧key:要求该key的类型严格为‘int整型’的。

decr指令操作与incr操作类似,减一操作,具体使用可以参考incr指令。

incrby  decrby 是按照指定的幅度进行累加操作,具体使用参考incr指令。

substr  key  start end  //内容截取,内容下标从0开始,截取的内容包括start和end位置。

3. 数据类型List链表

list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。

这使得list既可以用作栈,也可以用作队列。

上进上出 (下进下出):栈

上进下出 (下进上出):队列

redis-trib.rb详解 redistic_服务器_04

 

 

 

该list链表类型应用场合:

获得最新的10个登录用户信息: select * from user order by logintime desc limit 10;

以上sql语句可以实现用户需求,但是数据多的时候,全部数据都要受到影响查询,对数据库的负载比较高。必要情况还需要给关键字段(id或logintime)设置索引,索引也比较耗费系统资源

如果通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。链表内部只保留最新登录系统的10个用户信息。每次就可以从链表中直接获得需要的数据。极大节省各方面资源消耗。

redis-trib.rb详解 redistic_持久化_05

通过list链表保存登录系统的最新5个用户信息:

jim   xiaoli  jack   xiaoming   linken   mary  tom

redis-trib.rb详解 redistic_持久化_06


redis-trib.rb详解 redistic_持久化_07


redis-trib.rb详解 redistic_服务器_08


redis-trib.rb详解 redistic_redis-trib.rb详解_09

4. set集合类型

redis的set是string类型的无序集合。

set集合最大可以包含(2的32次方-1  int整型的数字限制)个元素。

关于set集合类型除了基本的添加、删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐功能。

 

注意:每个集合中的各个元素不能重复。

 

该类型应用场合:qq好友推荐。

 

tom朋友圈(与某某是好友):mary  jack  xiaoming  wang5  wang6

linken朋友圈(与某某是好友):yuehan  daxiong  luce  wang5  wang6

redis-trib.rb详解 redistic_数据_10

list链表内部有多个元素,彼此有顺序。

set集合内部有多个元素,彼此没有顺序。

redis-trib.rb详解 redistic_redis-trib.rb详解_11


redis-trib.rb详解 redistic_服务器_12


redis-trib.rb详解 redistic_redis-trib.rb详解_13


redis-trib.rb详解 redistic_数据_14

对linken取差集:结果只有tom的,没有linken的

对tom取差集:结果只有linken的,没有tom的

redis-trib.rb详解 redistic_服务器_15


redis-trib.rb详解 redistic_服务器_16


redis-trib.rb详解 redistic_数据_17


redis-trib.rb详解 redistic_数据_18

5. Sort Set排序集合类型

list链表类型: 内部存储的元素有排序功能、会存在多个相同的元素。

Set集合类型: 元素没有排序功能、不存在多个相同元素

 

该Sort Set是两种类型(list和set)的集中体现,称为排序集合类型。

Sort Set类型:元素有排序功能、不存在多个相同元素

 

和set一样sorted set也是string类型元素的集合,

不同的是每个元素都会关联一个

通过权/值可以有序的获取集合中的元素

 

权:一个集合中多个元素做排序的标准。

值:元素的具体信息。

 

该Sort set类型适合场合:

获得最热门(回复量)前5个帖子信息:

select * from message order by backnum desc limit 5;

(以上需求可以通过简单sql语句实现,但是sql语句比较耗费mysql数据库资源  [或者是全部记录受到影响被查询   或者 是建立索引消耗额外资源])

 

案例:利用sort set实现获取最热门的前5帖子信息

redis-trib.rb详解 redistic_数据_19

排序集合中的每个元素都是值、权的组合

之前的set集合类型每个元素就只是一个 值)


redis-trib.rb详解 redistic_数据_20

,里边只保留5个元素信息,该5个元素是回复量最高的,

里边,但是只有回复量最高的前5个帖子会存在于在集合,回复量低的就被删除。

redis-trib.rb详解 redistic_redis-trib.rb详解_21


redis-trib.rb详解 redistic_redis-trib.rb详解_22


redis-trib.rb详解 redistic_持久化_23


redis-trib.rb详解 redistic_数据_24


redis-trib.rb详解 redistic_redis-trib.rb详解_25

三. 持久化功能

redis(nosql产品)为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。

数据保存到硬盘的过程就称为“持久化”效果。

1. snap shotting快照持久化

该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(10-20G)就不适合频繁进行该持久化操作。

redis-trib.rb详解 redistic_数据_26

该持久化备份的频率和触发机制:


redis-trib.rb详解 redistic_服务器_27

秒内如果超过 1 个 key 被修改,则发起快照保存

秒超过10个key被修改,发起快照

秒超过10000个key被修改,发起快照

备份的考虑:

数据变化快的时候,备份频率就快高一些[数据相对安全、服务器负载高些]

数据变化慢,备份的频率就低一些[服务器负载也低]

redis-trib.rb详解 redistic_持久化_28

1.1 手动发起快照持久化

手动发起一次快照持久化:

> ./redis-cli  [-h 主机名ip  -p 端口号码]  bgsave

  (-h  -p  参数可以给其他服务器做快照持久化)

redis-trib.rb详解 redistic_服务器_29

2. append only file (AOF持久化)

本质:把用户执行的每个“写”指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令而已(与mysql的备份还原类似)。

redis-trib.rb详解 redistic_服务器_30


redis-trib.rb详解 redistic_服务器_31

2.1开启aof持久化

(第一次开启该aof持久化会清空redis的全部数据):

redis-trib.rb详解 redistic_数据_32

为了修改的配置文件生效,需要重启服务:


redis-trib.rb详解 redistic_服务器_33


redis-trib.rb详解 redistic_持久化_34

2.2. 该aof持久化备份频率


redis-trib.rb详解 redistic_数据_35

# appendfsync always   //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用,【数据最安全,服务器性能最低】

appendfsync everysec   //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 【数据相对安全,服务器性能折中】

# appendfsync no   //完全依赖 os,性能最好,持久化没保证

          【数据安全性低,服务器性能最高】

2.3 为aof备份文件做优化压缩处理

指令设置为一个set指令。

redis-trib.rb详解 redistic_数据_36

相关操作指令:

redis-trib.rb详解 redistic_redis-trib.rb详解_37

四. redis的主从模式

mysql为了降低每个服务器负载,可以设置读写分类(有写服务器、有读取服务器)

select查询  / insert、update、delete写入操作  ==   7 / 1

把原先一台redis服务器做的工作 现在交给多个服务器去完成,可以明显降低每台服务器的工作量。

为了降低每个redis服务器的负载,可以多设置几个,并做主从模式

一个redis服务器负载“写”(添加、修改、删除)数据,其他服务器负载“读”数据

主服务器数据会“自动”同步给从服务器

redis-trib.rb详解 redistic_redis-trib.rb详解_38


redis-trib.rb详解 redistic_redis-trib.rb详解_39

redis.conf配置文件修改后需要重启进程(杀掉旧进程,启动新进程)

redis-trib.rb详解 redistic_持久化_40

此时就可以看到主服务器给从服务器自动同步的数据。


redis-trib.rb详解 redistic_redis-trib.rb详解_41