Redis——事务以及管道技术

1.Redis事务

  • 事务是指提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只有在执行完事务中的所有命令后,才会继续处理客户端的其他命令。事务也是其他关系型数据库所必备的基础功能。

  • 一般语言中,事务的基本使用

    1. 开启事务——Begin Transaction
    2. 执行业务代码,提交事务——Commit Transaction
    3. 业务处理中出现异常,回滚事务——Rollback Transaction
  • 在Redis中的事务也有三个阶段

    1. 开启事务
    2. 命令入列
    3. 执行事务/放弃事务exec/discard

1.1开启事务(multi)

  • multi命令可以让客户端从非事务模式状态变为事务模式状态

注意: multi命令不能嵌套使用,如果已经开启了multi,再次执行该命令将会出错。

127.0.0.1:6379> multi
OK
127.0.0.1:6379> multi
(error) ERR MULTI calls can not be nested

#出现错误,但是不会终止客户端的事务状态

1.2命令入列(QUEUED)

  • 当进入事务状态以后,执行的常规Redis操作命令(非触发事务执行或放弃和导致入列异常的命令)会依次入列,成功将返回QUEUED。
> multi
OK
> set k v
QUEUED
> get k
QUEUED

1.3执行事务/放弃事务(exec/discard)

> multi
OK
> set k v2
QUEUED
> exec
1) OK
> get k
"v2"
事务的执行


> multi
OK
> set k v3
QUEUED
> discard
OK
> get k
"v2"
事务的放弃

1.4事务错误&回滚

事务执行中的三类错误:

  1. 执行时出错
> get k
"v"
> multi
OK
> set k v2
QUEUED
> expire k 10s
QUEUED
> exec
1) OK
2) (error) ERR value is not an integer or out of range
> get k
"v2"
  1. 入列时错误,不会终止整个事务
> get k
"v"
> multi
OK
> set k v2
QUEUED
> multi
(error) ERR MULTI calls can not be nested
> exec
1) OK
> get k
"v2"
  1. 入列时错误,会终止整个事务

> get k
"v2"
> multi
OK
> set k v3
QUEUED
> set k
(error) ERR wrong number of arguments for 'set' command
> exec
(error) EXECABORT Transaction discarded because of previous errors.
> get k
"v2"

1.5redis不支持回滚

Redistribution官方文档解释

If you have a relational databases background, the fact that Redis commands can fail during a transaction, but still Redis will execute the rest of the transaction instead of rolling back, may look odd to you.
However there are good opinions for this behavior:
• Redis commands can fail only if called with a wrong syntax (and the problem is not detectable during the command queueing), or against keys holding the wrong data type: this means that in practical terms a failing command is the result of a programming errors, and a kind of error that is very likely to be detected during development, and not in production.
• Redis is internally simplified and faster because it does not need the ability to roll back.
An argument against Redis point of view is that bugs happen, however it should be noted that in general the roll back does not save you from programming errors. For instance if a query increments a key by 2 instead of 1, or increments the wrong key, there is no way for a rollback mechanism to help. Given that no one can save the programmer from his or her errors, and that the kind of errors required for a Redis command to fail are unlikely to enter in production, we selected the simpler and faster approach of not supporting roll backs on errors.

  1. Redis事务的执行错误通常都是编程错误,一般只会出现在开发环境中,很少会在实际的生产环境中出现,因此没必要开发事务回滚功能;
  2. 回滚这种复杂的功能和Redis追求的简单高效的设计主旨不符合。这里的不支持回滚是不支持运行时错误的事务回滚。

2.Redis管道技术——Pipeline

管道技术(Pipeline)是客户端提供的一种批处理技术,用于一次处理多个Redis命令,从而提高整个交互的性能。

  • Redis通常是单线程执行,即客户端向服务器发送请求,服务端接收并处理请求,再将结果返回给客户端。在非频繁请求时不会出现问题,若出现集中大批量的请求,就会造成网络资源的浪费。因此管道技术应运而
    生。这就大大提高了Redis的响应速度。

普通命令模式
Redis——事务以及管道技术_第1张图片
管道模式
Redis——事务以及管道技术_第2张图片

  • 管道技术:提高了Redis的响应速度,但它本质上是客户端提供的功能,并非是Redis服务器端的功能。

注意事项

  1. 发送命令的数量不会被限制,但输入缓存区也就是命令的最大存储体积为1GB,当发送的命令超过词限制时,命令不会被执行,并且会被Redis服务器断开连接。
  2. 如果管道的数据过多,可能会导致客户端等待时间过长,导致网络阻塞。
  3. 部分客户端自己本身也有缓存区大小的设置,如果管道命令没有执行或者执行不完整,可以排查此情况或较少管道内的命令重新尝试执行。

3.GEO使用

  • Redis在3.2版本增加了Geo类型用于存储和查询地理位置。主要有下列几个命令
命令 功能 用法
geoadd 添加地理位置 geoadd key longituded(经度) latitude(纬度) member(给该地点起的名字)支持添加多个
geopos 查询位置信息 geopos key member[member]
geodist 距离统计 geodist key member1 member2[unit(单位:m/km/mi/ft)]
georadius 查询某位置内的其他成员信息 georadius key longitude latitude radius m|km|ft|mi [WITHCOORD](返回的经纬度信息) [WITHDIST](返回直线距离) [WITHHASH](返回哈希值) [COUNT count](返回满足条件位置的个数) [ASC|DESC](从近到远
geohash 查询位置的哈希值 geohash key member[member]
zrem 删除地理位置 zrem key member[member]
  • GEO本质上是利用Zset实现的,可以利用它实现查找附近的人或者附件的地点,还可以计算两个位置相隔的直线距离。

你可能感兴趣的:(Redis——事务以及管道技术)