ReDisaster 2019-03-21
Redis Key 的命名策略
Redis 是 K-V 形式的缓存数据库,每一个需要缓存的 Object 都需要唯一的 Key 来标识。但是,我们日常在做开发的时候,经常会出现一个公司或者部门之间共用一个 Redis 集群的情况。所以,这就有可能会造成 Key 冲突,引发数据被覆盖的问题(即使是同一个部门,也可能存在不同的研发人员使用了同名的 Key)。
一个项目中,相似的业务是很常见的,所以,如果不同的研发人员使用了同名的 Key,就会导致系统的 bug。同时,如果不同的项目组在共同使用一个 Redis 集群,也会发生这样的问题。例如:
127.0.0.1:6379> set name qinyi OK # 同一个项目中的不同业务使用了同名的 key (不同的研发人员共同开发造成) 127.0.0.1:6379> lpush name qinyi imooc (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379>
这样做可以大概率的避免不同的项目引起的 Key 冲突问题,但是,仍然不能避免同一个项目中的不同业务。例如:
# a、b 两个项目在使用 Redis 时,各自以项目的名称为 Key 的前缀 127.0.0.1:6379> set a-name qinyi OK 127.0.0.1:6379> set b-name imooc OK # 仍不能避免同一个项目中的不同业务使用了同名的 key 127.0.0.1:6379> lpush a-name qinyi imooc (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379>
这种命名 Key 的方式是比较好的,相比于上一种方式,多增加了一个时间戳标识。这里的含义就是与不同的开发人员定义相同时间戳的概率很低很低。具体时间戳的精度可以根据业务的实际情况选择,比如:天、小时等等。例如:
# Key 中添加天级的时间戳来避免 Key 冲突的问题 127.0.0.1:6379> set a-name-20190314 qinyi OK 127.0.0.1:6379> lpush a-name-20190315 qinyi imooc (integer) 2 127.0.0.1:6379>
过期时间的设定
在使用 Redis 时,绝大多数情况都需要给 Key 设定过期时间,这个是非常有必要的。原因如下:
所以,在保存 KV 时,最好是设定过期时间。例如:
127.0.0.1:6379> set name qinyi OK 127.0.0.1:6379> expire name 30 (integer) 1 127.0.0.1:6379> ttl name (integer) 25 127.0.0.1:6379>
关于 Redis 设定过期时间(这里包含过期键的删除)需要知道:
数据结构的选择
Redis 常用的数据结构一共有五种:string、hash、list、set、zset(sorted set)。可以发现,大多数场景下使用 string 都可以去解决问题。但是,这并不一定是最优的选择。下面,简单说明下它们各自的适用场景:
另外,Redis 还提供了一些特别的数据结构,用于一些特殊的场景。例如:Geo、HyperLogLog
持久化机制的选择
Redis 提供了两种持久化机制:RDB 和 AOF。
关于这两种持久化方式的优点不做解释,可以根据其实现形式得出结论。下面,分析下它们各自的缺点。
RDB 的缺点
AOF 的缺点
总结:二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(AOF),还是愿意写操作频繁的时候,不启用备份来换取更高的性能。
不要使用 Redis 存储单 Key 大数据
这里所说的大数据,不是说不使用 Redis 存储更多的数据,而是说单个 KV 很大的情况。这里最核心的原因是:Redis 是单进程单线程的应用。这种工作方式在操作过程上避免了线程切换的耗时,而且不需要考虑线程安全,无需获取锁、释放锁等操作,是非常简单、直接的。但是:
作者:张勤一
链接:https://www.imooc.com/article/283155
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作