类型 | 使用方法 | 输出 | 特性 | 场景 |
---|---|---|---|---|
String (字符串) | //存值 Redis::set('val1', '1'); //减值 (原子操作)-1 Redis::decr('val1'); //增值(原子操作)+1 Redis::incr('val1'); //取值 Redis::get('val1'); | "1" | 可以包含任何数据,比如jpg图片或者序列化的对象,规定字符串的长度不得超过512MB。 Redis的字符串有两种存储方式,在长度特别短时,使用embstr形势存储,而长度超过44字节时候,使用raw形势存储 | 1、访问量统计:微博大V主页高频的访问,对于粉丝数、关注数、微博数都需要时时更新 2、将数据以二进制序列化的方式进行存储 |
Hash (字典) | //hset:给属性赋值 Redis::hset('hash_name', 'name', 'yxw'); Redis::hset('hash_name', 'age', '18'); //hget:获取单个属性 Redis::hget('hash_name', 'name'); //hmget:获取多个属性 Redis::hmget('hash_name', ['name', 'age']); | //获取单个 "yxw" //获取多个 array:2 [ | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)。 大字典的扩容是比较耗时的,需要重新申请新的数组,然后将旧字典所有链表中的元素重新挂接到新的数组下面,这是一个O(n)级别的操作,作为单线程的Redis很难承受这样耗时的过程,所以Redis使用渐进式rehash小步搬迁虽然慢一点,但是肯定可以搬完。 | 1、存储、读取、修改对象属性,比如:用户(姓名、性别、爱好),文章(标题、发布时间、作者、内容) 2、添加购物车和获取购物车,keys的命名为 表名+主键+主键值 |
List (列表) | //lpush:从左边插入 //rpush:从右边插入 Redis::lpush('list1','A'); Redis::rpush('list2','B'); //lpop:从左边取入 //rpop:从右边取入 Redis::lpop('list1'); Redis::rpop('list2'); | "A" | 增删快,提供了操作某一段元素的API 普通的链表需要的附加指针空间太大,会浪费空间,加重内存的碎片化。Redis将链表和ziplist结合起来组成了quicklist,也就是将多个ziplist使用双向指针串联起来使用,既满足了快速的插入删除性能,又不会出现太大的空间冗余 | 1、最新消息排行等功能(比如朋友圈的时间线) 2、消息队列 |
Set (集合) | //sadd:添加 Redis::sadd('set1', 'A'); //scard:统计元素个数 Redis::scard('set1'); //smembers:以数组来统计元素个数 Redis::smembers('set1'); | //scard 1 //smembers | 1、添加、删除、查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 当set集合容纳的元素都是整数并且元素个数较少时,Redis会使用intset来存储集合元素。intset是紧凑的数组结构,同时支持16位,32位和64位整数 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 4、随机推送热点信息、热点新闻、热卖旅游、应用app推荐、关注推荐等 |
Sorted Set (有序集合) | //zadd:给某个score添加值 Redis::zadd('zset1', '100', 'zhangsan'); Redis::zadd('zset1', '90', 'lisi'); //zrange:从低到高查询 Redis::zrange('zset1', 0, -1); //zrevrange:从高到低查询 Redis::zrevrange('zset1', 0, -1); | array:2 [ 0 => "lisi" 1 => "zhangsan" ] array:2 [ 0 => "zhangsan" 1 => "lisi" ] | 数据插入集合时,已经进行天然排序 Redis的跳表共有64层,能容纳2的64次方个元素。 Redis之所以用跳表来实现有序集合 1. 插入、删除、查找以及迭代输出有序序列这几个操作,红黑树都能完成,时间复杂度跟跳表是一样的。但是按照区间来查找数据,红黑树的效率就没有跳表高 2. 跳表更容易代码实现,比起红黑树来说还是好懂、好写很多,可读性好,不容易出错 3. 跳表更加灵活,可以通过改变索引构建策略,有效平衡执行效率和内存消耗 | 1、排行榜,取TopN操作 2、带权重的消息队列 |
<?php
//字符串操作:
//Set :创建或者设置value值
Redis::set('key','value');
//Get :获取到key值,不存在返回空
Redis::get('key');
//mset :存储多个key=>value
Redis::mset(['one'=>1,'two'=>2]);
//Mget :获取多个key对应的value
Redis::mget(['one',’two’]);
//Keys :根据健名模糊搜索
Redis::keys('on*');
//Ttl :获取key缓存时间
Redis::ttl('one');
//exists :检查可以是否存在
Redis::exists('one');
//队列操作:
//rpush :创建队列,或在队列的后面插入元素(rpushx)
Redis::rpush('foolist',1);
Redis::rpushx('foolist',’2’);
//lpush :创建队列,或在队列的前面插入元素(lpushx)
Redis::lpush('foolist',1);
Redis::lpushx('foolist',2);
//lset :修改队列中指定位置的值
Redis::lset('foolist',1,123);
//lpop/rpop :有序的弹出(删除)最左/最右的元素
Redis::lpop('foolist');
Redis::rpop('foolist');
//Linsert :在队列的指定元素前或后插入元素
Redis::linsert('foolist','before',1,123);
Redis::linsert('foolist','after',1,456);
//Blpop :等待队列不为空的时候,移出第一个元素(阻塞)
Redis::blpop('foolist',10); 10秒过期
//BRPOP :等待队列不为空的时候,移除最后一个元素(阻塞)
Redis::brpop('foolist',10); 10秒过期
//排序操作:
//降序排列:
Redis::sort('foolist',['sort'=>'desc']);
//返回指定位置的元素的个数(元素位置1和他的后一位):
Redis::sort('foolist',['limit'=>[1,2]]);
//按照首字符排序:
Redis::sort('foolist',['limit'=>['alpha'=>true]]);
//永久性排序,返回元素个数:
Redis::sort('foolist',['limit'=>['store'=>'ordered']]);
//使用*过滤元素,只返回符合要求的元素:
Redis::sort('foolist',['limit'=>['get'=>'on*']]);
//hash表数据
//Hset :创建,存值
Redis::hset('hash1','key1',1);
Redis::hset('hash1','key2',2);
// Hget :获取指定key值
Redis::hget('hash1','key1');
// Hexists :判断key是否存在
Redis::hexists('hash1','key1');
// Hdel :删除hash表中指定值
Redis::hdel('hash1','key1');
// Hsetnx :增加一个元素,不能重复
Redis::hsetnx('hash1','key3',3);
// Hmset/hmfet :存储/获取多个
Redis::hmset('hash1',['key4'=>4,'key5'=>5]);
Redis::hmget('hash1',['key4','key5']);
// Hincrby :对值进行累加(不存在就存储)
Redis::hincrby('hash1','key6',6);
// Hkeys :返回hash中所有key
Redis::hkeys('hash1');
// Hvals :返回hash中所有value
Redis::hvals('hash1');
// Hgetall : 返回整个hash表元素
Redis::hgetall('hash1');