本文介绍了五个使用Redis使用时的注意事项。如果你在使用或者考虑使用Redis,你可以学习一下下面的一些建议,避免遇到以下提到的问题。
一、配置相关注意事项
1、涉及到内存的单位注意添加 b
1k => 1000 bytes
1kb => 1024 bytes
2、daemonize为 yes
后台运行时,记得配置 pidfile
daemonize yes
pidfie /var/run/redis.pid
3、配置了最大内存 maxmemory
之后记得配置过期删除策略
maxmemory 5gb
maxmemory-policy volatile-lru
## 补充
# volatile-lru -> 根据LRU算法生成的过期时间来删除。
# allkeys-lru -> 根据LRU算法删除任何key。
# volatile-random -> 根据过期设置来随机删除key。
# allkeys->random -> 无差别随机删。
# volatile-ttl -> 根据最近过期时间来删除(辅以TTL)
# noeviction -> 谁也不删,直接在写操作时返回错误。
4、Redis 慢查询
,只计算命令运行的实际时间
## 配置慢查询
# 单位是微妙
slowlog-log-slower-than 10000
# 服务器内存最多保存多少条慢查询日志,先进先出的方式覆盖
slowlog-max-len 128
## 查看慢查询
SLOWLOG GET
## 慢查询清理
slowlog reset
## slowlog总数
SLOWLOG LEN
## slowlog get 1, 1 是得到一条 slowlog
1) (integer) 13 // slowlog唯一编号id
2) (integer) 1466499110 // 查询的时间戳
3) (integer) 41349 // 查询的耗时(微妙)
4) 1) "scan" // 查询命令,slowlog最多保存前面的31个key和128字符
2) "0"
3) "MATCH"
4) "*"
5) "COUNT"
6) "10000"
5、Redis 禁用某些命令
(error) ERR unknown command 'CONFIG'
## 上面的错误就是由于配置了如下命令导致的
rename-command config ""
## 也可以将其改名成你自己想改成的名字,别人不能猜到的
rename-command config "lcconfig"
二、使用注意事项
1、使用key值前缀来作命名空间
虽然说Redis支持多个数据库(默认32个,可以配置更多),但是除了默认的0号库以外,其它的都需要通过一个额外请求才能使用。所以用前缀作为命名空间可能会更明智一点。
另外,在使用前缀作为命名空间区隔不同key的时候,最好在程序中使用全局配置来实现,直接在代码里写前缀的做法要严格避免,这样可维护性实在太差了。
2、创建一个类似 ”registry” 的key用于标记key使用情况
为了更好的管理你的key值的使用,比如哪一类key值是属于哪个业务的,你通常会在内部wiki或者什么地方创建一个文档,通过查询这个文档,我们能够知道Redis中的key都是什么作用。
与之结合,一个推荐的做法是,在Redis里面保存一个registry值,这个值的名字可以类似于 __key_registry__ 这样的,这个key对应的value就是你文档的位置,这样我们在使用Redis的时候,就能通过直接查询这个值获取到当前Redis的使用情况了。
3、注意垃圾回收
Redis是一个提供持久化功能的内存数据库,如果你不指定上面值的过期时间,并且也不进行定期的清理工作,那么你的Redis内存占用会越来越大,当有一天它超过了系统可用内存,那么swap上场,离性能陡降的时间就不远了。所以在Redis中保存数据时,一定要预先考虑好数据的生命周期,这有很多方法可以实现。
比如你可以采用Redis自带的过期时间为你的数据设定过期时间。但是自动过期有一个问题,很有可能导致你还有大量内存可用时,就让key过期去释放内存,或者是内存已经不足了key还没有过期。
如果你想更精准的控制你的数据过期,你可以用一个ZSET来维护你的数据更新程度,你可以用时间戳作为score值,每次更新操作时更新一下score,这样你就得到了一个按更新时间排序序列串,你可以轻松地找到最老的数据,并且从最老的数据开始进行删除,一直删除到你的空间足够为止。
4、设计好你的Sharding机制
Redis目前并不支持Sharding,但是当你的数据量超过单机内存时,你不得不考虑Sharding的事(注意:Slave不是用来做Sharding操作的,只是数据的一个备份和读写分离而已)。
所以你可能需要考虑好数据量大了后的分片问题,比如你可以在只有一台机器的时候就在程序上设定一致性hash机制,虽然刚开始所有数据都hash到一台机器,但是当你机器越加越多的时候,你就只需要迁移少量的数据就能完成了。
5、不要有个锤子看哪都是钉子
当你使用Redis构建你的服务的时候,一定要记住,你只是找了一个合适的工具来实现你需要的功能。而不是说你在用Redis构建一个服务,这是很不同的,你把Redis当作你很多工具中的一个,只在合适使用的时候再使用它,在不合适的时候选择其它的方法。