复习电商笔记-28-Redis高级中的set结构和redis事务

Redis高级中的set结构

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为232 - 1 (4294967295每个集合可存储40多亿个成员)。

sadd

添加元素,重复元素添加失败,返回0

127.0.0.1:6379> sadd name tony

(integer) 1

127.0.0.1:6379> sadd name hellen

(integer) 1

127.0.0.1:6379> sadd name rose

(integer) 1

127.0.0.1:6379> sadd name rose

(integer) 0

smembers

获取内容

127.0.0.1:6379> smembers name

1) "hellen"

2) "rose"

3) "tony"

spop

移除并返回集合中的一个随机元素

127.0.0.1:6379> smembers internet

1) "amoeba"

2) "redis"

3) "rabbitmq"

4) "nginx"

127.0.0.1:6379> spop internet

"rabbitmq"

127.0.0.1:6379> spop internet

"nginx"

127.0.0.1:6379> smembers internet

1) "amoeba"

2) "redis"

scard

获取成员个数

127.0.0.1:6379> scard name

(integer) 3

smove

移动一个元素到另外一个集合

127.0.0.1:6379> sadd internet amoeba nginx redis

(integer) 3

127.0.0.1:6379> sadd bigdata hadopp spark rabbitmq

(integer) 3

127.0.0.1:6379> smembers internet

1) "amoeba"

2) "redis"

3) "nginx"

127.0.0.1:6379> smembers bigdata

1) "hadopp"

2) "spark"

3) "rabbitmq"

127.0.0.1:6379> smove bigdata internet rabbitmq

(integer) 1

127.0.0.1:6379> smembers internet

1) "amoeba"

2) "redis"

3) "rabbitmq"

4) "nginx"

127.0.0.1:6379> smembers bigdata

1) "hadopp"

2) "spark"

127.0.0.1:6379>

sunion

并集

127.0.0.1:6379> sunion internet bigdata

1) "redis"

2) "nginx"

3) "rabbitmq"

4) "amoeba"

5) "hadopp"

6) "spark"

redis事务管理

redis是单线程,提交命令时,其它命令无法插入其中,轻松利用单线程实现了事务的原子性。那如果执行多个redis命令呢?自然就没有事务保证,于是redis有下列相关的redis命令来实现事务管理。

multi		开启事务
exec		提交事务
discard		取消事务
watch		监控,如果监控的值发生变化,则提交事务时会失败
unwatch		去掉监控

Redis保证一个事务中的所有命令要么都执行,要么都不执行。如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。而 一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。

exec提交事务

例如:模拟转账,王有200,张有700,张给王转100。过程如下:

127.0.0.1:6379> set w 200

OK

127.0.0.1:6379> set z 700

OK

127.0.0.1:6379> mget w z

1) "200"

2) "700"

127.0.0.1:6379> multi

OK

127.0.0.1:6379> decrby z 100

QUEUED        #注意此命令根本没有执行,而是把其放在一个队列中

127.0.0.1:6379> incrby w 100

QUEUED

127.0.0.1:6379> mget w z

QUEUED

127.0.0.1:6379> get w           #同时,这些相关的变量也不能再读取

QUEUED

127.0.0.1:6379> get z

QUEUED

127.0.0.1:6379> exec

1) (integer) 600

2) (integer) 300

3) 1) "300"

   2) "600"

4) "300"

5) "600"

127.0.0.1:6379> mget w z

1) "300"

2) "600"

127.0.0.1:6379>

如果有错误命令,自动取消

127.0.0.1:6379> mget w z

1) "300"

2) "600"

127.0.0.1:6379> multi

OK

127.0.0.1:6379> get w

QUEUED

127.0.0.1:6379> set w 100

QUEUED

127.0.0.1:6379> abc
(error) ERR unknown command 'abc'

127.0.0.1:6379> exec

(error) EXECABORT Transaction discarded because of previous errors.

127.0.0.1:6379> get w

"300"

127.0.0.1:6379>

 

discard取消事务

注意redis事务太简单,没有回滚,而只有取消。

127.0.0.1:6379> mget z w

1) "600"

2) "300"

127.0.0.1:6379> multi

OK

127.0.0.1:6379> incrby z 100

QUEUED

127.0.0.1:6379> discard
OK

127.0.0.1:6379> get z

"600"

127.0.0.1:6379> exec

(error) ERR EXEC without MULTI

 

秒杀

客户端1:

127.0.0.1:6379> clear

127.0.0.1:6379> set ticket 1

OK

127.0.0.1:6379> set money 0

OK

127.0.0.1:6379> watch ticket       #乐观锁,对值进行观察,改变则事务失败

OK

127.0.0.1:6379> multi              #开启事务

OK

127.0.0.1:6379> decr ticket

QUEUED

127.0.0.1:6379> incrby money 100
QUEUED

客户端2:还没等客户端1提交事务,此时客户端2把票买到了。

127.0.0.1:6379> get ticket

"1"

127.0.0.1:6379> decr ticket

(integer) 0

客户端1:

127.0.0.1:6379> exec

(nil)                                  #执行事务,失败

127.0.0.1:6379> get ticket

"0"

127.0.0.1:6379> unwatch                #取消监控

猜你喜欢

转载自blog.csdn.net/qq_40680190/article/details/84109713
今日推荐