面包屑思维模型实战模型错题集结构手册流程手册自我检测专题模块

  • 微信小程序前端
    微信小程序前端易错点收集
    查看
  • css/less/sass样式控制
    在开发过程中的一些样式控制bug规避
    查看
  • tp5开发小程序
    tp5开发小程序时错误积累
    查看
  • PHP错题集
    PHP在实际开发过程中遇到的问题
    查看
  • MySql数据库
    使用MySql在实际开发中遇到的错误总结
    查看
  • TP5错题集
    积累tp5框架在实际开发过程中遇到的问题
    查看
  • uni-app爬坑
    主要用于uni-app项目中遇到的一些问题
    查看
  • Vue.js易错收集
    vue.js项目常见错误收集整理
    查看
  • uni-app开发微信小程序
    uni-app开发微信小程序的一些爬坑积累
    查看
  • Linux
    Linux在部署、开发、运维时遇见的错误积累
    查看
  • 安全设计
    常见安全设计
    查看
  • Redis
    项目中使用redis的相关错误积累
    查看
  • 前端特效
    前端特效相关错题集
    查看
more

最新博文

  • redis分页查询方案设想(但count不准确,不推荐)

    Redis

    redis分页查询,主要是通过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-04Redis

    阅读更多
  • redis 模糊查询(含中文)/分类查询方案

    Redis

    redis实现条件查询,可以依据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-03Redis

    阅读更多
  • Thinkphp项目怎么做模糊查询

    Redis

    Thinkphp内置的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-03Redis

    阅读更多
  • PHP redis SCAN、SSCAN、ZSCAN、HSCAN 的使用

    Redis

    SCAN

    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-03Redis

    阅读更多
  • 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
    OK
    redis 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
    OK
    redis 127.0.0.1:6379> keys on[eaw]
    1) "one"




    风口下的猪2022-03-03Redis

    阅读更多
  • php redis常见操作

    Redis

    php连接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) 减少5


    List

    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-03Redis

    阅读更多
  • TP6添加中间件

    thinkphp

    TP6添加域名请求控制/session/缓存/多语言等中间件,通过在app/middleware.php中引入即可

    风口下的猪2022-03-02thinkphp

    阅读更多
  • 腾讯云短信对接遇到的错误

    thinkphp

    风口下的猪2022-03-01thinkphp

    阅读更多
  • 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-10JavaScript

    阅读更多
  • 非页面js使用uni.navigateTo()进行跳转

    uni-app

    非页面js使用uni.navigateTo()进行跳转如果url中带有".vue"则不能跳转,需要将其去除




    风口下的猪2022-01-04uni-app

    阅读更多
  • make test 报错

    Linux

    make 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-27Linux

    阅读更多
  • 软件开发
  • 素质要求
  • 计算机基础
  • 架构
  • 安全
  • 性能
  • 运维
  • 尾页
  • 数据库
  • 开发终端
  • 语言基础
  • 项目管理
  • 产品设计
  • 系统
  • 工作规范
  • 计算机网络
  • 前端技术栈
  • 数据结构
  • 计算机组成原理
  • 后端技术栈
  • 性能优化
  • 安全设计
  • 常见模块
  • 计算机操作系统
  • 服务器
  • python
  • MySQL
  • thinkphp
  • PHP
  • Java
  • JavaScript
  • Windows
  • Linux
  • 特效
  • indexedDB
  • vue
  • 淘宝联盟
  • Ionic
  • Angular
  • 微信小程序
  • 支付宝小程序
  • uni-app
  • css/sass/less
  • 支付
  • socket
  • 爬虫
  • web性能优化
  • 消息推送
  • CVM
  • sqlite
  • Redis
  • 前端基础
  • 基础
  • element
  • Nginx
  • yii2
  • /ponder/index/catelist/catelist/cateid/10.html

    我的名片

    网名:风口下的猪

    职业:软件开发、广告传媒

    现居:重庆渝北

    Email:kamoneyte@qq.com

    标签云

    站点信息

    • 文章统计:528篇
    • 移动端访问:扫码进入SQ3R