天天看点

Redis学习笔记二:基本命令与使用场景

作者:Grey

原文地址: Redis学习笔记二:基本命令与使用场景

参考:

Redis学习笔记一:安装和配置

https://www.redis.com.cn/redis-vs-memcached.html

其中有一个比较重要的区别是关于其提供的数据结构区别

Memcached

在其数据结构中仅使用字符串和整数。因此,您保存的所有内容都可以是字符串或整数。它很复杂,因为对于整数,您可以做的唯一数据操作是添加或减去它们。如果需要保存数组或对象,则必须先将它们序列化然后保存。要阅读它们,您需要取消序列化。

Redis

具有更强大的数据结构,它不仅可以处理字符串整数,还可以处理二进制安全字符串,二进制安全字符串列表,二进制安全字符串集和有序集。

关于Redis的数据结构:https://zhuanlan.zhihu.com/p/270592490

假设jack这名用户,分别在第6天,第23天,第134天,和第364天登录了系统。

可以执行如下命令:

统计jack登录的天数,直接可以通过:

假设某个电商网站做活动,在某天要派送礼物,假设这个网站有2亿用户,请问应该备货多少礼物比较适合

思路:

首先,可以考虑一下统计整个网站的活跃用户有多少,比如我们设置三天,1号,2号,3号,统计三天登录的用户获得一个近似的活跃用户的数量:

然后通过:

然后求这个destkey中含有的1的数量,即为比较活跃的用户(派发礼物需要准备的礼物数量)

都可以使用Redis的incr方法,这样就可以规避并发下,对数据库的事务操作,完全由redis内存操作代替

参考大量初始化数据

如果需要考虑获取实时数据和历史数据

关于实时数据

pub/sub功能

关于历史消息

三天前(sorted_set)

更早以前(来自数据库)

架构如下:

Redis学习笔记二:基本命令与使用场景

执行顺序

Redis学习笔记二:基本命令与使用场景

示例

watch用法

启动两个redis客户端,redis-client-1,redis-client-2

在redis-client-1中执行:

在redis-client-2中执行:

然后再回到redis-client-1,执行:

此时,在任意客户端执行:

拿到的k1值是aa,说明事务没有更新成功,因为在watch这段时间内,k1的值被修改了。

执行UNWATCH

然后重新执行

k1的值可以正常在事务阶段被修改了。

摘自:http://www.redis.cn/topics/transactions.html

如果你有使用关系式数据库的经验, 那么 “Redis 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。

以下是这种做法的优点:

Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。

因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

有种观点认为 Redis 处理事务的做法会产生 bug , 然而需要注意的是, 在通常情况下, 回滚并不能解决编程错误带来的问题。 举个例子, 如果你本来想通过 INCR 命令将键的值加上 1 , 却不小心加上了 2 , 又或者对错误类型的键执行了 INCR , 回滚是没有办法处理这些情况的。

继续阅读