redis

2018-06-22 05:31:31来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

1. 什么是Redis

RedisRemote Dictionary Server(远程数据服务)的缩写

 

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

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

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

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

 

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

 

 

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

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

 

 

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

 

缓存的两种形式:

页面缓存经常用在CMS(content manage system)内容管理系统里边(Smarty缓存)

 

不发生变化的新闻信息页面适合做“页面缓存”,每个用户就从一个静态页面访问该新闻即可。

 

 

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

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

 

3. 安装redis

 

 

 

 

 

 

 

 

 

 

此时redis运行目录 /usr/local/redis内部已经存在三个文件:

(redis-cli/redis-server/redis.conf)

 

 

Ctrl+C关闭该前台服务进程。

 

修改配置文件/usr/local/redis/redis.conf,设置后台启动redis

 

 

 

 

 

 

 

 

 

4. 简单使用

 

二. 具体使用

redis中数据模型为:key-value

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

1. key的操作

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

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

 

 

 

 

 

 

 

16个数据库通过下标标志:0  1  2  3 。。。。。 15

 

 

 

 


2. String类型操作

stringredis最基本的类型

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

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

 

incr:  increment增长

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

      用于计数器使用

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

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

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

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

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

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

 

 

 

 

3. 数据类型List链表

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

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

上进上出 (下进下出)

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

 

 

 

list链表类型应用场合:

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

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

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

 

 

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

jim   xiaoli  jack   xiaoming   linken   mary  tom

 

 

 

 

 

4. 
set集合类型

redissetstring类型的无序集合。

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

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

 

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

 

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

 

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

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

 

 

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

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

 

 

 

 

 

 

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

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

 

 

 

 

 

 

 

 

总结:

  1. 安装redis,直接make,再复制相关文件到运行目录
  2. 使用

a) key操作  exists   keys   rename   dbsize  flushdb  flushall  select

b) String操作  set   get   mset  mget   incr   decr  incrby  decrby  append  substr

c) list链表操作  lpush  rpop   lrange   llen  ltrim

d) set集合操作  sadd   smembers   scard  sinter  sdiff  sunion

 

 

5. Sort Set排序集合类型

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

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

 

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

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

 

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

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

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

 

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

值:元素的具体信息。

 

Sort set类型适合场合:

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

select * from message order by backnum desc limit 5;

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

 

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

 

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

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

 

我们只做一个sort set排序集合,里边只保留5个元素信息,该5个元素是回复量最高的,

每个帖子被回复的时候,都有机会进入该集合里边,但是只有回复量最高的前5个帖子会存在于在集合,回复量低的就被删除。

 

 

 

 

 

 

 

三. 持久化功能

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

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

1. snap shotting快照持久化

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

 

 


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

 

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

save 300 10     #300秒超过10key被修改,发起快照

save 60 10000   #60秒超过10000key被修改,发起快照

上述三个save备份的考虑:

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

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

 

1.1 手动发起快照持久化

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

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

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

 


2. append only file AOF持久化)

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

 

 

 


2.1开启aof持久化

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

 

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

 

 

 

 

2.2. aof持久化备份频率

 

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

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

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

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

 

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

例如:可以把多个incr指令设置为一个set指令。

 

 

redis相关操作指令:

 

四. redis的主从模式

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

select查询  / insertupdatedelete写入操作  ==   7 / 1

 

 

 

 

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

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

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

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

 

 

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

 

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

 

 

 

. phpredis结合

1. 安装phpredis扩展

 

 

 

 

 

 

 

 

 

 

进入安装phpredis步骤:

 

 

 

 

 

在php.ini配置文件中引入redis扩展:

 

 

 

 

 

2. 通过php操作redis

redisphp里边就是一个操作类,名称为“Redis

据使用redis,就是创建一个对象,对象调用方法即可,

Redis类的各种方法的名称  redis大部分指令的名称一致,

方法的参数  是指令的参数。

例如:

> set  key  value

php$obj->set(key,value);

 

/usr/local/http2/htdocs/redis.php

 

 

3.phpredis的可操作方法有哪些

利用“反射Reflection”获得一个类中所有的可操作方法。

反射在oop面向对象里边的一点作用:

① 可以感知类中全部的可以操作方法

② 可以感知类的方法是否是publicprotectedprivatefinall

 

 

总结:

  1. Sort set排序集合类型

每个元素:权/

场合:获得最热门帖子信息等

  1. 持久化操作

a) 快照:每次备份全部数据

b) AOF:备份每个写指令

  1. 主从模式
  2. php安装redis扩展

a) 安装软件phpredisautoconf

  1. php操作redis

redisphp中就是一个类Redis

 

 

作业:

在网站首页面显示最新登录系统的前10个用户信息。

利用list链表数据类型实现。

① 把开发好的项目代码文件全部移动到Linux系统去运行

② 继续在windows里边开发,调用linux系统的php接口实现。

$url1 = /usr/local/http2/htdocs/newlogin.php //list链表写入数据(删除旧数据)

$url2 = /usr/local/http2/htdocs/getlogin.php       //获得最新登录系统用户信息

 

window系统的php代码实现:

file_get_contents($url1?userid=101  /   $url2);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:面向对象写法

下一篇:面向对象三要素:封装,继承,多态