写在前面:本系列是我学习《深入理解Redis》的学习笔记。
文章目录
- redis键
- redis键模式
- 键过期
- 键的注意事项
- 时间复杂度
- redis数据结构
- 字符串
- 哈希
- 文末总结
redis键
为了更有效地在应用程序中使用 Redis ,我们需要理解 Redis 是如何存储键的,并了解用于操作 Redis 实例中键空间的命令。
Redis 的灵活性允许各种不同的键构造和存储方案。 Redis 性能和可维护性的优劣取决于Redis 数据库键的设计与构造。
一种良好而又通用的实践是在设计 Redis 键时至少起草一份粗略概要,用于描述存入 Redis中的信息及采用何种 Redis 结构的初步想法
redis键模式
Redis 本身并没有模式检测或者验证的功能,不过我们仍然可以通过使用 EXISTS和 TYPE 这些 Redis命令实现一些基本的验证。如果应用需要明确特定类型的 Redis 键是否存在于实例中,可以通过使用 EXISTS 命令,随后使用 TYPE 命令确认该键是否是期望的 Redis 数据结构。
如果 Redis 应用会在不同的系统和组织中共享 ,那么为应用程序添加额外的验证逻辑层将十分有用。
另一种验证 Redis 键模式的方法是为 Redis 应用引人具体的单元测试,用来测试边界条件、模式键语法和结构,还有每个验证过的键所期望的数据结构。
我个人比较喜欢在测试的时候敲定这些环境变量,写在代码里边感觉有点肥。
Redis 键的命名不应当有任何神秘色彩:
对于一个简单的图书应用来说,基于文本的 Redis 模式示例如下所示:
强烈建议不要在生产环境的应用中使用 Redis KEYS 命令,这是因为 Redis 需要遍历数据库中每一个键。采用一致的命名约定及诸如集合、哈希或者有序集合这样的数据结构。
将所有体裁的键存储在 books:genres 集合中才是明智之举,这样应用程序就可以像使用索引一样,使用 SMEMBERS 命令快速获取所有图书体裁的键:
127.0.0.1 : 6379> SMEMBERS books:genres
1 ) ” books:format:ebook ”
2 ) ” books:genre:popular-fiction ”
3 ) ” books:format:paperback”
4 ) ” books:genre:sci-fiction ”
5 ) ” books:sales-rank"
键过期
Redis的一个极其重要的特性是能够为键设置过期时间。
通过自动化删除过期键, Redis应用程序能够更好地管理数据库所使用的内存大小和使用情况,同时减少用于追踪数据中每个键的客户端代码量。
本部分后面再详谈,保留点神秘感。
键的注意事项
1)Redis 键的大小应该受到限制,自己把控。
2)Redis KEYS 命令应当在万不得已时使用,因为它会对 Redis 实例造成长时间的阻塞,甚至会导致 Redis 存耗尽。
3)在使用 SCAN 和相关的迭代器命令时需要注意的是,如果一个元素在从头到尾的迭代中不是始终存在,那么SCAN 令并不保证该元素能够返回。
时间复杂度
Salvatore Sanfilippo 有意将每个 Redis 命令的最坏算法性能整理成文放在 Redis 网站上。
传送门
找不到不要紧,过两天在我的博客里就找得到了。不过各位还得关注着点嘿嘿。
redis数据结构
字符串
Redis 值中最基本的数据结构为字符串,也就是和 Redis 键相同的数据类型。使用 Redis 最简单的方式就是字符串对字符串的键值存储。
Redis 字符串中最基础的 GET 和 SET 命令是 O(1)操作。这使得 Redis 作为简单的键值存储极其快速。
对于大多数 Redis 字符串操作来说,访问和采集命令的时间复杂度要么是 O(1),要么是O(n)。其中 O(n)字符串命令大多是块命令,例如 GETRANGE 和 MSET。
哈希
在Redis 中,所有的哈希值必须是 Redis 字符串,并且有唯一的字段名。字段的值是简单的 Redis 字符串,通过调用 Redis的 HGET或 HMGET 令, 同时传入合适的 Redis 键和一到多个字段参数,就能返回字段的值。对于大多数使用场景来说,Redis 哈希为 HSET、HGET 命令提供了很棒的 O(1)性能。与字符串块命令类似,哈希的HGETALL、HMSET、HMGET 、HKEYS、HVALS 命令均为O(n)。 如果哈希非常小,那么返回所有哈希键和值的 HGETALL和HMGET 命令之间没有十分明显差异。当哈希中键和值不断增长时,两者之间的差异可以让应用程序大不相同。
列表、集合、有序集合等数据结构都将在“Redis复杂度分析”中详谈。
文末总结
1)任何 Redis 应用程序都有两个关键部分,即键和这些键上存储的值。对大多数 Redis 解决方案来说,键的命名设计至关重要。
2)所有 Redis 数据结构的性能,以及对应的写和访问命令,都以大O号的形式进行了评估。
好像讲的不多,但是我觉得挺丰富哈哈哈。