专栏首页DBA随笔Redis开发与运维学习笔记---(5)

Redis开发与运维学习笔记---(5)

//

Redis开发与运维学习笔记---(5)

//

事务

redis中的事务和MySQL中的事务类似,也是为了保证多条命令组合的原子性,为此,redis提供了简单的事务功能以及集成Lua来解决这个问题。下面我们来看redis的这个功能。

在redis中,事务需要使用multi命令和exec两个命令之间,类似于mysql的begin~commit;其中,multi代表事务开始,exec命令代表事务结束,他们之间的命令是原子执行的。

例如:

[root@VM_48_10_centos ~]# redis-cli
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set hello world
QUEUED
127.0.0.1:6379> exists hello
QUEUED
127.0.0.1:6379> exec
1) OK
2) (integer) 1

我们可以看到,multi之后,所有的命令都返回queued,也就是在队列中,当我们执行exec之后,才出现真正的返回结果。

如果我们执行了一半,发现某条命令出现错误,这个时候要终止,有没有类似MySQL中的RollBack的方法呢?在redis中,使用discard来回滚之前的操作:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> set name1 lisi
QUEUED
127.0.0.1:6379> discard
OK

事务的错误处理

当在事务中,出现了错误的语句,将会造成事务无法执行,redis事务中的错误分为好几种,分别来介绍:

如下错误为少打了空格之后的报错:

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name0 zhangsan
QUEUED
127.0.0.1:6379> set name1 lisi
QUEUED
127.0.0.1:6379> setname2 wangwu
(error) ERR unknown command 'setname2'
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

运行时错误

如果在执行multi中的命令时,命令本身没有问题,但是执行过程中出现逻辑错误,事务又被exec了,这种错误往往需要dba自己手工解决,redis并不支持此类信息的回滚。

watch命令

redis中的watch命令用来确保事务中的key没有被其他客户端修改过,才执行事务,加入在下面的环境中:

------------------------------------------------

session 1 session 2

set key "java"

watch key

multi

append key python

append key jedis

exec

get key

-----------------------------------------------

我们会发现,session1在执行的过程中,session2对key的值做了变更,此时,session1的exec命令会返回nil,也就是执行失败。

Redis的使用场景

可以做的事儿:

1、缓存,缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效的降低后端数据源的压力。redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。

2、排行榜系统,排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种其他维度计算的排行榜,redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便的构建各种排行榜系统

3、计数器应用,计数器在网站中至关重要,例如视频网站的播放量,电商网站的有效浏览数等等,为了保证数据的实时性,每一次播放和浏览都要做+1的操作,如果并发量很大,则对关系型数据库是一个比较大的挑战,而redis天然支持计数功能,性能也非常好。

4、社交网络,点赞、粉丝、共同好友、推送、下拉刷新等是社交网站的必备功能,,由于社交网站访问量比较大,传统关系型数据库不太适合保存这种类型的数据,redis提供的数据结构可以相对比较容易的实现这些功能。

5、消息队列系统,消息队列系统可以说是一个大型网站的必备系统组件,redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够抢单,但是对于一般的消息队列功能基本可以满足。

不可以做什么:

redis不适合作为大数据量应用的首选数据库,redis的数据是存放在内存中的,如果数据量很大,那么成本将会很高。

redis不适合做那些冷数据较多的应用的首选数据库。redis中适合放热数据,不适合放冷数据,大量的冷数据存放在内存中,会造成资源的浪费。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:AsiaYe

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis开发与运维学习笔记---(3)

    Redis提供了redis-cli、redis-server、redis-benchmart等shell工具,今天对这些工具做下介绍。

    AsiaYe
  • Redis开发与运维学习笔记---(4)

    set hello world的时候,竟然提示read-only。使用info replication的方法查看当前复制状态,发现role变成了slave,所以...

    AsiaYe
  • Redis开发与运维学习笔记---(14)

    我们知道redis的数据都保存在内存中,如何高效利用内存变得尤为重要。这里主要从内存消耗、管理内存的原理与方法、内存优化技巧三个方面来讲述如何高效实现内存的存储...

    AsiaYe
  • redis编译安装和常用操作

    报了一个错 You need tcl 8.5 or newer in order to run the Redis test

    明哥的运维笔记
  • 3.Redis常用命令:String

    字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息...

    陈树义
  • Linux 安装Redis

    yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到

    剑行者
  • Redis 初探-安装与使用

    Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。从2015年6月开始,Redis的开发由Redis Labs赞助,...

    Java技术大杂烩
  • Redis 基本数据类型学习-入门篇

    redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库(非关系性数据库)。

    coder_koala
  • 【redis】部署及参数详解(吐血整理,建议收藏)

    之前我们说互联网业务的繁荣造就了MySQL的飞速发展,但是在大数据爆发的短短几年,关系型数据库由于自身技术的限制,在应对高并发、海量数据的处理上也出现了瓶颈,无...

    MySQL数据库技术栈
  • [技术创作101训练营] 一文带你了解Redis如此火爆的原因

    前段时间,Sanfilippo在自己的博客上发布了一篇公告,表示将不再担当 Redis 开源项目的软件维护者,并“将 Redis 交给 Redis 社区”。这意...

    神无月

扫码关注云+社区

领取腾讯云代金券