本次记录我对于set数据类型的学习内容。
set数据类型与结构
set和list队列类似,都可以存储多个字符串元素的集合。但是list里面可以有重复的元素,而set里不允许有重复的元素。并且,set里面的元素没有顺序概念,每个元素也没有下标(不存在这个概念) 。
set数据类型的实现
set类型根据数据的长度分为两种储存模式,即其内部编码有两种:
1.当集合的元素个数小于等于512个的时候,redis会用intset格式来实现对数据的存储。
2.当集合的元素过多时,redis使用hashtable实现数据的存储。
set类型的基本语法注释
$redis = app('redis.connection');
$redis->sadd('set1','a') ;
$redis->sadd('set1','b') ;
$redis->sadd('set1','c') ; //向集合中添加元素
$redis->srem('set1','a') ; //移除指定集合中的某个元素
$redis->spop('set1'); //返回指定集合当前首元素
$redis->sadd('set2',"o") ;
$redis->smov('set1','set2','b') ;//将集合set1中的b元素移动到set2中
$redis->scard('set1') ; //返回指定集合的元素个数
$redis->sismember('set1','e'); //判断指定元素是否是指定集合中的元素 返回true/false
$redis->smembers('set1') ; //取出集合内容
$redis->sinter('set1','set2') ; //求并集
$redis->sunion('set1','set2') ; //求交集
$redis->sdiffstore('set1','set2') ; //求补集
$redis->set('ooo',0) ;
$redis->sinterstore('ooo','set1') ; //将set1中的内容copy到'ooo'中,并将ooo的数据类型转化为集合
$redis->sinterstore('ooo',['set1','set2']) ; //将set1和set2中相同的元素copy到ooo中
$redis->srandmember('set1') ; //随机返回一个元素
set类型的应用场景
1.抽奖、秒杀
sRandMember、sPop命令
这两个命令功能非常相似,都是从集合中返回一个元素值。不同的是,sRandMember不会从集合中删除返回的元素,但是sPop会删除。这两个命令可以分别实现不同的抽奖算法。
比如,集合中有100个元素,值从数字1到数字100.我们定义抽到的是数字1的话,即表示中奖。
使用sRandMember的话,不管之前抽过多少次,下次抽中的概率都是1%。而使用sPop的话,则每次抽中的概率都不一样。第一个人抽中概率是1%,当第一个人没抽中的话,第二个人抽中概率就是1/99,以此类推。
public function lottery()
{
$key = "lottery";
$type = 1;
$stand = rand(1,Redis::scard("lottery"));//概率
if ($type == 1) {
$number = Redis::sRandMember($key);
} else {
$number = Redis::sPop($key);
}
return $number < $stand; //控制概率
}
**redis慢查询**
慢查询,顾名思义 就是很慢的查询。具体什么速度之外属于慢查询,我们可以通过修改redis的参数来进行手动设置。
慢查询日志,就是系统在命令执行前后计算每条命令执行的时间,当时间查过预定阈值的时候,就被记录该查询的相关信息(查询时间,总耗时,命令详情等[查询语句])。那么被记录下来的自然就是慢查询。(和mysql慢查询同理)
当客户端发送命令,redis服务器接收命令,命令被排进执行队列中,当执行完对应命令之后,进行结果的返回。
[upl-image-preview url=https://wyz-xyz.oss-cn-huhehaote.aliyuncs.com/2021-01-19/1611071158-455339-9-5s-at-xmsm4aex4f-mo.png]
**如何配置慢查询相关参数:**
1.配置文件redis.conf
2.参数
lowlog-log-slower-than:指定执行时间超过多少微秒(1秒等于1000000微秒) 的命令请求会被记录到日志上
//设置为0是表示不做限制
slowlog-max-len:指定服务器最多保存多少条慢查询操作
slowlog get //获取慢查询日志命令
3.信息字段对应:
① 标识id ② 时间戳,执行时间 ③命令运行时间 ④ 查询命令
[upl-image-preview url=https://wyz-xyz.oss-cn-huhehaote.aliyuncs.com/2021-01-19/1611071914-301926-o7hoktjkao8hvh13zfq.png]