在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
php检测: extension_loaded('redis')
安装: ps -ef |grep redis 查看进程 netstat -aup|grep 6379 查看端口 windows下php7.1安装redis扩展以及redis测试使用全过程linux php配置redis扩展注意: non-thread-safe 非 线程安全 与IIS 搭配环境 安装扩展后 记得下载服务端并开启(服务端就是自己系统的的我的是64位) PHP操作redis http://www.cnblogs.com/catcrazy/p/6415802.htmlPHP Redis 全部操作方法 https://www.cnblogs.com/glory-jzx/p/5714173.htmlredis 数据类型详解 以及 redis适用场景场合1,string类型: string类型是二进制类型,可以将图片和视屏,等等保存起来,也可以将一些静态文件保存起来,如js、css等等
2,list类型: list类型是双向链表结构,如在微博中的我关注的列表或者论坛中所有回帖用户的id等等数据,同时list也能实现简单的消息队列,具体可以先用rpush把消息放入到队列尾部,再用lpop把消息从队列头部取出
3,set类型: set类型是一种无序类型,在redis内部是通过 HashTable实现,查找和删除元素十分快速,可以用于记录一些不能重复的数据,例如每次注册的时候将用户名存起来,每次新的用户注册的时候,都可以先set查询该用户名是否被注册,效率极高,还有一种比较广泛的应用就是投票系统,比如一天用户只能投票一次,我们就可以使用今天的日期作为set的key,存取用户的投票行为,查询的时候也用日期查询,是不是感觉效率很高呢
4,sorted set 类型: sorted set 类似于set ,只不过sorted set 是一种有序集合,在web中比较有用,如我们要对博客按照顶贴进行排序,我们就可以将排序的字段设置成sorted set 的score,将具体数值设置成具体的值,每次更新数据只需要用zadd命令修改score的值就可以了
5,hash类型: hash类型是每个key对用一个HashTable,适合于存储对象,例如用户的信息对象,用户id作为key,具体信息作为value 典型的应用场景:缓存、计数器(转发数评论数播放数)、消息队列系统、排行榜、实时社交网络、实时系统、
持久化(文件存储数据)
配置 slave 服务器很简单,只需要在配置文件中加入如下配置
扩容--监控部署--主从切换---读写分离 急迫需要动态扩容-----自动部署,自动加监控----如何对业务透明----是否读写分离,可以按需配置
redis_cli 自带的redis管理工具 耗时命令日志: 当一条命令执行时间超过限制时,redis会将该命令的执行时间等参数加入(slow log)日志 存储在内存中 可以通过配置文件的slowlog-log-slower-than 微秒(1000000=1s 默认10000) 设置超过设置的数则保存在slow log 通过配置文件的slowlog-max-len 条数 设置记录的条数 在redis_cli客户端 输入 slowlog get 获取详细的耗时命令 127.0.0.1:6379> keys * 1) "str" 2) "no-order" 3) "user:100" 4) "order" 127.0.0.1:6379> slowlog get 1) 1) (integer) 0 该日志的唯一ID 2) (integer) 1535255077 该命令执行的unix时间 3) (integer) 48000 改命令的耗时时间(微秒) 4) 1) "keys" 该命令 2) "*" 参数 127.0.0.1:6379> 命令监控: monitor 监控reids执行的所有命令 在redis_cli 输入回车 显示ok后 后面执行的所有命令都会被打印出来 注意非常消耗性能只能用于开发调试纠错 ps:instagram 团队开发了一个基于monitor 命令的的redis查询分析程序redis-faina 直接下载redis-faina.py 其他管理工具:phpRedisAdmin、Rdbtools
虚拟内存 (适用于 value 比 key 大的情况) :redis很吃内存的 暂时把不经常访问的数据从内存放到磁盘中 从而腾出内存空间
multi和pipeline Redis::MULTI方式会将命令逐条发给redis服务端。只有在需要使用事物时才选择Redis::MULTI方式,它可以保证发给redis的一系列命令以原子方式执行。但效率相应也是最低的。 Redis的原子性有两点: 1 、单个操作是原子性的 2、多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来 (事物具有原子性) 原子操作的意思就是要么成功执行要么失败完全不执行。用现实中的转账比喻最形象,你转账要么成功,要么失败钱不动,不存在你钱转出去了,但收款方没收到这种成功一半失败一半的情况 redis 实现事务的原理:
$redis->setnx('str','字符串'); print_r($redis->get('str')); //字符串 /*hash*/ $redis->hsetnx('user:100','myhash','我的哈希'); print_r($redis->hget('user:100','myhash')); //我的哈希 /*列表list*/ $redis->lpush('list', 'html'); $redis->lpush('list', 'css'); $redis->lpush('list', 'php'); $redis->ltrim('list', 0,3); $list = $redis->lrange('list', 0, -1); print_r($list); //Array ( [0] => php [1] => css [2] => html [3] => php ) /*sets 无序集合 自动去重*/ $redis->sadd('no-order','无序集合1'); $redis->sadd('no-order','无序集合2'); print_r($redis->smembers('no-order')); //Array ( [0] => 无序集合2 [1] => 无序集合1 ) /*有序集合*/ $redis->zadd('order',0,'有序集合1'); $redis->zadd('order',2,'有序集合2'); print_r($redis->zrange('order',0,-1,'withscores')); //Array ( [有序集合1] => 0 [有序集合2] => 2 )
存对象可以序列化后再存 存数组可以转为json在存 简介 =========================== redis是一个key-value存储系统。 和Memcached类似,它支持存储的value类型相对更多, 包括string(字符串)、hash哈希、list(链表【栈、队列】)、set(集合)和zset(有序集合)。 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。 在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。 它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。 性能 =========================== ACID ========================================================== ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 Redis常用命令 ============================= 1. 键值相关命令 >keys * //返回键(key) $redis->key('*'); >keys list* //返回名以list开头的所有键(key) >exists list1 //判断键名为list1的是否存在 存在返回1 不存在返回0 $redis->exists('yourkey')>del list1 //删除一个键(名为list1) expire key time 设置键的过期时间 >expire list1 10 //设置键名为list1的过期时间为10秒之后 flushdb:删除所有的数据 Redis的数据类型 ================================= 1. 共计5种数据类型: incrby命令: 设置某个键加上指定值 > incrby 键 m //其中m可以是正整数或负整数 incrby 3 在原来的基础上加3 decr命令: 指定键的值做减减操作,返回减后的结果。 > decr 键 例如: >decr kid decrby命令: 设置某个键减上指定值 > decrby 键 m //其中m可以是正整数或负整数 append命令:给指定key的字符串追加value,返回新字符串值的长度 >append 键 追加字串 strlen 求长度 # name,redis的name
# cursor,游标(基于游标分批取获取数据)
# match,匹配指定key,默认None 表示所有的key
# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
# 如: # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)
# 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)
# ...
# 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕
hscan_iter(name, match=None, count=None) 利用yield封装hscan创建生成器,实现分批去redis中获取数据
# 参数: # match,匹配指定key,默认None 表示所有的key
# count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数
# 如: # for item in r.hscan_iter('xx'):
# print item
blpop key1 [key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 rpushx key_name value1 [..valuen] 为依存在的队列(列表)尾部插入一个或者多个值 lpushx key_name value1 [..valuen] 为依存在的队列(列表)头部插入一个或多个值 5.无序集合set类型和操作 ------------------------------- >sadd myset "hello" //向myset中添加一个元素 成功返回1,失败(重复)返回0 >smembers myset //获取myset中的所有元素(结果是无序的) >srem myset "one" //从myset中删除一个one 成功返回1,失败(不存在)返回0 >spop myset //随机返回并删除myset中的一个元素 >srandmember myset //随机获取myset中的一个元素,但是不删除 > smove myset1 myset2 zhangsan:将myset1中zhangsan移动到myset2中 > scard myset1 返回myset1的个数 > sismember myset zhangsan:判断张三是否在myset中 >sdiff myset1 myset2 //返回两个集合的差集以myset1为标准,获取myset2中不存在的。 sscan key index [MATCH pattern] [COUNT count] 迭代(遍历)集合中key的元值
>sscan myset1 0 match h*
6.有序集合zset zadd key_name score1 value1.. scoren valuen 向有序集合添加一个或者多个成员,或者更新已存在成员的分数 score位排序! > zadd myzset 1 "one" 向myzset中添加one,排序为1排序 zrem key member [member ...] 移除有序集合中的一个或多个成员 zincrby key increment member 有序集合中对指定成员的分数加上增量 increment zrank key member 返回有序集合中指定成员的索引 zrevrank key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 zrange key start stop [withscores] 通过索引区间返回有序集合成指定区间内的成员
zrevrange key start stop [withscores] 返回有序集中指定区间内的成员,通过索引,分数从高到底 zrangebyscore key min max [withscores] [limit offset count] 通过分数返回有序集合指定区间内的成员 zcount key min max 计算在有序集合中指定区间分数的成员数 zcard key_name 获取有序集合的成员数 zscore key member 返回有序集中,成员的分数值 zremrangebyrank key start stop 移除有序集合中给定的排名区间的所有成员
zremrangebyscore key min max 移除有序集合中给定的分数区间的所有成员 zinterstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。 # 有序集 mid_test > ZADD mid_test 70 "Li Lei" (integer) 1 > ZADD mid_test 70 "Han Meimei" (integer) 1 > ZADD mid_test 99.5 "Tom" (integer) 1 # 另一个有序集 fin_test > ZADD fin_test 88 "Li Lei" (integer) 1 > ZADD fin_test 75 "Han Meimei" (integer) 1 > ZADD fin_test 99.5 "Tom" (integer) 1 # 交集 > ZINTERSTORE sum_point 2 mid_test fin_test (integer) 3 # 显示有序集内所有成员及其分数值 > ZRANGE sum_point 0 -1 WITHSCORES 1) "Han Meimei" 2) "145" 3) "Li Lei" 4) "158" 5) "Tom" 6) "199" zlexcount key min max 在有序集合中计算指定字典区间内成员数量 > ZADD myzset 0 a 0 b 0 c 0 d 0 e > ZADD myzset 0 f 0 g > ZLEXCOUNT myzset - + (integer) 7 > ZLEXCOUNT myzset [b [f (integer) 5 zrangebylex key min max [limit offset count] 通过字典区间返回有序集合的成员 > zadd myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g > zrangebylex myzset - [c 1) "a" 2) "b" 3) "c" > zrangebylex myzset [aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f" zremrangebylex key min max 移除有序集合中给定的字典区间(min和max之间)的所有成员 min个max以[或者(开头 可以用-表示最小值+表示最大值 min和max顺序不能相反 > zadd zset 0 a 0 aa 0 abc 0 apple 0 b 0 c 0 d 0 d1 0 dd 0 dobble 0 z 0 z1 > zremrangebylex zset [d1 (dd 删除d1这个元素 > zremrangebylex zset [a [apple > zrange zset 0 -1 withscores > zremrangebylex zset - + zrevrangebyscore key max min [withscores] [limit offset count] 返回有序集中指定分数区间内的成员,分数从高到低排序 > ZADD salary 10086 jack > ZADD salary 5000 tom > ZADD salary 7500 peter > ZADD salary 3500 joe > ZREVRANGEBYSCORE salary +inf -inf # 逆序排列所有成员 1) "jack" 2) "peter" 3) "tom" 4) "joe" > ZREVRANGEBYSCORE salary 10000 2000 # 逆序排列薪水介于 10000 和 2000 之间的成员 1) "peter" 2) "tom" 3) "joe" zunionstore destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] 计算给定的一个或多个有序集的并集,并存储在新的 key 中 其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination,默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和 。 > ZADD zset1 1 "one" > ZADD zset1 2 "two" > ZADD zset2 1 "one" > ZADD zset2 2 "two" > ZADD zset2 3 "three" > zunionstore out 2 zset1 zset2 WEIGHTS 2 3 > zrange out 0 -1 WITHSCORES 1) "one" 2) "5" 3) "three" 4) "9" 5) "two" 6) "10" zscan key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)
Redis常用命令 ============================= 1. 键值相关命令 >keys * //返回键(key) $redis->key('*'); >keys list* //返回名以list开头的所有键(key) >exists list1 //判断键名为list1的是否存在 $redis->exists('yourkey') 存在返回1, 不存在返回0 >del list1 //删除一个键(名为list1) expire key time 设置键的过期时间 >move age 1 //将键名age的转移到1数据库中。 >select 1 //表示进入到1数据库中,默认在0数据库 >persist age //移除age的过期时间(设置为过期) >type yourKey 检测key的数据类型 $redis->type('yourKey'); 返回 整型 对应下面几个常量
<?php //发布 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $message='新年快乐'; $ret=$redis->publish('中央广播电台',$message); <?php //订阅 ini_set('default_socket_timeout', -1); //不超时 $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $result=$redis->subscribe(array('中央广播电台'), 'callback'); function callback($instance,$channelName,$message){ echo $message; }
PHP_Redis ========================================= 一、为php环境安装Redis支持(加模块) 1. 将owlient-phpredis-2.1.1-1-g90ecd17.tar.gz文件传到服务器上 2. 解压文件后进入此目录 3. 由于目录中没有configure配置环境 执行 /usr/local/php/bin/phpize |
2022-08-30
2022-08-17
2022-11-06
2022-08-17
2022-07-18
请发表评论