wordpress网站修改域名,开网店怎么找货源啊,上海网站推广策划,南宁的公司有哪些目录标题 Key命名设计#xff1a;可读性、可管理性、简介性Value设计#xff1a;拒绝大key控制Key的生命周期#xff1a;设定过期时间时间复杂度为O(n)的命令需要注意N的数量禁用命令#xff1a;KEYS、FLUSHDB、FLUSHALL等不推荐使用事务删除大key设置合理的内存淘汰策略使… 目录标题 Key命名设计可读性、可管理性、简介性Value设计拒绝大key控制Key的生命周期设定过期时间时间复杂度为O(n)的命令需要注意N的数量禁用命令KEYS、FLUSHDB、FLUSHALL等不推荐使用事务删除大key设置合理的内存淘汰策略使用批量操作提升操作效率 Key命名设计可读性、可管理性、简介性
规范建议使用冒号即:进行分割拼接因为很多Redis客户端是根据冒号分类的。比如有几个Keyapps:app:1、apps:app:2和apps:app:3。Redis Desktop Manager能自动归类到apps目录下。如下图所示
Value设计拒绝大key
规范建议String类型的Value控制在10KB范围以内。这是因为Redis随着Value不断增长在超过10KB后有一个非常奇妙的性能拐点如下图所示 假设内网带宽是千兆网卡即1000MB。假设你的Redis中有一个大Key的Value长度是10KB并且这个Key的QPS是10W那么这一个Key就会把带宽打满10KB*1000001000MB。
控制Key的生命周期设定过期时间
尽可能对每一个Key都设置过期时间这个是非常有益处的。否则你想象一下半年以后一年以后你的Redis集群中有上百G甚至更多的数据谁都不知道这些数据哪些是有价值的哪些已经成为垃圾。如果你的每个Key都设置了过期时间那么就不会出现这个问题了。集群在运行过程中或自动淘汰那些已经不再使用的垃圾缓存数据。
时间复杂度为O(n)的命令需要注意N的数量
这个建议的意思是以List类型为例LINDEX、LREM等命令的时间复杂度就是O(n)。也就是说随着List中元素数量越来越多这些命令的性能越来越差。而Redis又是单线程的如果出现一个慢命令会导致在这个命令之后执行的命令耗时也会增长这是使用Redis的大忌。
事实上这也是JDK8为什么要对HashMap进行链条冲突优化当entry数量不少于64时如果冲突链表长度达到8就会将其转成红黑树。因为链表长度越长性能会越来越差。
禁用命令KEYS、FLUSHDB、FLUSHALL等
这些命令应该在搭建Redis环境的时候就要禁用掉在config配置文件中通过rename-command禁用。FLUSHDB和FLUSHALL这两个命令会清空数据后果可想而知。
至于KEYS命令还记得那个由于使用这个命令导致几百万损失的案例嘛而且这个命令的不当使用导致的损失会随着你的业务并发越大价值越大而导致损失越大
不推荐使用事务
如果你有使用关系式数据库的经验那么“Redis在事务失败时不进行回滚而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。以下是官方给出的Redis不支持这种做法的优点
Redis命令只会因为错误的语法而失败或是命令用在了错误类型的键上面这也就是说从实用性的角度来说失败的命令是由编程错误造成的而这些错误应该在开发的过程中被发现而不应该出现在生产环境中。因为不需要对回滚进行支持所以 Redis 的内部可以保持简单且快速。
删除大key
如果Redis中有大key那么删除可能会产生毛刺。当然如果你的Redis是4.0以上并使用UNLINK命令删除key那么不会有什么问题。那Redis4.0以下该怎么删除大key呢
如果是hash结构那么先利用scan命令遍历得到一批field然后利用hdel命令进行删除
如果是list结构那么先利用llen得到list中元素总个数然后利用ltrim命令批量删除
如果是set结构那么先利用sscan命令遍历得到一批key然后利用srem命令批量删除
如果是sorted set结构那么先利用zscan命令遍历得到一批key然后利用zrem命令批量删除如果是string结构呢没有什么很好的办法
设置合理的内存淘汰策略
Redis的内存剔除策略maxmemory-policy有volatile-lru、volatile-random、volatile-ttl、allkeys-lru、allkeys-random、noeviction。命名以volatile开头的3个策略主要作用于带有失效时间属性的key命名以allkeys开头的2个策略作用于所有key最后一个策略noeviction不会剔除任何数据只是当内存使用满了以后拒绝所有写入操作并返回客户端错误信息(error) OOM command not allowed when used memory此时Redis只响应读操作。
事实上每种方案都有一定的局限性所以我们除了根据自己的业务选择合适的剔除策略以后还需要对Redis使用的内存进行监控主要监控info中info Memory段的used_memory_peak即Redis使用内存峰值建议设置其告警阈值为maxmemory的90%。
使用批量操作提升操作效率
批量命令主要分为两类原生命令和非原生命令
原生命令包括例如mget、mset、hmget、hmset、LPUSH key value集合等。非原生命令包括Pipeline。
合理使用这些命令对操作性能提升是极其巨大的尤其在单机Redis或者Sentinel模式下。因为这两种架构不涉及跨SlotRedis集群性能也有提升但是使用会受到一些限制例如不支持跨Slot的操作等官方并不太建议在Rdis集群环境下使用Pileline和multi key操作。
当然批量虽好但不要贪多。俗话说的好贪多嚼不烂。一般不要超过1000具体限制还与操作数据大小有关。