我一直在阅读一些Redis文档,并在http://try.redis-db.com/上尝试教程。到目前为止,我看不出Redis和Velocity或企业库缓存框架等缓存技术有什么不同

实际上,您只是使用唯一键将对象添加到内存中的数据存储中。似乎没有任何关系语义……

我错过了什么?


当前回答

不,Redis不仅仅是一个缓存。

像缓存一样,Redis存储键=值对。但与缓存不同的是,Redis允许你对值进行操作。Redis中有5种数据类型-字符串,集,散列,列表和排序集。每种数据类型都公开各种操作。

理解Redis的最好方法是为应用程序建模,而不考虑如何将其存储在数据库中。

假设我们想要构建StackOverflow.com。为了保持简单,我们需要“问题”、“答案”、“标签”和“用户”。

建模问题,用户和答案

每个对象都可以被建模为一个Map。例如,一个Question是一个包含字段{id, title, date_asked, votes, asked_by, status}的映射。类似地,一个Answer是一个包含字段{id, question_id, answer_text, answered_by, votes, status}的映射。类似地,我们可以对用户对象建模。

这些对象中的每一个都可以直接存储在Redis中作为哈希。要生成唯一的id,可以使用atomic increment命令。就像这样

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

处理选票

现在,每当有人给一个问题或答案投票时,你只需要这样做

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

首页问题列表

接下来,我们希望存储要显示在主页上的最新问题。如果您正在编写一个。net或Java程序,您可以将问题存储在一个List中。事实证明,这也是在Redis中存储它的最佳方式。

每当有人问一个问题,我们就把它的id添加到列表中。

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

现在,当你想渲染你的主页时,你问Redis最近的25个问题。

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

现在你有id,检索项目从Redis使用管道,并显示给用户。

按标签提问,按投票排序

接下来,我们要检索每个标记的问题。但是SO可以让你在每个标签下看到投票最多的问题,新问题或未回答的问题。

为了建模,我们使用了Redis的排序集功能。排序集允许您将分数与每个元素关联起来。然后,您可以根据它们的分数检索元素。

让我们继续为Redis标签执行此操作

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

我们在这里做了什么?我们将问题添加到一个排序集,并将分数(投票数)关联到每个问题。每当一个问题被点赞,我们就会增加它的分数。当用户点击“带有Redis标签的问题,按投票排序”时,我们只需要做一个zrevrange,就能得到最热门的问题。

实时提问,不刷新页面

最后,一个额外的功能。如果您一直打开问题页面,当有新问题添加时,SO会通知您。Redis如何在这里提供帮助?

Redis采用“发布-订阅”模式。您可以创建通道,例如“channel_questions_tagged_redis”。然后将用户订阅到特定的频道。当添加新问题时,您将向该频道发布消息。所有用户都将收到该消息。你将不得不使用网络技术,如网络套接字或comet,以实际传递消息到浏览器,但Redis帮助你在服务器端所有管道。

持久性、可靠性等。

与缓存不同,Redis将数据持久化在硬盘上。您可以使用主从设置来提供更好的可靠性。要了解更多,请访问这里的持久性和复制主题- http://redis.io/documentation

其他回答

它不仅仅是键值缓存,它是键数据结构缓存。 Redis不仅是缓存,也是一个数据存储。写入缓存的内容也会写入磁盘。这样我们就可以进行备份。这允许我们重新启动缓存节点。如果我们重新启动它们,我们的缓存节点将预先填充备份。我们可以重新启动整个集群。但是在Memcached中,当Memcached节点发生故障或重新启动时,存储在该节点上的所有密钥都会丢失 Redis也被用作消息队列

另外,Redis还有缓存之外的功能。基于最新的Redis文档(https://redis.io/docs/modules/), Redis有一些外部模块,支持不同类型的任务,如:

Redis搜索,全文搜索功能 Redis Graph,在Redis之上的图形数据库 Redis时间序列模块,将时间序列数据结构添加到Redis。 复述,人工智能, Redis的神经网络,Redis的神经网络模块 等。

就我个人而言,我使用Redis作为消息队列,使用芹菜作为Django REST框架应用程序,而不是在生产中缓存。

不,Redis不仅仅是一个缓存。

像缓存一样,Redis存储键=值对。但与缓存不同的是,Redis允许你对值进行操作。Redis中有5种数据类型-字符串,集,散列,列表和排序集。每种数据类型都公开各种操作。

理解Redis的最好方法是为应用程序建模,而不考虑如何将其存储在数据库中。

假设我们想要构建StackOverflow.com。为了保持简单,我们需要“问题”、“答案”、“标签”和“用户”。

建模问题,用户和答案

每个对象都可以被建模为一个Map。例如,一个Question是一个包含字段{id, title, date_asked, votes, asked_by, status}的映射。类似地,一个Answer是一个包含字段{id, question_id, answer_text, answered_by, votes, status}的映射。类似地,我们可以对用户对象建模。

这些对象中的每一个都可以直接存储在Redis中作为哈希。要生成唯一的id,可以使用atomic increment命令。就像这样

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

处理选票

现在,每当有人给一个问题或答案投票时,你只需要这样做

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

首页问题列表

接下来,我们希望存储要显示在主页上的最新问题。如果您正在编写一个。net或Java程序,您可以将问题存储在一个List中。事实证明,这也是在Redis中存储它的最佳方式。

每当有人问一个问题,我们就把它的id添加到列表中。

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

现在,当你想渲染你的主页时,你问Redis最近的25个问题。

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

现在你有id,检索项目从Redis使用管道,并显示给用户。

按标签提问,按投票排序

接下来,我们要检索每个标记的问题。但是SO可以让你在每个标签下看到投票最多的问题,新问题或未回答的问题。

为了建模,我们使用了Redis的排序集功能。排序集允许您将分数与每个元素关联起来。然后,您可以根据它们的分数检索元素。

让我们继续为Redis标签执行此操作

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

我们在这里做了什么?我们将问题添加到一个排序集,并将分数(投票数)关联到每个问题。每当一个问题被点赞,我们就会增加它的分数。当用户点击“带有Redis标签的问题,按投票排序”时,我们只需要做一个zrevrange,就能得到最热门的问题。

实时提问,不刷新页面

最后,一个额外的功能。如果您一直打开问题页面,当有新问题添加时,SO会通知您。Redis如何在这里提供帮助?

Redis采用“发布-订阅”模式。您可以创建通道,例如“channel_questions_tagged_redis”。然后将用户订阅到特定的频道。当添加新问题时,您将向该频道发布消息。所有用户都将收到该消息。你将不得不使用网络技术,如网络套接字或comet,以实际传递消息到浏览器,但Redis帮助你在服务器端所有管道。

持久性、可靠性等。

与缓存不同,Redis将数据持久化在硬盘上。您可以使用主从设置来提供更好的可靠性。要了解更多,请访问这里的持久性和复制主题- http://redis.io/documentation

实际上,相对数据表示(或任何类型的数据表示)和数据库角色(缓存、永久持久化等)之间没有依赖关系。

Redis很适合缓存,这是事实,但它不仅仅是一个缓存。它是高速全内存数据库。它确实在磁盘上持久化数据。它不是关系型的,而是键值存储。

我们在生产中使用它。Redis帮助我们构建每秒处理数千个请求的软件,并在整个自然生命周期内保存客户业务数据。

Redis支持的数据结构,如字符串,哈希,列表,集,排序集与范围查询,位图,超对数,地理空间索引与半径查询和流。Redis具有内置复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster提供高可用性和自动分区。

用python实现

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/