面包屑思维模型实战模型错题集结构手册流程手册自我检测专题模块
-
微信小程序前端微信小程序前端易错点收集查看
-
css/less/sass样式控制在开发过程中的一些样式控制bug规避查看
-
tp5开发小程序tp5开发小程序时错误积累查看
-
PHP错题集PHP在实际开发过程中遇到的问题查看
-
MySql数据库使用MySql在实际开发中遇到的错误总结查看
-
TP5错题集积累tp5框架在实际开发过程中遇到的问题查看
-
uni-app爬坑主要用于uni-app项目中遇到的一些问题查看
-
Vue.js易错收集vue.js项目常见错误收集整理查看
-
uni-app开发微信小程序uni-app开发微信小程序的一些爬坑积累查看
-
LinuxLinux在部署、开发、运维时遇见的错误积累查看
-
安全设计常见安全设计查看
-
Redis项目中使用redis的相关错误积累查看
-
前端特效前端特效相关错题集查看
最新博文
-
redis分页查询方案设想(但count不准确,不推荐)
Redisredis分页查询,主要是通过scan系的查询实现,通过有序数据结构+捕获游标+限制单次查询数据条数+查询页码来实现
一.存数据
存数据时一定要选择list或者有序集合sort set这样的排序严明的数据结构,不然查询时会重复查询,这样便导致分页节点的游标不准
/*设置中文key */
public function redis_setCN(){
$redis=(new RedisTest)->getRedis();
$list=[
[
'qid'=>'1',
'cate_id'=>'1',
'theme_id'=>'1',
'title'=>'网课怎么选择?',
'des'=>'马上就要选课了,各位前辈,我想选网课。但不知怎么搭配和操作'
],
[
'qid'=>'2',
'cate_id'=>'1',
'theme_id'=>'1',
'title'=>'选课时间什么时候,入口在哪?',
'des'=>'各位大佬,请问一下选课时间是什么时候,入口在哪'
],
[
'qid'=>'3',
'cate_id'=>'2',
'theme_id'=>'2',
'title'=>'文史类选修课,哪些比较合适?',
'des'=>'看了有美术鉴赏、罗马神话等,还有思修'
],
[
'qid'=>'4',
'cate_id'=>'2',
'theme_id'=>'2',
'title'=>'选修课选得越多越好吗?',
'des'=>'提前完成选修学分,有必要多选选修课吗'
]
];
for($i=0;$i$str=json_encode($list[$i],320);
$redis->zAdd('s',$i,$str);
}
$res=$redis->zRange('s',0,-1);
return json($res);
}二. 渐进式分布查询所有数据,获取分页节点的游标
向前台返回游标数组,每个游标对应分页
/*关键字搜索*/
public function redis_searchByKeyworld($keyworld,$page=1){
$iterator=-1;
$count=2;
$mainKey='s';
$match='*\"title\":\"*'.$keyworld.'*';
$redis=(new RedisTest)->getRedis();
$res=[];$stepsPre=[-1];$list=[];
while($iterator!=0) {
$res=$redis->zscan($mainKey,$iterator,$match,$count);
if(count($res)&&$iterator!=0){
array_push($stepsPre,$iterator);
}
}
$steps=json_decode(json_encode($stepsPre,320),true);
if($page<=count($steps)&&$page>0){
$res=$redis->zscan($mainKey,$stepsPre[$page-1],$match,$count);
foreach ($res as $key => $value){
$item=json_decode($key,true);
array_push($list,$item);
}
}
return json(['steps'=>$steps,'res'=>$list]);
}三. 页码即是游标数组索引
传递页码参数即是按照游标查询数据
阅读更多风口下的猪2022-03-04【Redis】
-
redis 模糊查询(含中文)/分类查询方案
Redisredis实现条件查询,可以依据key的通配查询来实现
存数据
将内容作json字符串当键值,存入hash/set/list等数据结构中。要注意几点
(1)使用json_encode对数组进行json字符串转化;
(2)json_encode必须保留中文不转义,斜杠不转义
$list=[
[
'qid'=>'1',
'cate_id'=>'1',
'theme_id'=>'1',
'title'=>'网课怎么选择?',
'des'=>'马上就要选课了,各位前辈,我想选网课。但不知怎么搭配和操作'
],
[
'qid'=>'2',
'cate_id'=>'1',
'theme_id'=>'1',
'title'=>'选课时间什么时候,入口在哪?',
'des'=>'各位大佬,请问一下选课时间是什么时候,入口在哪'
],
[
'qid'=>'3',
'cate_id'=>'2',
'theme_id'=>'2',
'title'=>'文史类选修课,哪些比较合适?',
'des'=>'看了有美术鉴赏、罗马神话等,还有思修'
],
[
'qid'=>'4',
'cate_id'=>'2',
'theme_id'=>'2',
'title'=>'选修课选得越多越好吗?',
'des'=>'提前完成选修学分,有必要多选选修课吗'
]
];
for($i=0;$i<count($list);$i++){
$str=json_encode($list[$i],320);
$redis->sAdd('s',$str);
}关键字模糊查询
关键字模糊查询要首先明确是查找哪些字段,如上例子,如果关键字查询是从title和des两个字段中查询,一定要注意存数据时,将title和des的数据放在后面。这样避免了关键字模糊查询查到其他字段的数据,如上面的数据,用户输入“2”查询,就会查到所有qid为2和cate_id为2的数据
/*关键字搜索*/
public function redis_searchByKeyworld($keyworld){
$iterator=null;
$count=1000;
$mainKey='s';
$match='*\"title\":\"*'.$keyworld.'*';
$redis=(new RedisTest)->getRedis();
$res = $redis->sscan($mainKey,$iterator,$match,$count);
$list=[];
if(count($res)){
for($i=0;$i<count($res);$i++){
$item=json_decode($res[$i],true);
array_push($list,$item);
}
}
return json($list);
}分类查询
分类查询即是条件精准查询,则需查询匹配规则非常准确,如$match='*\"cate_id\":\"'.$cid.'\"*';
/*依据目录获取问答*/
public function redis_getByCate($cid){
$iterator=null;
$count=1000;
$mainKey='s';
$match='*\"cate_id\":\"'.$cid.'\"*';
$redis=(new RedisTest)->getRedis();
$res = $redis->sscan($mainKey,$iterator,$match,$count);
$list=[];
if(count($res)){
for($i=0;$i<count($res);$i++){
$item=json_decode($res[$i],true);
array_push($list,$item);
}
}
return json($list);
}
阅读更多风口下的猪2022-03-03【Redis】
-
Thinkphp项目怎么做模糊查询
RedisThinkphp内置的redis操作有限,所以直接在项目中使用原生php操作redis
<?php
use think\cache\driver\Redis;
class RedisTest extends SafeAPI{
protected static $host="127.0.0.1";
protected static $port=6379;
protected static $auth="123456";
protected static $redis;
public function __construct(){
}
public function getRedis(){
$redis= new \Redis;
$redis->connect(self::$host,self::$port);
$redis->auth(self::$auth);
return $redis;
}
}
阅读更多风口下的猪2022-03-03【Redis】
-
PHP redis SCAN、SSCAN、ZSCAN、HSCAN 的使用
RedisSCAN
SCAN cursor [MATCH pattern] [COUNT count]
作用:迭代当前数据库中的数据库键
SCAN 使用 demo
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
/* Options for the SCAN family of commands, indicating whether to abstract
empty results from the user. If set to SCAN_NORETRY (the default), phpredis
will just issue one SCAN command at a time, sometimes returning an empty
array of results. If set to SCAN_RETRY, phpredis will retry the scan command
until keys come back OR Redis returns an iterator of zero */
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$iterator = null;
$count = 1000; // 测试时redis中大概有20w个key,用时约2s,当count为500时用时约4s,count越大时扫描用时越短(当然需要根据你的业务需要来定)
$prefix = date('Ymd');
$time1 = msectime();
$total = [];
while ($arrKeys = $redis->scan($iterator, $prefix . '*', $count)) {
$arrValues = $redis->mget($arrKeys);
$ret = array_combine($arrKeys, $arrValues);
$total = array_merge($total, $ret);
}
$time2 = msectime();
$time = $time2 - $time1;
echo 'time : ' . $time . ' ms; total keys : ' . count($total) . PHP_EOL;
// time : 2009 ms; total keys : 129798 (用时2009 ms,20w中共有129798个前缀为$prefix的key)
function msectime() {
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
return $msectime;
}SSCAN
SCAN cursor [MATCH pattern] [COUNT count]
作用:用于迭代集合键中的元素
SSCAN使用demo
<?php
$iterator = null;
$count = 1000;
$mainKey = date('Ymd');
$prefix = $mainKey;
$total = [];
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$time1 = msectime();
while ($arrKeys = $redis->sscan($mainKey, $iterator, $prefix . '*', $count)) { // 匹配前缀为当前日期的key
$total += $arrKeys;
}
$time2 = msectime();
$time = $time2 - $time1;
echo 'use time : ' . $time . ' ms; total keys : ' . count($total) . PHP_EOL;
// use time : 649 ms; total keys : 90010 (这个集合中有20w个元素)
....... other code ......ZSCAN
ZSCAN cursor [MATCH pattern] [COUNT count]
作用:用于迭代有序集合中的元素
ZSCAN使用demo
<?php
$iterator = null;
$count = 1000;
$mainKey = 'test';
$prefix = '10';
$total = [];
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$time1 = msectime();
while ($arrKeys = $redis->zscan($mainKey, $iterator, $prefix . '*', $count)) { // 匹配key前缀是 10 的所有key
var_dump($arrKeys);
$total += $arrKeys;
}
$time2 = msectime();
$time = $time2 - $time1;
echo 'use time : ' . $time . ' ms; total keys : ' . count($total) . PHP_EOL;
// use time : 317 ms; total keys : 1111 (这个集合中有10w个元素)
...... other code ......HSCAN
HSCAN cursor [MATCH pattern] [COUNT count]
作用:用于迭代哈希中的元素
HSACN 使用demo
<?php
$iterator = null;
$count = 1000;
$mainKey = 'my_hash_key';
$match = "*key*";
$total = [];
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$time1 = msectime();
while ($arrKeys = $redis->hscan($mainKey, $iterator, $match, $count)) { // 匹配含有'key'的键
var_dump($arrKeys);
$total += $arrKeys;
}
$time2 = msectime();
$time = $time2 - $time1;
echo 'use time : ' . $time . ' ms; total keys : ' . count($total) . PHP_EOL;
// use time : 1484 ms; total keys : 100000
...... other code ......
阅读更多风口下的猪2022-03-03【Redis】
-
redis key 通配符 查询相应的key
Redis在redis里,允许模糊查询key,有3个通配符 *, ? ,[]
* : 通配任意多个字符
? : 通配单个字符
[] : 通配括号内的某1个字符
redis 127.0.0.1:6379> flushdb
redis 127.0.0.1:6379> keys *
(empty list or set)
redis 127.0.0.1:6379> mset one 1 two 2 three 3 four 4
OKredis 127.0.0.1:6379> keys o*
1) "one"redis 127.0.0.1:6379> key *o
(error) ERR unknown command 'key'redis 127.0.0.1:6379> keys *o
1) "two"redis 127.0.0.1:6379> keys ???
1) "one"
2) "two"redis 127.0.0.1:6379> keys on?
1) "one"redis 127.0.0.1:6379> set ons yes
OKredis 127.0.0.1:6379> keys on[eaw]
1) "one"
阅读更多风口下的猪2022-03-03【Redis】
-
php redis常见操作
Redisphp连接redis测试
$redis = new \Redis;
$redis->connect('127.0.0.1', 6379);//serverip port
$redis->auth('mypassword');//my redis password
$redis ->set( "test" , "Hello World");
echo $redis ->get( "test");
常规操作
setex 带生存时间的写入值
$redis->setex('key', 3600, 'value');
setnx 判断是否重复的,写入值,如存在了不修改返回0,不存在就添加返回1
$redis->setnx('key', 'value');
返回已经删除key
$redis->delete('key1'); 成功返回1失败返回0
$redis->delete('key1','key2'); 删除两个键成功返回1失败返回0查询生存时间
$redis->ttl('key1'); 持久化的返回-1,有生存时间的返回时间(单位秒)
同时给多个key赋值,同时设置key0和key1
$redis->mset(array('key0' => 'value0', 'key1' => 'value1'));
key中的值进行自增1,如果填写了第二个参数,者自增第二个参数所填的值
$redis->incr('key1');
$redis->incrBy('key1', 10);减法跟加法一样
$redis->decr("key1"); 减少1
$redis->decrBy("key1",5) 减少5List
lPush
$redis->lPush("list", "888");
$id = $redis->lpush('list','HHHHHHH');echo $id;返回链表的元素个数
$redi->lrange('list',0,-1); 返回全部数据,数组形式
$redis->lrange('list',0,2); 返回连表0-2坐标的三个元素lPushx/rPushx
$redis->lPushx(key, value);
在名称为key的list左边(头)/右边(尾)添加一个值为value的元素,如果value已经存在,则不添加
$redis->lpop('list');输出链表最左边的ksy的值,输出后删除掉这个key
$redis->rpop('list');输出链表最右边的ksy的值,输出后删除掉这个key
$redis->lset('list',7,"update"); 修改坐标为7的值,成功返回1集合set
sadd,sadd是无序的集合,每次插入集合的时候都可能会弄乱里面集合的排序
sadd s1 zhangsan
sadd s1 lisi
sadd s1 wangwu
sadd t1 yangxingyi
sadd t1 lilei
sadd t1 zhangsan
smembers s1 s1的所有集合内容
sdiff s1 t1 s1有的,t1没有的,差集
$redis->sinter('s1','t1');返回s1和t1两个集合都有的,数组形式
scard s1 返回s1集合里面的个数,有多少个就返回多少个,没有从0开始的,坐标才从0开始的
spop抽奖场景,返回集合里面随机的数
spop s1 默认返回1个,返回后就删除这个数,中奖了就不能再中了
$i = $redis->spop('s1');var_dump($i); 返回一个数,返回后删除这个数
$i = $redis->spop('s1',2);var_dump($i);不能返回两个的,提示错误的
随机返回集合里面的一个元素,但不删除,重复中奖
$i = $redis->srandmember('s1');echo $i;
sismember s1 zhangsan 查询张三在不在集合里面,在1,不在false
$i = $redis->sismember('s1','zhangsan2');echo $i;在1,不在false
zadd key 2 value 有序集合
zadd y1 1 zhangsan;
zadd y1 3 lisi;
zadd y1 2 wangwu;
zrange y1 0 -1; 排序就是,根据插入的时候的排序从小到达zhangsan,wangwu,lisi
$i = $redis->zrange('y1',0,-1);var_dump($i);
返回数组,键值不是插入时候给的键,是从0开始的新键
zrevrange y1 0 -1; 反转排序,插入的时候键值越高,排序越优先
zcard y1 ;获取有序集合里面的个数,有多少个就返回多少个,没有从0开始的,坐标才从0开始的
无序就scard,有序就zcard,有z没有s
sInterStore
求交集并将交集保存到output的集合
$redis->sInterStore('output', 'key1', 'key2', 'key3')
Hash操作
hSet
$redis->hSet('h', 'key1', 'hello');
向名称为h的hash中添加元素key1—>hello
hGet
$redis->hGet('h', 'key1');
返回名称为h的hash中key1对应的value(hello)
hLen
$redis->hLen('h');
返回名称为h的hash中元素个数
hDel
$redis->hDel('h', 'key1');
删除名称为h的hash中键为key1的域
hKeys
$redis->hKeys('h');
返回名称为key的hash中所有键
hVals
$redis->hVals('h')
返回名称为h的hash中所有键对应的value
hGetAll
$redis->hGetAll('h');
返回名称为h的hash中所有的键(field)及其对应的value
hExists
$redis->hExists('h', 'a');
名称为h的hash中是否存在键名字为a的域
hIncrBy
$redis->hIncrBy('h', 'x', 2);
将名称为h的hash中x的value增加2
hMset
$redis->hMset('user:1', array('name' => 'Joe', 'salary' => 2000));
向名称为key的hash中批量添加元素
hMGet
$redis->hmGet('h', array('field1', 'field2'));
返回名称为h的hash中field1,field2对应的value
redis 操作相关
flushDB
清空当前数据库
flushAll
清空所有数据库
randomKey
随机返回key空间的一个key
$key = $redis->randomKey();
select
选择一个数据库
move
转移一个key到另外一个数据库
$redis->select(0); // switch to DB 0
$redis->set('x', '42'); // write 42 to x
$redis->move('x', 1); // move to DB 1
$redis->select(1); // switch to DB 1
$redis->get('x'); // will return 42
rename, renameKey
给key重命名
$redis->set('x', '42');
$redis->rename('x', 'y');
$redis->get('y'); // → 42
$redis->get('x'); // → `FALSE`
renameNx
与remane类似,但是,如果重新命名的名字已经存在,不会替换成功
setTimeout, expire
设定一个key的活动时间(s)
$redis->setTimeout('x', 3);
expireAt
key存活到一个unix时间戳时间
$redis->expireAt('x', time() + 3);
keys, getKeys
返回满足给定pattern的所有key
$keyWithUserPrefix = $redis->keys('user*');
dbSize
查看现在数据库有多少key
$count = $redis->dbSize();
auth
密码认证
$redis->auth('foobared');
bgrewriteaof
使用aof来进行数据库持久化
$redis->bgrewriteaof();
slaveof
选择从服务器
$redis->slaveof('10.0.1.7', 6379);
save
将数据同步保存到磁盘
bgsave
将数据异步保存到磁盘
lastSave
返回上次成功将数据保存到磁盘的Unix时戳
info
返回redis的版本信息等详情
Redis::__construct构造函数
$redis = new Redis();
connect, open 链接redis服务
参数
host: string,服务地址
port: int,端口号
timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间)
注: 在redis.conf中也有时间,默认为300
pconnect, popen 不会主动关闭的链接
参考上面
setOption 设置redis模式
getOption 查看redis设置的模式
ping 查看连接状态
get 得到某个key的值(string值)
如果该key不存在,return false
set 写入key 和 value(string值)
如果写入成功,return ture
setex 带生存时间的写入值
$redis->setex('key', 3600, 'value'); // sets key → value, with 1h TTL.
setnx 判断是否重复的,写入值
$redis->setnx('key', 'value');
$redis->setnx('key', 'value');
delete 删除指定key的值
返回已经删除key的个数(长整数)
$redis->delete('key1', 'key2');
$redis->delete(array('key3', 'key4', 'key5'));
ttl
得到一个key的生存时间
persist
移除生存时间到期的key
如果key到期 true 如果不到期 false
mset (redis版本1.1以上才可以用)
同时给多个key赋值
$redis->mset(array('key0' => 'value0', 'key1' => 'value1'));
multi, exec, discard
进入或者退出事务模式
参数可选Redis::MULTI或Redis::PIPELINE. 默认是 Redis::MULTI
Redis::MULTI:将多个操作当成一个事务执行
Redis::PIPELINE:让(多条)执行命令简单的,更加快速的发送给服务器,但是没有任何原子性的保证
discard:删除一个事务
返回值
multi(),返回一个redis对象,并进入multi-mode模式,一旦进入multi-mode模式,以后调用的所有方法都会返回相同的对象,只到exec()方法被调用。
watch, unwatch (代码测试后,不能达到所说的效果)
监测一个key的值是否被其它的程序更改。如果这个key在watch 和 exec (方法)间被修改,这个 MULTI/EXEC 事务的执行将失败(return false)
unwatch 取消被这个程序监测的所有key
参数,一对key的列表
$redis->watch('x');
$ret = $redis->multi() ->incr('x') ->exec();
subscribe *
方法回调。注意,该方法可能在未来里发生改变
publish *
发表内容到某一个通道。注意,该方法可能在未来里发生改变
exists
判断key是否存在。存在 true 不在 false
incr, incrBy
key中的值进行自增1,如果填写了第二个参数,者自增第二个参数所填的值
$redis->incr('key1');
$redis->incrBy('key1', 10);
decr, decrBy
做减法,使用方法同incr
getMultiple
传参
由key组成的数组
返回参数
如果key存在返回value,不存在返回false
$redis->set('key1', 'value1'); $redis->set('key2', 'value2'); $redis->set('key3', 'value3'); $redis->getMultiple(array('key1', 'key2', 'key3'));
$redis->lRem('key1', 'A', 2);
$redis->lRange('key1', 0, -1);
list相关操作
lPush
$redis->lPush(key, value);
在名称为key的list左边(头)添加一个值为value的 元素
rPush
$redis->rPush(key, value);
在名称为key的list右边(尾)添加一个值为value的 元素
lPushx/rPushx
$redis->lPushx(key, value);
在名称为key的list左边(头)/右边(尾)添加一个值为value的元素,如果value已经存在,则不添加
lPop/rPop
$redis->lPop('key');
输出名称为key的list左(头)起/右(尾)起的第一个元素,删除该元素
blPop/brPop
$redis->blPop('key1', 'key2', 10);
lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对keyi+1开始的list执行pop操作
lSize
$redis->lSize('key');
返回名称为key的list有多少个元素
lIndex, lGet
$redis->lGet('key', 0);
返回名称为key的list中index位置的元素
lSet
$redis->lSet('key', 0, 'X');
给名称为key的list中index位置的元素赋值为value
lRange, lGetRange
$redis->lRange('key1', 0, -1);
返回名称为key的list中start至end之间的元素(end为 -1 ,返回所有)
lTrim, listTrim
$redis->lTrim('key', start, end);
截取名称为key的list,保留start至end之间的元素
lRem, lRemove
$redis->lRem('key', 'A', 2);
删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素
lInsert
在名称为为key的list中,找到值为pivot 的value,并根据参数Redis::BEFORE | Redis::AFTER,来确定,newvalue 是放在 pivot 的前面,或者后面。如果key不存在,不会插入,如果 pivot不存在,return -1
$redis->delete('key1'); $redis->lInsert('key1', Redis::AFTER, 'A', 'X'); $redis->lPush('key1', 'A'); $redis->lPush('key1', 'B'); $redis->lPush('key1', 'C'); $redis->lInsert('key1', Redis::BEFORE, 'C', 'X');
$redis->lRange('key1', 0, -1);
$redis->lInsert('key1', Redis::AFTER, 'C', 'Y');
$redis->lRange('key1', 0, -1);
$redis->lInsert('key1', Redis::AFTER, 'W', 'value');
rpoplpush
返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
$redis->delete('x', 'y');
$redis->lPush('x', 'abc'); $redis->lPush('x', 'def'); $redis->lPush('y', '123'); $redis->lPush('y', '456'); // move the last of x to the front of y. var_dump($redis->rpoplpush('x', 'y'));
var_dump($redis->lRange('x', 0, -1));
var_dump($redis->lRange('y', 0, -1));
string(3) "abc"
array(1) { [0]=> string(3) "def" }
array(3) { [0]=> string(3) "abc" [1]=> string(3) "456" [2]=> string(3) "123" }
SET操作相关
sAdd
向名称为key的set中添加元素value,如果value存在,不写入,return false
$redis->sAdd(key , value);
sRem, sRemove
删除名称为key的set中的元素value
$redis->sAdd('key1' , 'set1');
$redis->sAdd('key1' , 'set2');
$redis->sAdd('key1' , 'set3');
$redis->sRem('key1', 'set2');
sMove
将value元素从名称为srckey的集合移到名称为dstkey的集合
$redis->sMove(seckey, dstkey, value);
sIsMember, sContains
名称为key的集合中查找是否有value元素,有ture 没有 false
$redis->sIsMember(key, value);
sCard, sSize
返回名称为key的set的元素个数
sPop
随机返回并删除名称为key的set中一个元素
sRandMember
随机返回名称为key的set中一个元素,不删除
sInter
求交集
sInterStore
求交集并将交集保存到output的集合
$redis->sInterStore('output', 'key1', 'key2', 'key3')
sUnion
求并集
$redis->sUnion('s0', 's1', 's2');
s0,s1,s2 同时求并集
sUnionStore
求并集并将并集保存到output的集合
$redis->sUnionStore('output', 'key1', 'key2', 'key3');
sDiff
求差集
sDiffStore
求差集并将差集保存到output的集合
sMembers, sGetMembers
返回名称为key的set的所有元素
sort
排序,分页等
参数
'by' => 'some_pattern_*',
'limit' => array(0, 1),
'get' => 'some_other_pattern_*' or an array of patterns,
'sort' => 'asc' or 'desc',
'alpha' => TRUE,
'store' => 'external-key'
例子
$redis->delete('s'); $redis->sadd('s', 5); $redis->sadd('s', 4); $redis->sadd('s', 2); $redis->sadd('s', 1); $redis->sadd('s', 3);
var_dump($redis->sort('s')); // 1,2,3,4,5
var_dump($redis->sort('s', array('sort' => 'desc'))); // 5,4,3,2,1
var_dump($redis->sort('s', array('sort' => 'desc', 'store' => 'out'))); // (int)5
string命令
getSet
返回原来key中的值,并将value写入key
$redis->set('x', '42');
$exValue = $redis->getSet('x', 'lol'); // return '42', replaces x by 'lol'
$newValue = $redis->get('x')' // return 'lol'
append
string,名称为key的string的值在后面加上value
$redis->set('key', 'value1');
$redis->append('key', 'value2');
$redis->get('key');
getRange (方法不存在)
返回名称为key的string中start至end之间的字符
$redis->set('key', 'string value');
$redis->getRange('key', 0, 5);
$redis->getRange('key', -5, -1);
setRange (方法不存在)
改变key的string中start至end之间的字符为value
$redis->set('key', 'Hello world');
$redis->setRange('key', 6, "redis");
$redis->get('key');
strlen
得到key的string的长度
$redis->strlen('key');
getBit/setBit
返回2进制信息
zset(sorted set)操作相关
zAdd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
$redis->zAdd('key', 1, 'val1');
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 5, 'val5');
$redis->zRange('key', 0, -1); // array(val0, val1, val5)
zRange(key, start, end,withscores):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
$redis->zAdd('key1', 0, 'val0');
$redis->zAdd('key1', 2, 'val2');
$redis->zAdd('key1', 10, 'val10');
$redis->zRange('key1', 0, -1); // with scores $redis->zRange('key1', 0, -1, true);
zDelete, zRem
zRem(key, member) :删除名称为key的zset中的元素member
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zDelete('key', 'val2');
$redis->zRange('key', 0, -1);
zRevRange(key, start, end,withscores):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素.withscores: 是否输出socre的值,默认false,不输出
$redis->zAdd('key', 0, 'val0');
$redis->zAdd('key', 2, 'val2');
$redis->zAdd('key', 10, 'val10');
$redis->zRevRange('key', 0, -1); // with scores $redis->zRevRange('key', 0, -1, true);
zRangeByScore, zRevRangeByScore
$redis->zRangeByScore(key, star, end, array(withscores, limit ));
返回名称为key的zset中score >= star且score <= end的所有元素
zCount
$redis->zCount(key, star, end);
返回名称为key的zset中score >= star且score <= end的所有元素的个数
zRemRangeByScore, zDeleteRangeByScore
$redis->zRemRangeByScore('key', star, end);
删除名称为key的zset中score >= star且score <= end的所有元素,返回删除个数
zSize, zCard
返回名称为key的zset的所有元素的个数
zScore
$redis->zScore(key, val2);
返回名称为key的zset中元素val2的score
zRank, zRevRank
$redis->zRevRank(key, val);
返回名称为key的zset(元素已按score从小到大排序)中val元素的rank(即index,从0开始),若没有val元素,返回“null”。zRevRank 是从大到小排序
zIncrBy
$redis->zIncrBy('key', increment, 'member');
如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment
zUnion/zInter
参数
keyOutput
arrayZSetKeys
arrayWeights
aggregateFunction Either "SUM", "MIN", or "MAX": defines the behaviour to use on duplicate entries during the zUnion.
对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
阅读更多风口下的猪2022-03-03【Redis】
-
TP6添加中间件
thinkphpTP6添加域名请求控制/session/缓存/多语言等中间件,通过在app/middleware.php中引入即可
阅读更多风口下的猪2022-03-02【thinkphp】
-
腾讯云短信对接遇到的错误
thinkphp
阅读更多风口下的猪2022-03-01【thinkphp】
-
js清空input file的值
JavaScript今天在做选择本地图片上传的功能时遇到一个问题,第一次选择图片完成会触发onchange事件,获取文件后动态在界面上创建img标签展示,这个过程没有问题,问题出在:当把创建的img元素节点删除后,再点file控件选中同一个文件后发现图片并没有被重新创建出来。
分析了原因,是因为上一次file里选择的文件路径值与本次选择的文件路径值是一样的,值没有改变所以导致file不会触发onchange事件。
解决这个问题的思路是:每次创建完img后把file的路径值清空,但浏览器的安全机制规定不可以直接用js修改file的value为有效值,解决方法是设置file的value为空字符,或者把file的html重新初始化来解决清空的问题。
解决办法:
var file = document.getElementById('file'); file.value = ''; //虽然file的value不能设为有字符的值,但是可以设置为空值 //或者 file.outerHTML = file.outerHTML; //重新初始化了file的html
阅读更多风口下的猪2022-02-10【JavaScript】
-
非页面js使用uni.navigateTo()进行跳转
uni-app非页面js使用uni.navigateTo()进行跳转如果url中带有".vue"则不能跳转,需要将其去除
阅读更多风口下的猪2022-01-04【uni-app】
-
make test 报错
Linuxmake test 有出错
make test 有报错:
Build complete.
Don’t forget to run ‘make test’.
+———————————————————–+
| ! ERROR ! |
| The test-suite requires that proc_open() is available. |
| Please check if you disabled it in php.ini. |
+———————————————
解决方法:
vi /usr/local/php/etc/php.ini
找到disable_functions = shell_exec, system, passthru, exec, popen, proc_open
改为disable_functions = shell_exec, system, passthru, exec, popen
保存退出。
接着
make test
通过测试
阅读更多风口下的猪2021-12-27【Linux】