很惭愧,做过一些网站、后台服务,居然一直都没用过 Redis(话外音:如果作为一个 iOS 开发,确实用不到 Redis)。最近有个小项目,用起了 Redis,觉得很顺手。于是给自己和其他像我一样的初学者写这么一篇初探。
Redis 是什么?
Redis 是什么,从这个名字着手即可。Redis,即 REmote DIctionary Server,这下容易理解了,它是一个远程词典服务器,词典是用来干吗的,当然是用来存数据的。
Key-Value Store
既然是存数据的,为何我不用 SQL 或 NoSQL 数据库,Redis 有什么特别之处吗?这里就需要强调一下它的特性了:Redis 是一个 Key-Value store,用起来非常简单。
拿它与 SQL 数据库来比吧,如果你不是一个 DBA,常常与 SQL 指令打交道的话,我想你已经对 SELECT * FROM XXX、INSERT XXX INTO YYY 之类的语句已经陌生了,更不要提那些还要事先建表等操作了。
Redis 作为一个 Key-value store,简单到不可思议,启动 redis-cli,使用 set 和 get,这就是它的最基础的操作:
127.0.0.1:6379> set "Hello" "world"
OK
127.0.0.1:6379> get "Hello"
"world"
简直比 Python shell 还要简单好用。
Everything is in memory
Redis 也是主要基于内存的一个数据库,因此速度非常快。基于内存,并不意味着它不能持久化到硬盘里,Redis 依然提供了持久化到硬盘的方式——并且支持两种格式,这两种格式都非常精简。
既然是基于内存,很多人会问:会不会很占用内存?会,或者不会。这主要看你怎么用它了,根据官方文档所示:100 万小型的字符串键值对存储,基本上占用内存在 100M 左右。因此,它非常适合用来做缓存系统。
Redis 有「database」吗?
前面那个小例子,会让人觉得 Redis 非常好用,同时也有了一个疑问:Redis 能不能定义独占的数据库?毕竟 SQL 数据库这种是天然要建立一个 database、database 再建立各种 table,才能往里面填数据的。
Redis 也有,它默认提供了 16 个数据库,分别编号为:0 ~ 15。默认 redis-cli 打开后连接的是 0 号数据库,可以用 select 命令选择其他的:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>
那么什么情况下需要用到不同的数据库呢?这个,就看自己了,如果你的 instance 上只有一个 App 要用到 redis,这个 App 的业务也没复杂到命名冲突,那么应该也用不到多数据库。
Redis 的简单应用场景
讲了以上三点,差不多明白 Redis 是个什么回事了,它除了可以用做缓存系统,可以用作一些异步任务的 message broker,比如 Python 圈会用它和 Celery 配合。
事实上,只要一个系统需要临时存储数据,或者全局存储临时数据,那么这项任务完全可以交给 Redis 来搞。临时存储一个数据,比如某某 API 的请求计数、某个 Task 的执行结果,这些非用户数据相关的就可以完全存在 Redis 里面。
如果 Web App 是基于 Django 的,那么可以使用 django-redis 这个库,然后就可以用 cache 来操作数据,常用的几个是:
根据通配符返回所有键
>>> from django.core.cache import cache
>>> cache.keys("foo_*")
["foo_1", "foo_2"]
根据通配符生成 generator,方便遍历:
>>> cache.iter_keys("foo_*")
<generator object algo at 0x7ffa9c2713a8>
>>> next(cache.iter_keys("foo_*"))
"foo_1"
根据通配符删除所有符合条件的值:
>>> cache.delete_pattern("foo_*")
总结
Redis 是一个非常有用的工具,我觉得不管是大应用还是小应用,都可以从中获益。这还只是我刚刚接触它,相信接下去我会更加明白它的用武之地~
受教了~博客也很漂亮
想联系您一下,可否给个联系方式呢
看右上角的「关于」
一直听其名,但从未用过,看了这篇文章突然想捣殇一番