• Redis Study Notes


    PHP 中使用 Redis

    基本使用

    // 1. redis 数据库连接对象
    $redis = new Redis();
    $redis -> connect('localhost', 6379);
    
    // 2. redis 密码验证(默认没有开启,如果开启需要使用 auth函数)
    // $redis -> auth('redis');
    
    // 3. redis 选择数据库(默认redis服务有16个数据库) 0-15
    $redis ->select(0);
    
    // 4. 设置值
    $data = $redis->set('name', 'jack');
    
    // 5. 获取值
    echo($redis->get('name'));
    

    常用方法

    • keys 获取当前数据库中所有的键, 返回一个数组
    $redis -> set('name', 'jack');
    $redis -> set('age', '19');
    $redis -> set('height', '172');
    
    // 返回一个数据
    $keysArray = $redis->keys('*');
    
    echo'<pre>';
    print_r($keysArray);
    echo '</pre>';
    
    • exists 检测一个键名是否存在 返回一个布尔值
    $redis -> set('name', 'jack');
    $redis -> set('age', '19');
    $redis -> set('height', '172');
    
    $bool = $redis->exists("name");
    var_dump($bool);
    
    • del 删除一个键
    $redis -> set('name', 'jack');
    $redis -> set('age', '19');
    $redis -> set('height', '172');
    
    
    $bool = $redis->del('name'); // 1
    
    $bool = $redis->get('name');
    var_dump($bool); // false
    
    • flushdb 清空当前数据库 flushall 清空所有数据库
    $redis -> set('name', 'jack');
    $redis -> set('age', '19');
    $redis -> set('height', '172');
    
    $bool = $redis -> flushdb();
    var_dump($bool);
    
    var_dump($redis->get('name'));   // false
    var_dump($redis->get('age'));    // false
    var_dump($redis->get('height')); // false
    

    redis 可以存储的数据类型

    • string 保存一般字符串
    • Hash 保存多属性的值
    • List 队列
    • Set
    • Zset

    字符串

    字符串 (写入)

    • set() 写入一个值
    //写入一个数据
    $data = $redis->set('key1', 'test');
    
    • setex() 设置一个值并设置时效
    // 写入一个数据并设置时效, 5秒后过期
    $data = $redis->setex('key2', 5, 'test');
    $data = $redis->get('key2');
    
    • mset() 批量写入数据
    // 批量写入数据, 传入一个关联数组
    $data = $redis->mset(['name'=>'alex', 'age'=>18, 'height'=>172]);
    
    • expire() 设置某个键的生命周期
    $redis->set('name', 'jack');
    
    // 设置一个键的生命周期
    $data = $redis->expire('name', 10);
    
    • setnx() 检查一个键是否存在, 如果存在就不设置(返回false) 不存在就设置(返回true)
    // 刷新两次就能看到结果
    $bool = $redis->setnx('name', 'jason');
    var_dump($bool);
    

    字符串 (获取)

    • get() 获取一个值
    $redis -> set('name', 'tom');
    $redis -> set('age', 18);
    $redis -> set('height', 172);
    
    echo $redis -> get('name');
    
    • mget() 获取多个值获取失败返回false, 成功返回键对应的值
    $redis -> set('name', 'tom');
    $redis -> set('age', 18);
    $redis -> set('height', 172);
    
    $arr = $redis -> mget(['name', 'age', 'height']);
    
    // 获取多个值
    echo'<pre>';
    print_r($arr);
    echo '</pre>';
    

    字符串 (删除)

    • delete() 删除指定的键,返回受影响的行数
    $redis -> set('name', 'tom');
    $affect = $redis -> delete('name');
    echo $affect;
    
    $redis -> set('name', 'tom');
    $redis -> set('age', 18);
    $redis -> set('height', 172);
    
    $affect = $redis -> delete(['name', 'age', 'height']);
    echo $affect; // 3
    

    字符串(其他函数)

    • incr() 递增
    $count = $redis->incr('count');
    echo $count;
    
    • decr() 递减
    $count = $redis->decr('count');
    echo $count;
    
    • incrby 递增并且指定步长
    $count = $redis->incrby('count', 5); // 每次递增 5
    echo $count;
    
    • decrby递减并且指定步长
    $count = $redis->decrby('count', 5); // 每次递减 5
    echo $count;
    

    Hash (设置哈希)

    • hset()设置hash属性
    // 设置hash: hset('key', 'attribute', 'value');
    $data = $redis->hset('user', 'name', 'alex');
    $data = $redis->hset('user', 'age', '18');
    
    • hget() 读取某个 hash属性
    // 获取hash: hget('key', 'attribute');
    var_dump($redis->hget('user', 'name'));
    

    Hash

    Hash (删除哈希)

    • hdel() 删除 hash 的某个 属性
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    
    var_dump($redis->hdel('user', 'name'));
    
    var_dump($redis->hget('user', 'name'));
    
    • delete 删除指定键名的 hash
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    var_dump($redis->del('user'));
    var_dump($redis->hget('user', 'name'));   // false
    var_dump($redis->hget('user', 'age'));    // false
    var_dump($redis->hget('user', 'height')); // false
    

    Hash (修改哈希)

    • hset() 修改hash的属性
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    var_dump($redis->hset('user', 'age', 20));
    
    var_dump($redis->hget('user', 'age'));
    

    Hash (其他)

    • hincrby()hash 的某个属性递增
    $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    // hincrby('key', 'attr', step);
    $redis->hincrby('user', 'age', 1);
    var_dump($redis->hget('user', 'age'));
    
    • hincrby()hash 的某个属性递减
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    $redis->hincrby('user', 'age', -1);
    var_dump($redis->hget('user', 'age'));
    

    Hash(获取)

    • hget() 获取某个属性的值
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    // 获取单个属性
    var_dump($redis->hget('user', 'age'));
    
    • hmget() 获取多个属性的值
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    // 获取多个属性
    var_dump($redis->hmget('user', ['age','age','height']));
    
    • hgetall() 获取所有属性的值 ps: 这个函数在循环中有 bug
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    // 获取所有属性
    $arr = $redis->hgetall('user');
    echo '<pre>';
    print_r($arr);
    echo '</pre>';
    
    • hashlen() 获取hash 的个数
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    // 获取所有属性的个数
    echo $redis->hlen('user'); // 3
    
    • hkeys() 获取所有的键名
    // 一次设置多个hash属性值: hmset('key', [ attr1=>value1, attr2=>value2 ])
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    // 获取所有属性的个数
    $keys = hkeys('user');
    echo'<pre>';
    print_r($keys);
    echo '</pre>';
    
    • hvals() 获取所有的键值
    // 一次设置多个hash属性值: hmset('key', [ attr1=>value1, attr2=>value2 ])
    $bool = $redis->hmset('user', [ 'name'=>'jack', 'age'=>18, 'height'=>174 ]);
    
    // 获取所有属性的个数
    $vals = hvals('user');
    echo'<pre>';
    print_r($vals);
    echo '</pre>';
    

    List

    增加

    • 左侧压值
    // 队列, 左侧压入值, 右侧压入值
    $redis->lpush('queue', 'jack');
    $redis->lpush('queue', 'jason');
    
    • 右侧压值
    $redis->rpush('queue', 'tom');
    $redis->rpush('queue', 'ken');
    

    删除

    • 左侧弹出值
    // 左侧弹出一个值,并返回
    echo $redis->lpop('queue'); // jason
    
    • 右侧弹出值
    // 左侧弹出一个值,并返回
    echo $redis->rpop('queue');  // tom
    
    • 删除指定的值
    // 队列, 左侧压入值, 右侧压入值
    $redis->lpush('queue', 'jack');
    $redis->rpush('queue', 'tom');
    $redis->lpush('queue', 'jason');
    
    // 删除指定的值,并返回索引
    echo $redis->lrem('queue', 'jason');
    

    修改

    • 修改指定的值
    // 队列, 左侧压入值, 右侧压入值
    $redis->lpush('queue', 'jack');
    $redis->rpush('queue', 'tom');
    $redis->lpush('queue', 'jason');
    
    // 删除指定的值,并返回索引
    echo $redis->lset('queue', 'tom', 'tomson');
    
    • 设置第 n 个值 (索引从0 开始)
    • 右侧弹出左侧压入
    $redis->lpush('list', 'java');
    $redis->lpush('list', 'php');
    $redis->lpush('list', 'c');
    $redis->rpush('list', 'c++');
    $redis->rpush('list', 'python');
    $redis->rpush('list', 'javascript');
    
    // 弹出list列表中的最右边的一个值放到list-2列表中,返回弹出的那个值
    $data = $redis->rpoplpush('list', 'list-2'); // js
    
    var_dump($data);
    

    获取

    • 返回第 n 个元素的值 (索引从0 开始)
    
    $redis->lpush('list', 'java');
    $redis->lpush('list', 'php');
    $redis->lpush('list', 'c');
    $redis->rpush('list', 'c++');
    $redis->rpush('list', 'python');
    $redis->rpush('list', 'javascript');
    
    // 获取指定索引的值
    $data = $redis->lindex('list', 2); // java
    
    • 返回列表中的一段数据
    $redis->lpush('list', 'java');
    $redis->lpush('list', 'php');
    $redis->lpush('list', 'c');
    $redis->rpush('list', 'c++');
    $redis->rpush('list', 'python');
    $redis->rpush('list', 'javascript');
    
    // 获取一段值
    $data = $redis->lrange('list', 0, -1); // 从0开始获取所有数据
    $data = $redis->lrange('list', 0, -2); // 从0开始获取到倒数第二个的位置
    $data = $redis->lrange('list', 0, 2);  // 从0开始获取到第二个元素的位置
    
    var_dump($data);
    
    • 获取列表的长度
    $redis->lpush('list', 'java');
    $redis->lpush('list', 'php');
    $redis->lpush('list', 'c');
    $redis->rpush('list', 'c++');
    $redis->rpush('list', 'python');
    $redis->rpush('list', 'javascript');
    
    // 获取集合的元素个数
    $length = $redis->lsize('list');
    var_dump($length);
    

    set 集合(集合中没有重复的数据, 自动去重)

    set集合默认是无序的

    增加

    • sadd()
    // set 集合添加值: sadd('key', 'value1', 'value2', ... 'valuen');
    // 在添加值的时候, 如果值已经存在就会添加失败
    $redis -> sadd('users','tom', 'jack', 'alex', 'jason');
    

    删除

    • 删除
    // set集合删除值: srem('key', '需要删除的值');
    $data = $redis->srem('users', 'tom');
    

    获取

    • smembers() 获取集合中所有的元素,返回一个数组
    $redis->sadd('animal', 'dog', 'cat');
    $redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中
    
    // smove(原集合,目标集合,需要移动的值)该方法返回一个布尔值
    $data = $redis->smembers('fruit');
    
    var_dump($data);
    
    • srandmember() 随机取出一个元素
    $redis->sadd('fruit', 'apple', 'lemon', 'banana');
    $data = $redis->srandmember('fruit');
    
    var_dump($data);
    
    • sinter() 交集, 取出两个集合中相同的元素, 返回一个数组
    $redis->sadd('animal', 'dog', 'cat', 'bird');
    $redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中
    
    // 交集
    $data = $redis->sinter('animal', 'fruit'); // bird
    var_dump($data);
    
    • sunion() 并集, 合并两个集合并去重, 返回一个数组
    $redis->sadd('animal', 'dog', 'cat', 'bird');
    $redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中
    
    // 并集
    $data = $redis->sunion('animal', 'fruit');
    
    • sdiff() 差集, 比较两个集合中的元素,返回一个数组
    $redis->sadd('animal', 'dog', 'cat', 'bird');
    $redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中
    
    // 差集
    $data = $redis->sdiff('animal', 'fruit');
    var_dump($data); // 两次结果不一致
    
    $data = $redis->sdiff('fruit', 'animal');
    var_dump($data); // 两次结果不一致
    

    其他

    • smove() 移动元素
    $redis->sadd('animal', 'dog', 'cat');
    $redis->sadd('fruit', 'apple', 'lemon', 'banana','bird'); // 把bird放到animal集合中
    
    // smove(原集合,目标集合,需要移动的值)该方法返回一个布尔值
    $data = $redis->smove('fruit', 'animal', 'bird');
    
    var_dump($data);
    
    • sismember() 判断某个值是否在集合中
    $redis->sadd('users', 'tom', 'jack', 'alex');
    $bool = $redis->sismember('users', 'jason');
    
    var_dump($bool);
    

    有序集合

    根据权重排序的集合

    添加数据

    • zadd() 先有序集合中添加数据
    // 1. 添加数据 zadd('集合', '权重', '值');
    $redis->zadd('score', 10, 'tom');
    $redis->zadd('score', 30, 'jack');
    $redis->zadd('score', 60, 'alex');
    $redis->zadd('score', 90, 'jason');
    

    修改权重

    • zincrby() 更新有序集合中的某个值的权重(改变权重就会改变排序)
    $redis->zadd('score', 10, 'tom');
    $redis->zadd('score', 30, 'jack');
    $redis->zadd('score', 60, 'alex');
    $redis->zadd('score', 90, 'jason');
    
    // 给 score 这个集合中的 tom 元素增加权重, 每次增加2
    $data = $redis->zincrby('score', 2, 'tom');
    var_dump($data);
    

    获取

    • zrange() 获取有序集合中的一段数据(降序)
    // 获取集合中的一段数据
    $data = $redis->zrange('score', 0, -1); // 获取所有数据
    $data = $redis->zrange('score', 0, 3);  // 获取从0开始到第3个位置的数据
    
    • zrevrange() 获取有序集合中的一段数据(升序)
    // 正序
    $data = $redis->zrange('score', 0, -1);
    echo'<pre>';
    print_r($data);
    echo '</pre>';
    
    // 倒序
    $data = $redis->zrevrange('score', 0, -1);
    echo'<pre>';
    print_r($data);
    echo '</pre>';
    
    • zrangebyscore() 根据权重排序(降序)
    // 根据权重排序 zrangebyscore('需要排序的集合', 最低权重,最高权重, [widthscore=>true])
    $data = $redis->zrangebyscore('score', 0, 100, ['widthscore'=>true]);
    echo'<pre>';
    print_r($data);
    echo '</pre>';
    
    • zrevrangebyscore() 根据权重排序(升序)
    // 根据权重排序 zrangebyscore('需要排序的集合', 最高权重, 最低权重, [widthscore=>true])
    $data = $redis->zrevrangebyscore('score', 100, 0, ['widthscore'=>true]);
    echo'<pre>';
    print_r($data);
    echo '</pre>';
    
    • zcount() 统计有序集合符合指定条件的元素个数
    // `zcount` 统计有序集合中符合指定条件的元素个数
    // zcount('需要统计的集合', '范围的最低权重', '范围的最高权重');
    $count = $redis->zcount('score', 50, 100); // 返回一个整形的数字
    
    echo'<pre>';
    print_r($count);
    echo '</pre>';
    
    • zsize() 查看有序集合中所有元素的个数
    // zise  统计有序集合中的元素个数
    echo $redis->zsize('score');
    
    • zscore() 查看有序集合中的某个元素的权重
    echo $redis->zscore('sroce', 'tom');
    
    • zrank()zrevrank()
    // 查看某个元素在有序集合中的元素按权重 `升序排序` 的位置的排名
    $data = $redis->zrank('score', 'tom');
    echo'<pre>';
    print_r($data);
    echo '</pre>';
    
    // 查看某个有序集合中的元素按权重 `降序排序` 的排名
    $data = $redis->zrevrank('score', 'tom');
    echo'<pre>';
    print_r($data);
    echo '</pre>';
    

    Memcache 和 Redis 的区别

    1. Redis 可以持久化数据, Memcache不能
    2. Redis 支持 string hash list set zsetmemcache 只支持 string 数据结构
    3. Redis 支持 master-slave 模式备份数据 (主从数据库,读写分离)
  • 相关阅读:
    监控系统如何选择合适的时序数据库?
    面试官:谈谈如何防止消息丢失和消息重复
    面试官:mysql的四种事务隔离级别
    一致性Hash介绍及使用场景
    微服务之服务监控
    什么是公考、联考、国考、省考、选调生?
    LINQ: When to use SingleOrDefault vs. FirstOrDefault() with filtering criteria
    Async. Postbacks cause Page_Init? (C#)
    在线求解 不定积分 高等数学
    wpf Load
  • 原文地址:https://www.cnblogs.com/liaohui5/p/10581626.html
Copyright © 2020-2023  润新知