当前位置:网站首页 > 数据科学与大数据 > 正文

NoSQL数据库(三)01-Redis进阶与实战——redis事务命令与错误处理、事务中的watch命令

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命令的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • NoSQL数据库(三)02-Redis进阶与实战——EXPIRE命令设置过期时间-实现定期检测删除过期数据 & EXPIRE实现和优化访问服务器频率限制2024-12-01 10:45:07
  • NoSQL数据库(三)03-Redis进阶与实战——EXPIRE实现服务器缓存数据 & sort实现排序之对列表类型、有序集合和非数字类型进行排序 & Redis的底层通信协议对管道提供支持2024-12-01 10:45:07
  • NoSQL数据库(三)04-Redis进阶与实战——nodejs操作redis数据库之ioredis更新属于node_redis改良版 & ioredis的可视化工具安装、基本语法、管道与事务2024-12-01 10:45:07
  • NoSQL数据库(三)05-Redis进阶与实战——总结之事务-错误处理和watch、过期时间、sort排序、by排序 & noedjs操作redis数据库2024-12-01 10:45:07
  • NoSQL数据库(四)-memcached——介绍-分布式内存对象缓存系统、安装、api之set设置、add新增、replace替换、append追加2024-12-01 10:45:07
  • NoSQL数据库(二)06——redis总结之发展、特点、安装、操作 & 数据类型之字符串数据类型、散列、列表、集合、有序集合2024-12-01 10:45:07
  • NoSQL数据库(二)04-Redis数据类型——集合类型之介绍、命令-增加和删除元素、获得集合中的所有元素、判断元素是否在集合中、集合间运算2024-12-01 10:45:07
  • NoSQL数据库(二)03-Redis数据类型——列表类型之介绍、命令-向列表两端增加元素、从列表两端弹出元素、获取列表中元素的个数、删除列表中指定的值2024-12-01 10:45:07
  • NoSQL数据库(二)02-Redis数据类型——实践-散列类型命令之散列存储逻辑、获取id、修改缩略名2024-12-01 10:45:07
  • NoSQL数据库(二)01-Redis数据类型——字符串类型之赋值与取值、递增数字、增加指定浮点数、向尾部追加值、获取字符串长度、设置键值 & 散列类型命令之赋值与取值、获取键值、删除字段、增加数字2024-12-01 10:45:07
  • 全屏图片