赞
踩
欢迎大家留言指正
redis常见问题汇总
使用sortedset,使用时间戳做score, 消息内容作为key,调用zadd来生产消息,消费者使用zrangbyscore获取n秒之前的数据做轮询处理
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
1.设置热点数据永远不过期:使用mutex,缓存失效的时候(判断拿出来的值为空),不是立即去loaddb,而是先使用缓存工具的某些带成功的返回值操作(例如reids的SETNX或者memcache的add)去set一个mutexkey,当返回成功时,在进行load db操作并回设缓存,否则就重试整个get缓存方法。
缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。
1.缓存数据的过期时间进行错开,防止同一时间大量数据过期现象发生。
2.像缓存穿透一样加锁排列。
3.建立备份缓存,设置A的过期时间,不设置B的过期时间,当缓存A失效的时候,读取缓存B,并且更新A的缓存和B的缓存。
通常使用一个list来实现队列操作,这样有一个小限制,所以的任务统一都是先进先出,如果想优先处理某个任务就不太好处理了,这就需要让队列有优先级的概念,我们就可以优先处理高级别的任务,实现方式有以下几种方式:
方式1最简单,但实际应用比较局限,
方式2是推荐用法,实际应用最为合适
一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。
缺点:
在消费者下线的情况下,生产的消息会丢失
使用专业的消息队列如rabbitmq等。
如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)
可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。
尽可能使用散列表,散列表使用的内存非常少,所以尽可能的将数据抽象到三列表里。
Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
使用keys扫描出所有指定模式的key列表,如果这个redis正在为线上提供服务,这会造成阻塞卡顿,因为redis是单线程的,keys指令会导致线程阻塞一段时间,线上服务停顿,直到指令执行完毕,服务才能恢复,scan命令可以无阻塞提取指定模式的key列表,但可能给会有重复的概率,在客户端去重一次就好,整个执行时间比keys长。(利用scan系列命令(SCAN、SSCAN、HCAN、ZCAN)完成数据迭代)
A、B、C三个节点集群,当B节点失败,那么整个集群会因为缺失B节点范围的槽而不可用。
一个客户端运行了新的命令,添加了新的数据,redis检查内存的使用清理,如果大于maxmemory的限制,则根据设定好的策略进行回收,所以就是内存不断的达到限制边界,不断的会受到边界以内,如果一个内存导致内存被大量占用,不用多久,内存很快就会被超越。
redis内存数据集大小升到一定的大小后,就会实行数据淘汰策略。
connect结束后连接断开,pconnect结束后连接不断开,保持在php-fpm进程中。
redis利用队列把并发访问变成串行访问,消除了传统的数据库的开销
哈希的实现编号可以是ziplist或者hashtable,ziplist编号的哈希对象采用压缩列表作为底层实现,每当有新的键值对要加入到hash对象的时候,程序会先将保存了键的压缩列表节点推入到压缩列表结尾,然后再将保存了值的压缩列表节点推入到压缩列表结尾,因此保存了同一键值对的两个节点总是紧挨在一起,保存的节点在前,保存值得节点在后,先添加到哈希对象的键值对会被放在压缩列表表头,后添加到哈希对象的键值对会被放在压缩列表的结尾。
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系,Redis中可以使用SETNX命令实现分布式锁。
当且仅当 key 不存在,将 key 的值设为 value。若给定的 key 已经存在,则 SETNX 不做任何动作
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
返回值:设置成功,返回 1 。设置失败,返回 0 。
使用SETNX完成同步锁的流程及事项如下:使用SETNX命令获取锁,若返回0(key已存在,锁已存在)则获取失败,反之获取成功为了防止获取锁后程序出现异常,导致其他线程/进程调用SETNX命令总是返回0而进入死锁状态,需要为该key设置一个“合理”的过期时间释放锁,使用DEL命令将锁数据删除。
分布式环境下非常容易出现缓存和数据库之间的一致问题,如果项目对数据是强一致性,那就不要用缓存,只能采用合适的策略来降低缓存和数据库不一致性的概率,而无法保证数据的强一致性,合适的策略包括合适的缓存更新策略,更新数据库后及时更新缓存,缓存更新失败后增加重试机制,例如MQ消息队列
如果你想到其他问题,欢迎留言,稍后我会将您留言的问题整理,以供大家学习参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。