NoSQL数据库(三)01-Redis进阶与实战——redis事务命令与错误处理、事务中的watch命令
第二章 redis进阶与实战
进阶
事务
举个例子: 在微博中,用户之间是“关注”和“被关注”的关系。如果要使用Redis存储这样的关系可以使用集合类型。思路是对每个用户使用两个集合类型键,分别名为“user:用户ID:followers”和“user:用户ID:following”,用来存储关注该用户的用户集合和该用户关注的用户集合。
var redis = require('redis'); var client = new redis({
// 配置 }); function follow(currentUser, targetUser) {
client.sadd(`post:${
currentUser}:following ${
targetUser}`); client.sadd(`post:${
targetUser}:followers ${
currentUser}`); }
命令
MULTI
Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是 Redis 的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
redis> MULTI OK redis> SADD "user:1:following" 2 QUEUED redis> SADD "user:2:followers" 1 QUEUED redis> EXEC 1) (integer) 1 2) (integer) 1
错误处理
- 语法错误: 可以发现并且中断后面的执行
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set shiwu hello QUEUED 127.0.0.1:6379> asdasdasd (error) ERR unknown command `asdasdasd`, with args beginning with: 127.0.0.1:6379> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get shiwu (nil)
- 运行错误: redis无法发现
Redis的事务没有关系数据库事务提供的回滚(rollback)[1] 功能。为此开发者必须在事务执行出错后自己收拾剩下的摊子(将数据库复原回事务执行前的状态等)。 不过由于 Redis 不支持回滚功能,也使得 Redis 在事务上可以保持简洁和快速。另外回顾刚才提到的会导致事务执行失败的两种错误,其中语法错误完全可以在开发时找出并解决,另外如果能够很好地规划数据库(保证键名规范等)的使用,是不会出现如命令与数据类型不匹配这样的运行错误的。
实例
follow.js
var redis = require('redis'); var client = new redis({
// 配置 }); // 关注与被关注 function follow(currentUser, targetUser) {
// 我 关注 你 client.sadd(`user:${
currentUser}:guanzhu ${
targetUser}`); // 存储 集合 关注列表会添加你 client.sadd(`user:${
targetUser}:fensi ${
currentUser}`); // 这里报错 } follow('我', '你');
WATCH命令介绍
我们已经知道在一个事务中只有当所有命令都依次执行完后才能得到每个结果的返回值,可是有些情况下需要先获得一条命令的返回值,然后再根据这个值执行下一条命令。
WATCH
命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。
redis> SET key 1 OK redis> WATCH key OK redis> SET key 2 OK redis> MULTI OK redis> SET key 3 QUEUED redis> EXEC (nil) redis> GET key "2"
我们可以利用WATCH来重构之前实现的incr函数来避免竞态
var redis = require('redis'); var client = new redis({
// 配置 }); function incr($key) {
client.watch($key); var value = client.get($key); if (!value) {
value = 0; value = value + 1; } else {
client.multi(); client.set(`${
$key} value`); client.exit(); return value; } }
实例
watch_incr.js
var redis = require('redis'); var client = new redis({
// 配置 }); function incr($key) {
client.watch($key); // 一旦key被修改就要 组织事务的执行 var value = client.get($key); if (!value) {
value = 0; } else {
client.multi(); value ++; client.set(`${
$key} ${
value}`); client.exec(); return value; } }
到此这篇NoSQL数据库(三)01-Redis进阶与实战——redis事务命令与错误处理、事务中的watch命令的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/10805.html