redis事务管理以及服务管理命令
时间:2019-10-09
本文章向大家介绍redis事务管理以及服务管理命令,主要包括redis事务管理以及服务管理命令使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
redis中的事务跟关系型数据库中的事务是一个相似的概念,但是有不同之处。关系型数据库事务执行失败后面的sql语句不在执行,而redis中的一条命令执行失败,其余的命令照常执行。
redis中开启一个事务是使用multi,相当于begin\start transaction,exec提交事务,discard取消队列命令(非回滚操作)。
|
MySQL
|
Redis
|
开启
|
start transaction/begin
|
multi
|
语句
|
普通SQL
|
普通命令
|
失败
|
rollback 回滚
|
discard 取消
|
成功
|
commit
|
exec
|
事务命令
• DISCARD
取消事务,放弃执行事务块内的所有命令。
• EXEC
执行所有事务块内的命令。
• MULTI
标记一个事务块的开始。
• UNWATCH
取消 WATCH 命令对所有 key 的监视。
• WATCH key [key ...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
Redis事务中的锁机制
举例:我正在买票
Ticket -1 , money -100
而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了,即ticket变成0了.
我该如何观察这种情景,并不再提交
悲观的想法:
世界充满危险,肯定有人和我抢, 给ticket上锁, 只有我能操作. [悲观锁]
乐观的想法:
没有那么人和我抢,因此,我只需要注意,有没有人更改ticket的值就可以了 [乐观锁]
举例:redis基于watch实现乐观锁,只要发现监视的对象的值发生变化就取消操作。
用户A买票,购买完票在队列,没有提交
127.0.0.1:6379> set 12306 1 OK 127.0.0.1:6379> WATCH 12306 OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set 12306 0 QUEUED
用户B买票直接提交了
127.0.0.1:6379> get 12306 "1" 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set 12306 0 QUEUED 127.0.0.1:6379> EXEC 1) OK 127.0.0.1:6379>
当用户A经过一番思考后决定要买票时发现票已经被买走了。
127.0.0.1:6379> set 12306 1 OK 127.0.0.1:6379> WATCH 12306 OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set 12306 0 QUEUED 127.0.0.1:6379> EXEC (nil)
如果A用户不加watch,导致两个用户都可以购买成功。但是只有一张票
服务管理命令
- Info 查看redis当前状态的所有参数,如果想查看某一个项:info clients、INFO Memory、info Persistence等
- Clinet list
- Client kill ip:port
- config get *
- CONFIG GET/SET 动态修改
- Dbsize 查看当前数据库key的大小 (用info keyspace也可以来查看redis key的详情)
- FLUSHALL 清空所有数据(包括持久化的数据)⚠️ 危险
- select 0 (默认总共有15个库,编号从0-15。对于集群环境所有的节点必须保持在0号库)
- FLUSHDB 清空当前库
- MONITOR 监控实时指令
- SHUTDOWN 关闭服务器
- save 将当前数据保存
- SLAVEOF host port 主从配置
- SLAVEOF NO ONE
- SYNC 主从同步
- ROLE返回主从角色
善于用help查看帮助
127.0.0.1:6379> CLIENT help 1) CLIENT <subcommand> arg arg ... arg. Subcommands are: 2) id -- Return the ID of the current connection. 3) getname -- Return the name of the current connection. 4) kill <ip:port> -- Kill connection made from <ip:port>. 5) kill <option> <value> [option value ...] -- Kill connections. Options are: 6) addr <ip:port> -- Kill connection made from <ip:port> 7) type (normal|master|replica|pubsub) -- Kill connections by type. 8) skipme (yes|no) -- Skip killing current connection (default: yes). 9) list [options ...] -- Return information about client connections. Options: 10) type (normal|master|replica|pubsub) -- Return clients of specified type. 11) pause <timeout> -- Suspend all Redis clients for <timout> milliseconds. 12) reply (on|off|skip) -- Control the replies sent to the current connection. 13) setname <name> -- Assign the name <name> to the current connection. 14) unblock <clientid> [TIMEOUT|ERROR] -- Unblock the specified blocked client.
常用全局key操作
KEYS * 查看KEY支持通配符
DEL 删除给定的一个或多个key
EXISTS 检查是否存在(可以在代码中操作,没有就去mysql中取)
TYPE 返回键所存储值的类型
EXPIRE\ PEXPIRE 以秒\毫秒设定生存时间
TTL\ PTTL 以秒\毫秒为单位返回生存时间
PERSIST 取消生存实现设置
原文地址:https://www.cnblogs.com/yang-ning/p/11642333.html
- Java开发Spring笔记第二天
- PHP调用Go服务的正确方式 - Unix Domain Sockets
- 一条看似平常的报警邮件所做的分析(r8笔记第9天)
- 55. 上传文件(Web版) | 厚土Go学习笔记
- R语言与机器学习学习笔记(分类算法
- 54. 心跳的实现 | 厚土Go学习笔记
- 通过错误的sql来测试推理sql的解析过程(二) (r8笔记第7天)
- 53. Socket服务三次握手的示例 | 厚土Go学习笔记
- R分词继续,"不|知道|你在|说|什么"分词添加新词
- Java开发Spring第一天
- 关于R安装中文分词包安装不上的问题install.packages("tm")
- dataguard备库的数据文件的迁移实战(r8笔记第24天)
- Hive的left join、left outer join和left semi join三者的区别
- 52. Socket Server 自定义协议的简单实现 | 厚土Go学习笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Netty对ThreadLocal的升级
- 【避坑指南】12.2 新功能优化器统计顾问(Optimizer Statistics Advisor)及常见问题和解决方法
- 初试 Open Service Mesh(OSM)
- K8S 生态周报| runc v1.0-rc92 发布
- 聊聊 Python 面试最常被问到的几种设计模式(上)
- 推荐一套个人文档管理系统。
- OpenCV图像读取(imread) 显示(imshow) 保存(imwrite)的冷知识点
- CodeReview实践-Gerrit自动触发JenkinsCI
- OpenCV常用图像拼接方法(一) :直接拼接
- ClickHouse|MergeTree引擎之数据分区
- OpenCV常用图像拼接方法(二) :基于模板匹配拼接
- 为了解决 Prometheus 大内存问题,我竟然强行将 Prometheus Operator 给肢解了。。
- 面试官:webpack原理都不会?
- 算法篇:树之对称二叉树
- 算法篇:树之二叉树的恢复