博客搬家了,更多干货https://blog.csdn.net/qq_2816...为什么Redis单线程这么快?因为它所有的数据都在内存中,所有的操作都是内存级别的操作,单线程避免了多线程切换带来的性能损失。Redis单线程如何处理这么多客户端并发连接?RedisIO多路复用:redis使用epoll实现IO多路复用,将连接信息和事件放入队列中,依次放入文件事件调度器中。事件分派器将事件分派给事件处理程序。其实对于redis来说,无论多大的并发,都会在redis层排队,一个一个的处理Info:查看redis服务运行信息,分为9个大块,每个块有很多参数。这9块分别是:Server运行环境参数ClientsClient相关信息MemoryServer运行内存统计Persistence持久化信息Stats通用统计Replication主从复制相关信息CPUCPU使用率Cluster集群信息KeySpace键值对统计信息缓存穿透缓存穿透指查询一个根本不存在的数据,缓存层和存储层都不会命中。通常,出于容错性的考虑,如果从存储层找不到数据,则不会写入缓存层。缓存穿透会导致每次都在存储层查询不存在的数据,失去了缓存保护后端存储的意义。解决方法:可以缓存空对象或者设置一个具有特殊含义的字符串表示数据库中不存在这条记录,直接返回缓存层的Bloomfilter。对于恶意攻击,向服务器请求大量不存在的数据会导致缓存磨损。也可以先用布隆过滤器做一个过滤。一般布隆过滤器可以过滤掉不存在的数据,阻止请求发送到后端。当布隆过滤器说一个值存在时,它可能不存在;当它说没有时,它肯定没有。缓存失效因为一大批缓存同时失效,大量的请求可能会同时穿透缓存,直接进入数据库,这可能导致数据库压力过大甚至挂掉。缓存过期时间设置为一个时间段内的不同时间。intexpireTime=newRandom().nextInt(300)+300;bigkeybigkey的缺点:带宽固定,千兆网卡(按字节计算128M/s),假设一个key的值为1M,有1000个并发连接,1s占用的带宽为1000M,会导致网络拥塞。Redis阻塞,单线程处理bigkey可能会导致其他连接排队。在Redis中,一个字符串最大可达512MB,一个二级数??据结构(如hash、list、set、zset)大约可以存储40亿(2^32-1)个元素,但在实践中,如果出现以下两种情况,我会认为是bigkey。String型:它的big体现在单个value很大,一般认为超过10KB就是bigkey。非字符串类型:散列、列表、集合和有序集合。它们的大体现在大量的元素上。一般来说,string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000个(如果超过5000,可以使用拆分的思路)。过期键清除策略Redis对过期键有三种清除策略:被动删除:当读写过期键时,会触发惰性删除策略,直接删除过期键。主动删除:由于惰性删除策略不能保证及时删除冷数据,Redis会定期主动清除一批过期的key)当当前使用的内存超过maxmemory限制时,触发主动清理策略.主动清理策略分为五种allkeys-lru:按照LRU算法删除key,不管数据是否有超时属性,直到释放出足够的空间。allkeys-random:随机删除所有键,直到有足够的空间。volatile-random:随机删除过期的键,直到有足够的空间。volatile-ttl:根据key-value对象的ttl属性,删除最近即将过期的数据。如果不是,则退回到noeviction策略。(Common)noeviction:不会移除任何数据,拒绝所有写操作,并返回客户端错误信息“(error)OOMcommandnotallowedwhenusedmemory”。此时Redis只响应读操作。
