php如何使用Redis常见5种数据类型及应用场景

类型使用方法输出特性场景

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 [
  0 => "yxw"
  1 => "18"
]

适合存储对象,并且可以像数据库中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
array:1 [
  0 => "A"
]

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');

Redis 缓存雪崩,缓存击穿和缓存穿透技术方案总结_余祥伟的博客-CSDN博客 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_34701838

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值