Caching 我的公司使用memcache作为对象很好,可以';我看不出缓存中需要redis

Caching 我的公司使用memcache作为对象很好,可以';我看不出缓存中需要redis,caching,redis,memcached,Caching,Redis,Memcached,我正在学习redis/memcache,redis显然是更受欢迎的选择。我的问题是关于支持的数据类型。在我的公司,我们使用memcached内置的memcashier库。我们在memcache中购买时存储临时用户数据。我们可以很容易地更新这个对象,因为物品被添加到购物车中,或者更多关于用户的信息被提供。这似乎与redis中的哈希功能相同。我不明白这仅仅是一种基本的字符串数据类型,以及它的功能如何不如散列。如果您使用的是字符串,那没关系,但任何更改都涉及到将数据加载到应用程序中,对其进行解析、修改

我正在学习redis/memcache,redis显然是更受欢迎的选择。我的问题是关于支持的数据类型。在我的公司,我们使用memcached内置的memcashier库。我们在memcache中购买时存储临时用户数据。我们可以很容易地更新这个对象,因为物品被添加到购物车中,或者更多关于用户的信息被提供。这似乎与redis中的哈希功能相同。我不明白这仅仅是一种基本的字符串数据类型,以及它的功能如何不如散列。如果您使用的是字符串,那没关系,但任何更改都涉及到将数据加载到应用程序中,对其进行解析、修改,并将其序列化回Redis/Memcache

这有两个问题:速度慢和非原子性。您可以让两台服务器修改处于不一致状态的同一对象,例如购物车中有两个或多个项目丢失。再说一次,它很慢

使用Redis散列键,您可以自动修改对象的特定字段,而无需将整个对象加载到内存中。而不是读,解析,修改,保存-你只是更新

此外,Redis有许多数据结构,可以创建具有不同属性的非常灵活的数据存储,而Memcache只能存储字符串


顺便说一句,Redis有一个模块,允许您像存储字符串一样存储JSON对象,并直接和原子地操作它们,而无需将它们发送到客户端。有关详细信息,请参阅。

Memcached不支持复杂的数据结构

在redis中,有列表、集合、分类集合、哈希表等。 上面提到的每个数据结构都支持原子地对其一个或多个元素进行变异,而不替换整个数据结构/值

另一方面,Memcached是一个简单的键值存储,这意味着在复杂对象中涉及属性更改的每个操作都是读-修改-写操作。如果您只是盲目地替换对象中的字段,那么您将面临竞争条件和操作原子性问题的风险(使用CAS可以避免这些问题)

如果库对这种复杂性进行了抽象,那就太好了,但它仍然不如只对相关字段进行变异有效


这个答案只与您的用例有关。Redis与memcached相比还有许多其他优点,这些优点与这个问题无关。

有问题吗?