27、redis的使用注意问题

学习目标:

1、简单总结一下redis的注意问题

2、掌握主从搭建

学习过程:

1、时常关注swap:

Redis设置合理的maxmemory,保证机器有20%~30%的闲置内存。

修改/etc/sysctl.conf,设置vm.overcommit_memory=1,防止极端情况下,会造成fork失败,在前面安装redis时候说过了,这里旧不再啰嗦了。

如果Linux>3.5,vm.swapniess=1,否则vm.swapniess=0,从而实现如下两个目标:

物理内存充足时候,使Redis足够快。
物理内存不足时候,避免Redis死掉(如果当前Redis为高可用,死掉比阻塞更好)。
在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制内存超出期望大小。

当实际内存超出 maxmemory 时,Redis 提供了几种可选策略 (maxmemory-policy) 来让用户自己决定该如何腾出新的空间以继续提供读写服务。

noeviction 不会继续服务写请求 (DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。

volatile-lru 尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。

volatile-ttl 跟上面一样,除了淘汰的策略不是 LRU,而是 key 的剩余寿命 ttl 的值,ttl 越小越优先被淘汰。

volatile-random 跟上面一样,不过淘汰的 key 是过期 key 集合中随机的 key。

allkeys-lru 区别于 volatile-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合。这意味着没有设置过期时间的 key 也会被淘汰。

allkeys-random 跟上面一样,不过淘汰的策略是随机的 key。

volatile-xxx 策略只会针对带过期时间的 key 进行淘汰,allkeys-xxx 策略会对所有的 key 进行淘汰。如果你只是拿 Redis 做缓存,那应该使用 allkeys-xxx,客户端写缓存时不必携带过期时间。如果你还想同时使用 Redis 的持久化功能,那就使用 volatile-xxx 策略,这样可以保留没有设置过期时间的 key,它们是永久的 key 不会被 LRU 算法淘汰。

1、redis的key的命名需要定下规范,很多公司redis的公用的,给很多个项目同时使用,最好公司能够有统一的命名规范,比如key的命名规范:项目名称_模块名称_id。

2、绝对杜绝大key,也就是放入value的值不能太大,比如String最好不要大于10K,如果不需要长驻在内存的,都必须要设置过期时间,不然不断累积,会越来越多。集合里面的如果有几个大key,建议使用scan(比如hsan)查询出来后追个删除

redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。

删除指令 del 会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包含了千万元素的 hash,那么删除操作就会导致单线程卡顿。

业务开发人员一定要注意过期时间,如果有大批量的 key 过期,要给过期时间设置一个随机范围,而不宜全部在同一时间过期,分散过期处理的压力。

# 在目标过期时间上增加一天的随机时间
redis.expire_at(key, random.randint(86400) + expire_ts)

3、禁止使用一些造成卡顿的命令:keys  flushdb save等

4、合理的使用批量操作,有很多命令都支持批量操作多个的,可以一次性写完这个命令,如果是客户端可以使用管道 (Pipeline)技术

你可能感兴趣的:(27、redis的使用注意问题)