redis
2018-06-22 05:31:31来源:未知 阅读 ()
1. 什么是Redis
Redis是Remote 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类型操作
string是redis最基本的类型
redis的string可以包含任何数据。包括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开始,截取的内容包括start和end位置。
3. 数据类型List链表
list类型其实就是一个双向链表。通过push,pop操作从链表的头部或者尾部添加删除元素。
这使得list既可以用作栈,也可以用作队列。
上进上出 (下进下出):栈
上进下出 (下进上出):队列
该list链表类型应用场合:
获得最新的10个登录用户信息: select * from user order by logintime desc limit 10;
以上sql语句可以实现用户需求,但是数据多的时候,全部数据都要受到影响查询,对数据库的负载比较高。必要情况还需要给关键字段(id或logintime)设置索引,索引也比较耗费系统资源
如果通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。链表内部只保留最新登录系统的10个用户信息。每次就可以从链表中直接获得需要的数据。极大节省各方面资源消耗。
通过list链表保存登录系统的最新5个用户信息:
jim xiaoli jack xiaoming linken mary tom
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
list链表内部有多个元素,彼此有顺序。
set集合内部有多个元素,彼此没有顺序。
tom对linken取差集:结果只有tom的,没有linken的
linken对tom取差集:结果只有linken的,没有tom的
总结:
- 安装redis,直接make,再复制相关文件到运行目录
- 使用
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是两种类型(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帖子信息
排序集合中的每个元素都是值、权的组合
(之前的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秒超过10个key被修改,发起快照
save 60 10000 #60秒超过10000个key被修改,发起快照
上述三个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查询 / insert、update、delete写入操作 == 7 / 1
把原先一台redis服务器做的工作 现在交给多个服务器去完成,可以明显降低每台服务器的工作量。
为了降低每个redis服务器的负载,可以多设置几个,并做主从模式
一个redis服务器负载“写”(添加、修改、删除)数据,其他服务器负载“读”数据
主服务器数据会“自动”同步给从服务器
redis.conf配置文件修改后需要重启进程(杀掉旧进程,启动新进程)
此时就可以看到主服务器给从服务器自动同步的数据。
五. php与redis结合
1. 安装php的redis扩展
进入安装phpredis步骤:
在php.ini配置文件中引入redis扩展:
2. 通过php操作redis
redis在php里边就是一个操作类,名称为“Redis”
据使用redis,就是创建一个对象,对象调用方法即可,
Redis类的各种方法的名称 与 redis大部分指令的名称一致,
方法的参数 就 是指令的参数。
例如:
> set key value
php: $obj->set(key,value);
/usr/local/http2/htdocs/redis.php
3.php中redis的可操作方法有哪些
利用“反射Reflection”获得一个类中所有的可操作方法。
反射在oop面向对象里边的一点作用:
① 可以感知类中全部的可以操作方法
② 可以感知类的方法是否是public、protected、private、finall
总结:
- Sort set排序集合类型
每个元素:权/值
场合:获得最热门帖子信息等
- 持久化操作
a) 快照:每次备份全部数据
b) AOF:备份每个写指令
- 主从模式
- 给php安装redis扩展
a) 安装软件phpredis、autoconf
- php操作redis
redis在php中就是一个类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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:面向对象写法
下一篇:面向对象三要素:封装,继承,多态
- Laravel框架实现redis集群的方法分析 2020-01-17
- PHP使用Redis实现防止大并发下二次写入的方法 2019-12-29
- PHP+redis实现添加处理投票的方法 2019-12-25
- 深入解析PHP中redis的用法 2019-10-12
- 为什么选择PHP作为网站开发的语言 2019-08-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash