(1)redis
redis? 为什么要缓存?队列缓存,减少服务器的压力,提高速度->8w-10w
redis cache
用户/PC/APP->(前后端分离)->请求服务器(PHP+MYSQL)返回数据
用户-》服务(service)先->cache,redis;再到mysql
缓存内容:二八定律 热点 ,
数据不一致:分情况读还是写=》缓存不命中:
缓存命中率=缓存命中数/总缓存访问数
cache redis->读:没命中,缓存穿透,雪崩
查询数据:数据库
写:数据库|缓存(根据业务,先数据库再来淘汰缓存)
key =>value
数据不一致:并发读写=》命名空间,写:排他锁,文件 写 释放
什么是redis
redis :是一个开源的使用C语言编写,支持网络,可基于内存亦可持久化的日志型,key-value数据库
也是一个软件
1.支持多种数据类型的存取数据
2.支持持久化存储数据
应用场景:
1.数据缓存
2.消息队列
3.排行榜
4.计数
先有服务才有客户端
混乱:
操作字符窜类型数据
1.redis操作字符窜类型
####### 操作字符窜类型数据
1.创建redis对象
2.连接redis服务器
3.写入数据/读取数据/删除数据
1.集合中的元素都是不重复的
2.apache服务器当然不是只能浏览器才能访问
其他的(浏览器,android,ios,其他语言)也可以访问apache 【home,index.php】
浏览器->访问->apache->php->redis服务<->redis-cli
---------------------------------
## 连接redis
## 数据类型操作(字符窜操作,链表操作,无序集合操作,有序集合操作,哈希操作)
################# 1.操作字符窜类型数据
1.写入
$res = $redis->set('key-1'.'value-1');
$res = $redis->setex('key-2',10,'value-2');//第二个参数为声明周期(单位为秒)
$res = $redis->mset(['key-4'=>'value-4','key-5'=>'value-5','key-6'=>'value-6'])批量写入
$res = $redis->setnx('key-3'=>'value-3');//如果键名key-3存在则不写入,否则写入
2.删除
$res = $redis->delete('key-3');
$res = $redis->delete(['key-1','key-2]);
3.修改
$res = $redis->set('key-1','value-1');
$res = $redis->incr('total');//自增
$res = $redis->incrBy('total-3',3);//指定步进自增
$res = $redis->decr('total');//递减
$res = $redis->decrBy('total',10);//指定步进递减
4.获取
$res = $redis->get('key-1');
$res = $redis->mget(['key-4','key-5','key-6']);
<?php
//创建redis对象
$redis = new Redis();
//连接redis服务器
$redis->connect('127.0.0.1',6379);
//输入密码
$redis->auth('');
//写入数据
$res=$redis->set('name','zhangsan');
var_dump($res);//bool(true)
启动redis服务
1.1写入
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(1);
//写入字符窜类型的值
$res = $redis->set('week','礼拜五');
var_dump($res);//bool(true)
<?php
/**
* 1.写入
$res = $redis->set('key-1','value-1');
$res = $redis->setex('key-2',10,'value-2');//第二个参数为声明周期(单位为秒),为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。
extent n. 程度;范围,长度
$res = $redis->mset(['key-4'=>'value-4','key-5'=>'value-5','key-6'=>'value-6'])批量写入,用于同时设置一个或多个 key-value 对。
* multiple adj. 多个的,多种的;多人共有的;影响身体许多部位的
$res = $redis->setnx('key-3'=>'value-3');//如果键名key-3存在则不写入,否则写入
* SET if Not eXists
*/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(1);
//1.写入字符窜类型的值 $res = $res->set(键,值);
//$res1 = $redis->set('week','礼拜五');
//2.时效性的设置 $redis->setex(键,时间设置(秒),值);
$res2 = $redis->setex('test',10,'iloveu');//10秒之内能看到
//3.批量设置 $redis->mset([键1=>值1,键2=>值2,键3=>值3])批量写入,用于同时设置一个或多个 key-value 对。
$res3 = $redis->mset(['a'=>'aaa','b'=>'bbb','c'=>'ccccc']);
//设置a $redis->setnx(键=>值) 如果键名存在则不写入,否则写入
$res4 = $redis->setnx('d','ddddd');//如果不存在d键值则写入返回true,否则返回false
//var_dump($res);//bool(true)
1.2删除
<?php
//删除
/**
* Redis DEL 命令用于删除已存在的键。不存在的 key 会被忽略。
2.删除
$res = $redis->del('键值名');
$res = $redis->del(['键值名1','键值名2]);
*/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(1);
$res = $redis->del('a');
$res = $redis->del(['b','c']);
var_dump($res);
1.3修改
<?php
/**
3.修改
$res = $redis->incr('键名');//自增
$res = $redis->incrBy('键名',自增数量);//指定步进自增
*
$res = $redis->decr('键名');//递减
$res = $redis->decrBy('键名',自减数量);//指定步进递减
*/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(1);
//修改明细
//自增
//$res = $redis->incr('total');//运行一次对应键值的值+1 int(1)
//$res = $redis->incrBy('total',5);运行一次对应键值的值+5 int(6)
//自减
//$res = $redis->decr('total'); //int(5)
$res = $redis->decrBy('total',10);//int(-5)
var_dump($res);
1.4获取
<?php
/**
* 4.获取
$res = $redis->get('键值名');
$res = $redis->mget(['键值名1','键值名2','键值名3']);
*/
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(1);
//1.获取
//$res = $redis->get('d');//string(5) "ddddd"
//批量获取
$res=$redis->mget(['total','d','week']);//array(3) { [0]=> string(2) "-3" [1]=> string(5) "ddddd" [2]=> string(9) "绀兼嫓浜�" }
var_dump($res);
2.操作列表数据
2.1列表添加
https://github.com/phpredis/phpredis/#readme
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/***
* Redis Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
*/
//写入
//单个写入
// $res=$redis->lPush('list1','zhangsan');
// $res=$redis->lPush('list1','lisi');
// $res=$redis->lPush('list1','wangwu');
//var_dump($res);//int(3)
/**
* list1键值:
* row value
* 1 wangwu
* 2 lisi
* 3 zhangsan
*/
//批量写入
$res= $redis->lPush('list1','zhaoliu','liqi');
var_dump($res);//int(5)
/**
* list1键值:
* row value
* 1 liqi
* 2 zhaoliu
* 3 wnagwu
* 4 lisi
* 5 zhangsan
*/
<?php
/****
redis Linsert 命令用于在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作。
当列表不存在时,被视为空列表,不执行任何操作。
如果 key 不是列表类型,返回一个错误。
语法:
redis Linsert 命令基本语法如下:
LINSERT key BEFORE|AFTER pivot value
---------------------------------------------------------------------------------
* Redis Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。
如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。
返回值:执行 RPUSH 操作后,列表的长度。
*
*/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
//尾部插入
//$res = $redis->rPush('list-1','a');
//$res = $redis->rPush('list-1','b');
//$res = $redis->rPush('list-1','c','d','e');
/***
* list-1
* row value
* 1 a
* 2 b
* 3 c
* 4 d
* 5 e
*/
//在指定的方法中插入
$res = $redis->lInsert('list-1',Redis::BEFORE,'a','new_comer');//在a前面插入new_comer
var_dump($res);//int(6)
/***
* list-1
* row value
* 1 new_comer
* 2 a
* 3 b
* 4 c
* 5 d
* 6 e
*/
2.2列表删除
<?php
/**
$res =$redis->lpop('键名');//头部弹出一个值
$res =$redis->rpop('键名');//尾部弹出一个值
$res = $redis->lrem('键名1','值',1);//移出链表的指定值
*
Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
返回值:
被移除元素的数量。 列表不存在时返回 0 。
*/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
//$res = $redis->lPop("list1");//string(4) "liqi"
/**
删掉头部的第一个row(1) value(liqi)
* 删除lpop前
* * list1键值:
* row value
* 1 liqi
* 2 zhaoliu
* 3 wnagwu
* 4 lisi
* 5 zhangsan
* 删除后list1键值:
* row value
* 1 zhaoliu
* 2 wnagwu
* 3 lisi
* 4 zhangsan
**/
//$res = $redis->rPop('list1');//string(8) "zhangsan"
//var_dump($res);
/**
删掉尾部的最后一个元素
* 删除rpop前
* * list1键值:
* row value
* 1 zhaoliu
* 2 wangwu
* 3 lisi
* 4 zhangsan
* 删除后list1键值:
* row value
* 1 zhaoliu
* 2 wangwu
* 3 lisi
**/
$res =$redis->lRem('list1','lisi',1);//移出链表的指定值,返回被移出元素的数量
var_dump($res);//int(1)
//没有找到的时候:int(0) 列表不存在时返回 0
2.3列表修改
<?php
/**
2.3修改
$res = $redis->lset('键名',n,'值');//修改第n个元素的值
*Redis Lset 通过索引来设置元素的值。
当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误
*
$res = $redis->rpoplpush('键值名1','键值名2');//把值从一个链表的右侧弹出,插入到另一个集合的左侧
*
* Redis Rpoplpush 命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。
* 返回值:被弹出的元素
**/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
#$res = $redis->lSet('list1',0,'xiugaihou');//bool(true)
#$res = $redis->lSet('list1',3,'xiugaihou');//bool(false) 索引参数超过范围返回false
/**
* 2号库下面的键list1的索引0号的值变为xiugaihou
*list1
* row value
* 1 xiugaihou
*/
$res = $redis->rpoplpush('list1','list-1');//把list尾部的最后一个元素移动到list-1列表的头部返回弹出的元素string(9) "xiugaihou"
var_dump($res);
//当一个键没有值得时候就直接消失了
2.4列表获取
<?php
/***
*2.4 获取
$res = $redis->lindex('键名',n);//获取第n个元素的值
*Redis Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
*返回值: 列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内,返回 false
$res = $redis->lrange('键名',0,-1);//获取链表中一段的值
* Redis Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
* 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,
* 以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
*返回值: 一个列表,包含指定区间内的元素。
$res = $redis->llen('键名');//获取链表的长度
*/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/***
* list-1
* row value
* 1 xiugaihou
* 2 new_comer
* 3 a
* 4 b
* 5 c
* 6 d
* 7 e
*/
//$res = $redis->lIndex('list-1',2);//获取失败的时候返回false,成功的时候返回获取到的值string(1) "a"
$res =$redis->lRange('list-1',0,-1);//获取键list-1所有值
//array(7) {
// [0]=> string(9) "xiugaihou"
// [1]=> string(9) "new_comer"
// [2]=> string(1) "a"
// [3]=> string(1) "b"
// [4]=> string(1) "c"
// [5]=> string(1) "d"
// [6]=> string(1) "e" }
$res =$redis->lRange('list-1',2,4);//获取到索引从2-4的值
var_dump($res);//array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
echo '<hr/>';
$len = $redis->lLen('list-1');//返回链表的长度
var_dump($len);//int(7)
3.无序集合操作
########################## 3.操作无序集合
Redis 集合(Set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
集合对象的编码可以是 intset 或者 hashtable。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
### 1.添加
$res = $redis->sadd('键名',值);
$res = $redis->sadd('键名',值1,值2,值3,值4);
### 2.删除
$res = $redis->srem('键名','1');
Redis Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。
当 key 不是集合类型,返回一个错误。
### 3.修改
$res = $redis->sMove('键值1','键值2','值');//将一个值从一个集合移动到另一个集合
Redis Smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。
否则,
member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将
source 集合中的 member 元素删除。
当 source 或 destination 不是集合类型时,返回一个错误。
## 4.拿到
$res = $redis->smembers('键值');//获取集合中所有的值
$res = $redis->scard('键值');//获得集合中的元素的个数
$res = $redis->srandmember('键值');//随机获取集合中的一个元素
$res = $redis->sinter('键值1','键值2');//获取交集
$res = $redis->sunion('键值1','键值2');//获取并集
$res = $redis->sdiff('键值1','键值2');//获取差集
$res = $redis->sismember('键值1','值');//检测集合中是否存在该值
3.1添加
<?php
/**
### 1.添加
$res = $redis->sadd('键名',值);
$res = $redis->sadd('键名',值1,值2,值3,值4);
*Redis Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。
*假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。
*当集合 key 不是集合类型时,返回一个错误。
*
**/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
$res = $redis->sadd('sports','篮球');//int(1)
$res = $redis->sAdd('sports','乒乓球','羽毛球','足球','台球','桌上足球');//int(5)
var_dump($res);//int(5)
/**
* sports:
*row value
1 羽毛球
2 足球
3 台球
* 4 桌上足球
* 5 乒乓球
* 6 篮球
**/
3.2删除
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/**
* $res = $redis->srem('键名','1');
Redis Srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。
当 key 不是集合类型,返回一个错误。
*/
/**
*sports:
row value
1 羽毛球
2 足球
3 台球
4 桌上足球
5 乒乓球
6 篮球
**/
$res = $redis->sRem('sports','1');//int(0)
$res = $redis->sRem('sports','足球');//int(1)
var_dump($res);
//*sports:
//row value
//1 桌上足球
//2 乒乓球
//3 篮球
//4 台球
//5 羽毛球
//**/
3.3修改
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/**
* Redis Smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则,
* member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
当 source 或 destination 不是集合类型时,返回一个错误。
*/
$res = $redis->sAdd('skills','draw','cook','guitar','piano','puzzle');//int(5)
$res = $redis->sMove('sports','skills','篮球');//将一个值从一个集合移动到另一个集合
var_dump($res);//bool(true)
/***
* skils:
* row value
* 1 cook
* 2 draw
* 3 puzzle
* 4 piano
* 5 篮球
* 6 guitar
*/
//*sports:
//row value
//1 桌上足球
//2 乒乓球
//4 台球
//5 羽毛球
//**/
3.4获取
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/**
* $res = $redis->smembers('键值');//获取集合中所有的值
$res = $redis->scard('键值');//获得集合中的元素的个数
$res = $redis->srandmember('键值');//随机获取集合中的一个元素
$res = $redis->sinter('键值1','键值2');//获取交集
$res = $redis->sunion('键值1','键值2');//获取并集
$res = $redis->sdiff('键值1','键值2');//获取差集
$res = $redis->sismember('键值1','值');//检测集合中是否存在该值
*/
//拿到
$res=$redis->sMembers('sports');//获取集合中所有的值
var_dump($res);//array(4) { [0]=> string(9) "乒乓球" [1]=> string(6) "台球" [2]=> string(12) "桌上足球" [3]=> string(9) "羽毛球" }
echo '<hr/>';
$res2 = $redis->sCard('sports');//获得集合中的元素的个数
var_dump($res2);
echo '<hr/>';
$res3 = $redis->sRandMember('sports');//随机获取集合中的一个元素
var_dump($res3);
echo '<hr/>';
$res4= $redis->sIsMember('sports','台球');//检测集合中是否存在该值
var_dump($res4);
//array(4) { [0]=> string(9) "乒乓球" [1]=> string(6) "台球" [2]=> string(12) "桌上足球" [3]=> string(9) "羽毛球" }
//int(4)
//string(9) "羽毛球"
//bool(true)
4.有序集合
######### Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合
中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
-----------------------------------------------------------------------------------------
有序集合
1.添加
$res = $redis->zadd('键',权重,值);
2.删除
$res = $redis->zrem('键','值');
3.更新
$res = $redis->zincrby('键','分数score','值');//把键对应下的值的score+上分数score
4.获取
$res = $redid->zrange('键',0,-1);获取所有的元素
$res = $redis->zrevrange('zret',0,-1);//倒叙获取所有元素
$res = $redis->zrangebyscore('zset',0,10,['withscores'=>true,'limit'=>[0,2]]);
//按照权重范围进行获取
$res = $redis->zcount('zset',3,10);//返回权重区间中元素的个数
$res = $redis->zCard('zset','v7');//获取单个值的权重
$res = $redis->zscore('zset','v7');//获取单个值的权重
$res = $redis->zrank('zset','v7');//获取某个值的排名
$res = $redis->zrevrank('zset','v7');//获取某个值的倒叙排名
4.1有序集合的添加
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
//1 ZADD key score1 member1 [score2 member2]
//向有序集合添加一个或多个成员,或者更新已存在成员的分数
//$res = $redis->zAdd('grade',50,'zhangsan');
//$res = $redis->zAdd('grade',99,'lisi');
//$res = $redis->zAdd('grade',80,'wangwu');
//$res = $redis->zAdd('grade',75,'zhaoliu');
//$res = $redis->zAdd('grade',86,'zhaoqi');
$res = $redis->zAdd('grade',65,'a');
$res = $redis->zAdd('grade',78,'b');
$res = $redis->zAdd('grade',69,'c');
$res = $redis->zAdd('grade',90,'d');
/***
* db2下的键grade:
* row value score
* 1 zhangsan 50
* 2 a 65
* 3 c 69
* 4 zhaoliu 75
* 5 b 78
* 6 wangwu 80
* 7 zhaoqi 86
* 8 d 90
* 9 lisi 99
*/
var_dump($res);//int(1)
4.2有序集合的删除
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
//Redis Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。
//当 key 存在但不是有序集类型时,返回一个错误。
//注意: 在 Redis 2.4 版本以前, ZREM 每次只能删除一个元素。
$res = $redis->zRem('grade','b');//删除b
/***
* db2下的键grade:
* row value score
* 1 zhangsan 50
* 2 a 65
* 3 c 69
* 4 zhaoliu 75
* 5 wangwu 80
* 6 zhaoqi 86
* 7 d 90
* 8 lisi 99
*/
var_dump($res);//int(1)
4.3有序集合的修改
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
//更新
$res = $redis->zIncrBy('grade',2,'zhangsan');//double(52)
var_dump($res);
/***
* db2下的键grade:
* row value score
* 1 zhangsan 52
* 2 a 65
* 3 c 69
* 4 zhaoliu 75
* 5 wangwu 80
* 6 zhaoqi 86
* 7 d 90
* 8 lisi 99
*/
4.4有序集合的获得
<?php
/**
*
$res = $redid->zrange('键',0,-1);获取所有的元素
$res = $redis->zrevrange('zret',0,-1);//倒叙获取所有元素
$res = $redis->zrangebyscore('zset',0,10,['withscores'=>true,'limit'=>[0,2]]);//按照权重范围进行获取
* Redis Zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。
具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
举个例子:
ZRANGEBYSCORE zset (1 5
返回所有符合条件 1 < score <= 5 的成员,而
ZRANGEBYSCORE zset (5 (10
则返回所有符合条件 5 < score < 10 的成员。
语法
redis Zrangebyscore 命令基本语法如下:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
redis 127.0.0.1:6379> ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
*
$res = $redis->zcount('zset',3,10);//返回权重区间中元素的个数
$res = $redis->zCard('zset','v7');//获取单个值的权重
$res = $redis->zscore('zset','v7');//获取单个值的权重
$res = $redis->zrank('zset','v7');//获取某个值的排名
$res = $redis->zrevrank('zset','v7');//获取某个值的倒叙排名
*/
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/***
* db2下的键grade:
* row value score
* 1 zhangsan 52
* 2 a 65
* 3 c 69
* 4 zhaoliu 75
* 5 wangwu 80
* 6 zhaoqi 86
* 7 d 90
* 8 lisi 99
*/
//得到有序集合的值
$res = $redis->zRange('grade',0,2);
var_dump($res);//array(3) { [0] => string(8) "zhangsan" [1] => string(1) "a" [2] => string(1) "c" }
echo '<hr/>';
$res = $redis->zRevRange('grade',0,2);//倒序
var_dump($res);// array(3) { [0] => string(4) "lisi" [1] => string(1) "d" [2] => string(6) "zhaoqi" }
echo '<hr/>';
//根据权重的范围获取数据
$res = $redis->zRangeByScore('grade',80,90);
var_dump($res);//array(3) { [0] => string(6) "wangwu" [1] => string(6) "zhaoqi" [2] => string(1) "d" }
echo '<hr/>';
$res = $redis->zRangeByScore('grade',80,90,['withscores'=>true,'limit'=>[2,2]]);按照权重范围进行获取
var_dump($res);//array(1) { 'd' => double(90) }
echo '<hr/>';
//倒序获取
$res = $redis->zRevRangeByScore('grade',100,60,['widthscores'=>true]);
var_dump($res);//array(7) { [0] => string(4) "lisi" [1] => string(1) "d" [2] => string(6) "zhaoqi" [3] => string(6) "wangwu" [4] => string(7) "zhaoliu" [5] => string(1) "c" [6] => string(1) "a" }
echo '<hr/>';
//获取权重区间的元素个数
$res = $redis->zCount('grade',80,100);//返回权重区间中元素的个数
var_dump($res);// int(4)
echo '<hr/>';
//获取元素的个数
$res = $redis->zCard('grade');//获取单个值的权重
var_dump($res);// int(8)
echo '<hr/>';
//获取单个元素的权值
$res = $redis->zScore('grade','zhangsan');
var_dump($res);//double(52)
echo '<hr/>';
$res = $redis->zRank('grade','zhangsan');
var_dump($res); //int(0)
echo '<hr/>';
//获取数据的排名
$res = $redis->zRevRank('grade','zhangsan');
var_dump($res);// int(7)
echo '<hr/>';
5.操作哈希数据
5.1哈希写入
1.$res = $redis->hset('key','hashkey','value');//单个值写入
2.$res = $redis->hmset('key',[hashkey1=>value1,hashkey2=>value2]);//批量写入
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
//单条写入
$res = $redis->hSet('phone','brand','apple');
var_dump($res);// int(1)
//批量写入
$res = $redis->hMSet('phone',['size'=>'4.9inch','price'=>2000,'color'=>'white']);
var_dump($res);//bool(true)
5.2哈希删除
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/**
* ###2.删除
* $res = $redis->hdel('key','hashkey');
*/
//删除
$res = $redis->hDel('phone','color');
var_dump($res);//int(1)
/***
* hash:phone
* row key value
* 1 brand apple
* 2 size 4.9inch
* 3 price 2000
*/
5.3哈希修改
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/**
* ### 3.修改
$res = $redis->hset('key','hashkey','value');
$res = $redis->hincrby('key','total',1);//自增某个值
*/
//更新
$res = $redis->hSet('phone','price',1999);
//把price的值改为1999
var_dump($res);//int(0)
$res = $redis->hIncrBy('phone','age',1);
var_dump($res);//int(1)
/***
* hash:phone
* row key value
* 1 brand apple
* 2 size 4.9inch
* 3 price 1999
* 4 age 1
*/
5.4哈希获取
<?php
//创建redis对象
$redis = new Redis;
//连接redis服务器
$redis->connect('localhost',6379);
//输入密码
$redis->auth('');
//选择数据库
$redis->select(2);
/**
* ### 4.获取
$res = $redis->hget('key','hashkey');//获取键名的值
$res = $redis->hmget('key',[hashkey1,hashkey2]);//获取多个键名的值
$res = $redis->hgetall('key');//获取哈希下所有的值
$res = $redis->hlen('key');//获取哈希下元素的个数
$res = $redis->hkeys('key');//获取所有的键名
$res = $redis->hvals('key');//获取所有的键值
$res = $redis->hexists('key','hashkey');//检测哈希下是否存在该键名
*/
/***
* hash:phone
* row key value
* 1 brand apple
* 2 size 4.9inch
* 3 price 1999
* 4 age 1
*/
//获取
$res = $redis->hGet('phone','brand');
var_dump($res);//string(5) "apple"
echo '<hr/>';
$res = $redis->hMGet('phone',['brand','price']);
var_dump($res);//array(2) { 'brand' => string(5) "apple" 'price' => string(4) "1999" }
echo '<hr/>';
//获取字段的个数
$res = $redis->hLen('phone');
var_dump($res);//int(4)
echo '<hr/>';
//获取所有的字段名
$res = $redis->hKeys('phone');
var_dump($res);//array(4) { [0] => string(5) "brand" [1] => string(4) "size" [2] => string(5) "price" [3] => string(3) "age" }
echo '<hr/>';
//获取所有的键值
$res = $redis->hVals('phone');
var_dump($res);//array(4) { [0] => string(5) "apple" [1] => string(7) "4.9inch" [2] => string(4) "1999" [3] => string(1) "1" }
echo '<hr/>';
//检测字段是否存在
$res = $redis->hExists('phone','brand');
var_dump($res);//bool(true)
echo '<hr/>';
//获取所有的字段信息
$res = $redis->hGetAll('phone');
var_dump($res);// array(4) { 'brand' => string(5) "apple" 'size' => string(7) "4.9inch" 'price' => string(4) "1999" 'age' => string(1) "2" }
echo '<hr/>';