PHP数据库操作三:redis用法分析


Posted in PHP onAugust 16, 2017

本文实例讲述了PHP数据库操作redis用法。分享给大家供大家参考,具体如下:

memcache虽然好用,解决了数据库遇到高并发时的IO问题,但还有很多问题丞待解决:

1、数据持久性问题,memcache用内存进行存储,一旦memcache服务器宕机,那么所存储的数据全部丢失。

2、memcache存储的数据类型单一,只支持key-value型的数据,要存储复杂类型的数据,必然需要PHP脚本的大量逻辑操作。

redis基本介绍

redis也是一个内存非关系型数据库,它拥有memcache在数据存储上的全部优点,而且在memcache的基础上(memcache的介绍可以看前面一篇:https://3water.com/article/121315.htm

增加了数据持久性功能,redis用rdb和aof两种方式实现数据持久性,在服务器突然宕机时也能几乎保留已存的全部数据。
增加了string(字符串)、set(集合)、sorted_set(有序集合)、hash(哈希)、list(链表)数据类型,方便了多类型的存储和数据库操作。
增加了安全验证(可为服务器设置连接密码)。
redis的主从分离等系统更完善(官方开发)。
原生支持发布/订阅、队列、缓存等工具。

当然,相比较memcache,它的数据库操作也较为复杂。

redis的应用场景和安装

redis除了可以用在memcache能用的地方,它还可以用在:

可以用链表来存储数据,读取其最新信息。
可以用有序列表存储数据,读取其排行榜数据
可以用集合来存储关注/被关注信息。

在官网(http://redis.io/)下载到它的最新版本,直接解压,因为redis官方已经编译过了,直接进行make / make test ,在make install时可以指定其安装路径。

安装完成后,将安装包里的redis的conf文件mv到安装目录的bin目录下,它是配置和启动redis所必需的。

除此,安装目录文件下bin目录里还有如下文件。

redis-benchmark //性能测试工具 -n xxx 表示发出xxx条命令用来测试
redis-check-aof //检查aof日志的工具
redis-check-dump //检查rbd日志的工具
redis-cli       //客户端
redis-server    //redis的服务器进程
redis-sentinel //redis哨兵模式的进程

我们用vim打开redis.conf来简单配置redis服务器。

将daemonize 选项改为yes来后台运行
database n 设置一个redis服务器里有n个服务器,默认为0-15共16个
port n 来设置redis服务器的监听端口
设置requirepass yourpassword来设置密码,客户端连接后用auth password来通过验证

我们使用./redis-server ./redis.conf命令来打开redis服务器。

使用./redis-cli [-p port]来连接服务器(默认6379)。

redis的命令

基本(包括string字符串类型)命令

set key value [ex|px n] //设置值[并设置过期时间为n秒/毫秒]
get key //获取值
del key //删除值
incby|decby key n //将key值自增或自减n
rename key newkey//覆盖原来的
select n//选择第n个数据库
ttl key //查询key的过期时间,-1表示永不过期,不存在的为-2
expire key n //设置key的过期时间为n秒 
type key //获取key的存储类型
flushdb //清除当前数据库中的值
shutdown [nosave]//关闭服务器[不存储]

list(链表)命令

lpush/rpush list value1 [value2 value3...] //将value压入链表头/尾
lpop/rpop list //弹出链表头/尾的值
llen list //获取链表长度

set(集合)命令

sadd set value //往集合中添加value
smembers set //查看集合中的全部数据
srem set value1[value2...]//删除集合中的元素
sismember set value //判断value是否是集合中的一个元素

sorted_set(有序集合)命令

zadd sorted_set score1 key1 score2 key2 score3 key3...向有序集合中添加key,并定义其score,集合会用score对其排序
zrange sorted_set a b [withscores]从第a到第b显示有序列表中的值 b为-1时显示全部,[显示各个值的score]
zrank/zrevrank sorted_set key 正序/倒序显示key在有序集合中的位置
zrem sorted_set key 删除有序集合中的key
zcard sorted_set [m n]计算有序集合中[score在m到n之间的]一共有多少个

hash(哈希类型)命令

hset hashset key value 设置hash表key的值为value
hget hashset key 获取hash表的key值
hdel hashset key 删除hash表中的一个key
hlen hashset 获取hash表的长度

redis命令繁多,这里只列了一点简单的,具体命令可以其官网或其中文站http://www.redis.cn/查看翻译文档

redis的事务和发布、订阅

redis中的事务与mysql的类似,只有语句有些不同。

redis        mysql
开始事务    multi      start transition
          事务中的query语句
执行事务    exec        commit
回滚事务    discard       roll back

对于并发影响,redis有watch语句控制,被watch语句监测的key值一旦在事务提交前发生变化,则事务自动被取消回滚。

watch key1 [key2...]
unwatch 取消所有监测。

redis原生发布和订阅功能,它类似于设计模式中的观察者模式,被订阅对象一旦发布了新的消息,那么所有订阅对象都会收到这条消息。使用方式为:

subscribe key //订阅某个key,如果这个key发布了新的消息,则会收听到
public key value//发布消息key,值为value,返回值是收到这个消息的人的个数
unsubscribe key //取消监听
psubscribe key1 key2/pattrn //[根据模式]监听多个key

redis的数据持久化

redis通过rdb和aof两种方式实现数据持久化,两种数据持久化方式都会占用CPU资源,拖慢redis的执行效率,一般两种模式配合使用。

rdb方式的主要原理就是达到某一写入条件后把内存中的所有数据的快照保存一份到磁盘上,数据恢复时用数据快照恢复。

aof方式是通过将每条redis执行命令记录入文本文件,恢复数据时重复执行记录的命令。

rdb方式实现数据持久化

用save/bgSave命令可以主动使用rdb方式[后台]存储rdb

修改redis.conf文件进行配置

save m n          //在m秒内有n次修改即进行一次快照,保存点很重要,一般会配置多个条件,满足其中之一就保存
stop-writes-on-bgsave-error yes //在进行快照的过程中如果出错,则停止写入
rdbcompression yes     //设置进行数据压缩
rdbchecksum yes       //导入数据时检查文件是否损坏
dbfilename xxx.rdb     //导出的文件名
dir path          //导出的文件路径

aof方式实现数据持久化

aof持久化的问题在于将每条指令都记录下来,即使是对一个键的反复操作,这样会导致aof文件越来越大,使用aof重写将会大大减小aof文件的体积,因为它是在最后将数据库内数据的状态统一逆化为命令,而不论一个key经过了多少次变化。使用 bgrewrite 命令可手动重写aof文件。

配置redis.conf文件:

noapppendfsync-on-rewrite yes    //设置导出rdb时停止写入aof,aof会被写在内存队列里,dump rdb 完成后统一进行写入操作。
appendfsync everysec        //每秒写入一次
appendfilename           //path/filename.aof
auto-aof-rewrite-percentage 100   //文件大小增长100%时重写
auto-aof-rewrite-min-size 64m    //文件至少达到64m时重写

redis的主从复制

主从复制时,主从都要以自己的.conf文件来启动服务器。主服务器可以将rdb关闭,以从服务器来产生rdb,加快主服务器的速度。

从服务器复制一个redis6380.conf文件,设置端口,pid存放文件,只读,主服务器的密码。

port 6380
pidfile filename
slave-read-only yes
masterauth password

设置完成后,分别用不同的conf文件打开服务器。

考虑到主服务器宕机的情况,我们用sentinel redis哨兵来监测服务器状态,在主服务器宕机之后做出反应。sentinel是redis集成的,我们只需要将安装包里的sentinel.conf文件拷贝到redis/bin目录下,使用redis-sentinel进程文件来启动服务器即可。

port 26379                    //sentinel监听的端口号
daemonize yes                  //后台启动进程
sentinel monitor mymaster 192.168.100.211 6379 2 //设置主进程ip和端口号,并设置两个哨兵发现主服务器长时间无法连接才判定其宕机
sentinel down-after-milliseconds mymaster 30000 //30000毫秒连接不上判定为无法连接
sentinel parallel-syncs mymaster 1        //一个主服务器打开时,同时复制的从服务器数,太大的话会造成服务器瞬间拥堵
sentinel failover-timeout mymaster 900000    //在90000秒内哨兵不再试图恢复原主服务器

PHP操作redis服务器

安装好php的redis扩展后(具体可参考前面的文章 Linux下php安装Redis扩展的方法 https://3water.com/article/99775.htm),就可以直接使用redis的类函数库了。

如下是典型的redis应用。

$redis=new Redis();           //实例化一个Redis对象
$redis->connect('host',port);      //连接redis服务器
$redis->auth('password');        //用密码认证
$redis->set($key,$value[,$expire_time]);//设置一个值
$content=$redis->get($key);       //获取值

具体函数使用可以看官方的文档:https://github.com/phpredis/phpredis

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个简易需要注册的留言版程序
Oct 09 PHP
php header功能的使用
Oct 28 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
本地计算机无法启动Apache故障处理
Aug 08 PHP
PHP实用函数分享之去除多余的0
Feb 06 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 PHP
PHP编写RESTful接口的方法
Feb 21 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
Jun 30 PHP
php 的反射详解及示例代码
Aug 25 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
php使用QueryList轻松采集js动态渲染页面方法
Sep 11 PHP
PHP数据库操作二:memcache用法分析
Aug 16 #PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 #PHP
PHP回调函数与匿名函数实例详解
Aug 16 #PHP
搭建自己的PHP MVC框架详解
Aug 16 #PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 #PHP
laravel 中如何使用ajax和vue总结
Aug 16 #PHP
yii gridview实现时间段筛选功能
Aug 15 #PHP
You might like
php 引用(&)详解
2009/11/20 PHP
CI框架中cookie的操作方法分析
2014/12/12 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
Yii框架核心组件类实例详解
2019/08/06 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
一个javascript图片阅览组件
2010/11/09 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
JavaScript中清空数组的三种方式
2017/03/22 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
详解Chai.js断言库API中文文档
2018/01/31 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
Python httplib模块使用实例
2015/04/11 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
Python实现把json格式转换成文本或sql文件
2015/07/10 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
2014年派出所工作总结
2014/11/21 职场文书
优秀团员事迹材料
2014/12/25 职场文书
售后服务质量承诺书
2015/04/29 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
党课主持词大全
2015/06/30 职场文书
中秋节祝酒词
2015/08/12 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL