开课吧之Redis 学习笔记一分析

你猜 阅读:229 2021-03-31 12:45:33 评论:0

学习目标:

1、Redis是什么?

2、Redis的主要应用场景有哪些?

3、Redis单机安装要掌握?

4、Redis数据类型有哪些?

5、Redis的数据类型各自的使用场景及注意事项是什么?

6、Redis的消息模式是如何实现的?

7、Redis的事务是如何实现的?

 

1、Redis是什么?

1、Redis 是用 C语言 开发的一个 开源 的高性能 键值对 key - value 内存数据库 ,它是一种 NoSQL 数据库。
2、它是【单进程单线程】的内存数据库,所以说不存在线程安全问题。
3、它可以支持并发 10W QPS,所以说性能非常优秀。之所以单进程单线程性能还这么好,是因为底层采用了【IO
      多路复用(NIO思想)】
4、相比Memcache这种专业缓存技术,它有更优秀的读写性能,及丰富的数据类型。
5、它提供了 五种数据类型 来存储【值】:字符串类型(string)、散列类型(hash)、列表类型(list)、集合
类型(set)、有序集合类型(sortedset、zset)
 

2、Redis应用场景

1、内存数据库 (登录信息、购物车信息、用户浏览记录等)
2、缓存服务器 (商品数据、广告数据等等)( 最多使用
3、解决分布式集群架构中的 session 分离问题( session 共享)
4、任务队列(秒杀、抢购、12306等等)
5、分布式锁的实现
6、支持发布订阅的消息模式
7、应用排行榜(有序集合)
8、网站访问统计
9、数据过期处理(可以精确到毫秒)
 

3、Redis单机版安装配置

参考文章:Windows 安装Redis 单机版

4、Redis数据类型

官方命令大全网址: http://www.redis.cn/commands.html
 
Redis 中存储数据是通过 key - value 格式存储数据的,其中 value 可以定义五种数据类型:
          String(字符类型)
          Hash(散列类型)
          List(列表类型)
          Set(集合类型)
          SortedSet(有序集合类型,简称zset)
 
注意:在 redis 中的命令语句中,命令是忽略大小写的,而 key 是不忽略大小写的。
 

4.1 String 类型

4.1.1 赋值

语法: 

SET key value

示例 :

127.0.0.1:6379> set test 123  
OK

4.1.2 取值

语法: 

GET key

示例 :

127.0.0.1:6379> get test  
"123“

4.1.3 取值并赋值

语法:

GETSET key value

示例 :

127.0.0.1:6379> getset s2 222  
"111"  
127.0.0.1:6379> get s2  
"222"

4.1.4 数值增减

注意:

1、 当value为整数数据时,才能使用以下命令操作数值的增减。

2、 数值递增都是【原子】操作。

3、 redis中的每一个单独的命令都是原子性操作。当多个命令一起执行的时候,就不能保证原子性,不过我们可以使

用事务和 lua 脚本来保证这一点。
 
递增数字
 
语法:
INCR key
示例 :
127.0.0.1:6379> incr num  
(integer) 1  
127.0.0.1:6379> incr num  
(integer) 2  
127.0.0.1:6379> incr num  
(integer) 3
增加指定的整数
 
语法:
INCRBY key increment

示例 :

127.0.0.1:6379> incrby num 2  
(integer) 5  
127.0.0.1:6379> incrby num 2  
(integer) 7  
127.0.0.1:6379> incrby num 2  
(integer) 9
递减数值
 
语法:
DECR key

示例 :

127.0.0.1:6379> incr num  
(integer) 1  
127.0.0.1:6379> incr num  
(integer) 2  
127.0.0.1:6379> incr num  
(integer) 3
减少指定的整数
 
语法:
 
DECRBY key decrement

示例 :

127.0.0.1:6379> decr num  
(integer) 6  
127.0.0.1:6379> decr num  
(integer) 5  
127.0.0.1:6379> decrby num 3  
(integer) 2  
127.0.0.1:6379> decrby num 3  
(integer) -1
仅当不存在时赋值
 
用途: 使用该命令可以实现【分布式锁】的功能, 参考文章地址:
 
语法:
setnx key value
示例 :
redis> EXISTS job # job 不存在  
(integer) 0  
redis> SETNX job "programmer" # job 设置成功  
(integer) 1  
redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败  
(integer) 0  
redis> GET job # 没有被覆盖  
"programmer"
其它命令
 

向尾部追加值:

功能描述: APPEND 命令,向键值的末尾追加 value
如果键不存在则将该键的值设置为 value ,即相当于 SET key value 。返回值是追加后字符串的总长度。
       
语法:
APPEND key value

示例 :

127.0.0.1:6379> set str hello  
OK 
127.0.0.1:6379> append str " world!"  
(integer) 12  
127.0.0.1:6379> get str  
"hello world!"
获取字符串长度
 
功能描述: STRLEN 命令,返回键值的长度,如果键不存在则返回0。
 
语法:
STRLEN key

示例 :

127.0.0.1:6379> strlen str  
(integer) 0  
127.0.0.1:6379> set str hello  
OK 
127.0.0.1:6379> strlen str  
(integer) 5
同时设置/获取多个键值
 
语法:
 
MSET key value [key value …]  
或 
MGET key [key …]

示例 :

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3  
OK 
127.0.0.1:6379> get k1  
"v1"  
127.0.0.1:6379> mget k1 k3  
1) "v1"  
2) "v3"
应用场景之自增主键
 
需求:商品编号、订单号采用 INCR 命令生成。
设计: key 命名要有一定的设计
实现: 定义商品编号 key items:id
 
192.168.101.3:7003> INCR items:id  
(integer) 2  
192.168.101.3:7003> INCR items:id  
(integer) 3

4.2 Hash 类型

hash 类型也叫 散列类型 ,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。
 
 
4.2.1 赋值
 
HSET 命令不区分插入和更新操作,当执行插入操作时 HSET 命令返回 1 ,当执行更新操作时返回 0
 
设置一个字段值
 
语法:
HSET key field value
示例 :
127.0.0.1:6379> hset user username zhangsan  
(integer) 1
设置多个字段值
 
语法:
HMSET key field value [field value ...]
示例:
127.0.0.1:6379> hmset user age 20 username lisi  
OK
当字段不存在时赋值
 
语法:
HSETNX key field value

示例:

127.0.0.1:6379> hsetnx user age 30 # 如果user中没有age字段则设置age值为30,否则不做任何操作 (integer) 0

4.2.2 取值

获取一个字段值

语法:

HGET key field

示例:

127.0.0.1:6379> hget user username  
"zhangsan“
获取多个字段值
 
语法:
HMGET key field [field ...]

示例:

127.0.0.1:6379> hmget user age username  
1) "20"  
2) "lisi"
获取所有字段值
 
语法:
 
HGETALL key

示例:

127.0.0.1:6379> hgetall user  
1) "age"  
2) "20"  
3) "username"  
4) "lisi"

4.2.3 删除字段

可以删除一个或多个字段,返回值是被删除的字段个数

语法:

HDEL key field [field ...]

示例:

127.0.0.1:6379> hdel user age  
(integer) 1  
127.0.0.1:6379> hdel user age name  
(integer) 0  
127.0.0.1:6379> hdel user age username  
(integer) 1

4.2.4 增加数字

语法:

HINCRBY key field increment

示例:

127.0.0.1:6379> hincrby user age 2 # 将用户的年龄加2  
(integer) 22  
127.0.0.1:6379> hget user age # 获取用户的年龄  
"22“

4.2.5 其他命令

判断字段是否存在
 
语法:
HEXISTS key field

示例:

127.0.0.1:6379> hexists user age #查看user中是否有age字段  
(integer) 1  
127.0.0.1:6379> hexists user name #查看user中是否有name字段  
(integer) 0
只获取字段名或字段值
 
语法:
 
HKEYS key  
HVALS key

示例:

OK127.0.0.1:6379> hkeys user  
1) "age"  
2) "name"  
127.0.0.1:6379> hvals user  
1) "20"  
2) "lisi"
获取字段数量、
 
语法:
HLEN key

示例:

127.0.0.1:6379> hlen user  
(integer) 2
获取所有字段
 
功能描述: 获得 hash 的所有信息,包括 key value
 
语法:
hgetall key

string类型和hash类型的区别

hash类型适合存储那些对象数据,特别是对象属性经常发生【增删改】操作的数据。 string类型也可以存储对象数 据,将java对象转成json字符串进行存储,这种存储适合【查询】操作。
 
应用之存储商品信息
 
商品信息字段
 
【商品id、商品名称、商品描述、商品库存、商品好评】
定义商品信息的key
商品ID为1001的信息在 Redis中的key为:[items:1001]
存储商品信息
192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9  
OK
获取商品信息
192.168.101.3:7003> HGET items:1001 id  
"3"  
192.168.101.3:7003> HGETALL items:1001  
1) "id"  
2) "3"  
3) "name"  
4) "apple"  
5) "price"  
6) "999.9"

 

4.3 List类型

ArrayList与LinkedList的区别
     1、ArrayList 使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作, 所以比较慢。
     2、LinkedList 使用双向链表方式存储数据,每个元素都记录前后元素的指针,所以插入、删除数据时只是更改前后元 素的指针指向即可,速度非常快。然后通过下标查询元素时需要从头开始索引,所以比较慢,但是如果查询前几个元
          素或后几个元素速度比较快。
 
 
 
Redis 的列表类型( list 类型)可以 存储一个有序的字符串列表 ,常用的操作是向列表两端添加元素,或者获得列表 的某一个片段。
 
列表类型内部是使用 双向链表( double linked list 实现的,所以向列表两端添加元素的时间复杂度为 0(1) ,获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记
录也是极快的。
 
 
4.3.1 赋值(LPUSH/RPUSH)
 
语法:
LPUSH key value [value ...]  
RPUSH key value [value ...]

示例:

127.0.0.1:6379> lpush list:1 1 2 3  
(integer) 3  
127.0.0.1:6379> rpush list:1 4 5 6  
(integer) 3

4.3.2 取值(LRANGE )

功能描述:获取列表中的某一片段。将返回`start``stop`之间的所有元素(包含两端的元素),索引从`0`开始。索引可以 是负数,如:“`-1`”代表最后边的一个元素。

语法:
LRANGE key start stop

示例:

127.0.0.1:6379> lrange list:1 0 2  
1) "2"  
2) "1"  
3) "4

4.3.3弹出(LRANGE )

功能描述:  从列表左边弹出一个元素,会分两步完成:
               第一步是将列表左边的元素从列表中移除
               第二步是返回被移除的元素值。
 
语法:
LPOP key  
RPOP key

示例:

127.0.0.1:6379>lpop list:1  
"3“  
127.0.0.1:6379>rpop list:1  
"6“

4.3.4 LLEN

功能描述:获取列表中元素的个数

语法:

llen key

示例:

127.0.0.1:6379> llen list:1  
(integer) 2

4.3.5 其他命令

LREM:删除列表中指定个数的值

注意:LREM 命令会删除列表中前 count 个值为 value 的元素,返回实际删除的元素个数。根据 count 值的不同,该命令的执行方式会有所不同.

- count>0 时, LREM 会从列表左边开始删除。
- count<0 时, LREM 会从列表后边开始删除。
- count=0 时, LREM 删除所有值为 value 的元素。
 
语法:
LREM key count value
LINDE:获得指定索引的元素值
 
语法:
LINDEX key index

示例:

127.0.0.1:6379>lindex l:list 2  
"1"

LSET:设置指定索引的元素值

语法:

LSET key index value

示例:

127.0.0.1:6379> lset l:list 2 2  
OK  
127.0.0.1:6379> lrange l:list 0 -1  
1) "6"  
2) "5"  
3) "2"  
4) "2"
LTRIM : 只保留列表指定片段 , 指定范围和 LRANGE 一致
 
语法:
LTRIM key start stop

示例:

127.0.0.1:6379> lrange l:list 0 -1  
1) "6"  
2) "5"  
3) "0"  
4) "2"  
127.0.0.1:6379> ltrim l:list 0 2  
OK 
127.0.0.1:6379> lrange l:list 0 -1  
1) "6"  
2) "5"  
3) "0"
LINSERT: 1、向列表中插入元素。
                2、该命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 BEFORE 还是 AFTER 来决定将 value
                     入到该元素的前面还是后面。
 
语法:
LINSERT key BEFORE|AFTER pivot value

示例:

127.0.0.1:6379> lrange list 0 -1  
1) "3"  
2) "2"  
3) "1"  
127.0.0.1:6379> linsert list after 3 4  
(integer) 4  
127.0.0.1:6379> lrange list 0 -1  
1) "3"  
2) "4"  
3) "2"  
4) "1"

RPOPLPUSH :将元素从一个列表转移到另一个列表中

语法:

RPOPLPUSH source destination

示例:

127.0.0.1:6379> rpoplpush list newlist  
"1"  
127.0.0.1:6379> lrange newlist 0 -1  
1) "1"  
127.0.0.1:6379> lrange list 0 -1  
1) "3"  
2) "4"  
3) "2"
应用之商品评论列表
需求:1、 用户针对某一商品发布评论,一个商品会被不同的用户进行评论,存储商品评论时,要按时间顺序排序。
           2、用户在前端页面查询该商品的评论,需要按照时间顺序降序排序。
 
分析:使用 list 存储商品评论信息, KEY 是该商品的 ID VALUE 是商品评论信息列表
实现:商品编号为 1001 的商品评论 key items: comment:1001
192.168.101.3:7001> LPUSH items:comment:1001 '{"id":1,"name":"商品不错,很 好!!","date":1430295077289}'

4.4 set类型

set 类型即 集合类型 ,其中的数据是 不重复且没有顺序
 
集合类型和列表类型的对比:
 
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型的 Redis 内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为 0(1)
 
Redis 还提供了多个集合之间的 交集、并集、差集 的运算。
 
4.4.1 SADD/SREM
 
功能描述:添加元素 / 删除元素
 
语法:
SADD key member [member ...]  
SREM key member [member ...]

示例:

127.0.0.1:6379> sadd set a b c  
(integer) 3  
127.0.0.1:6379> sadd set a  
(integer) 0  
127.0.0.1:6379> srem set c d  
(integer) 1

4.4.2 SMEMBERS

功能描述:获得集合中的所有元素

语法:

SMEMBERS key

示例:

127.0.0.1:6379> smembers set  
1) "b"  
2) "a”

4.4.3 SISMEMBER

功能描述:判断元素是否在集合中

语法:

SISMEMBER key member

示例:

127.0.0.1:6379>sismember set a  
(integer) 1  
127.0.0.1:6379>sismember set h  
(integer) 0

4.4.4 集合运算

SDIFF:集合的差集运算 A-B:属于A并且不属于B的元素构成的集合。

语法:

SDIFF key [key ...]

示例:

127.0.0.1:6379> sadd setA 1 2 3  
(integer) 3  
127.0.0.1:6379> sadd setB 2 3 4  
(integer) 3  
127.0.0.1:6379> sdiff setA setB  
1) "1"  
127.0.0.1:6379> sdiff setB setA  
1) "4"
SINTER: 集合的交集运算 A ∩ B :属于 A 且属于 B 的元素构成的集合
 
语法:
 
SINTER key [key ...]

示例:

127.0.0.1:6379> sinter setA setB  
1) "2"  
2) "3"
SUNION:集合的并集运算 A B :属于 A 或者属于 B 的元素构成的集合
 
语法:
SUNION key [key ...]

示例

127.0.0.1:6379> sunion setA setB  
1) "1"  
2) "2"  
3) "3"  
4) "4"

4.4.5 其他命令

SCARD:获得集合中元素的个数

语法:
SCARD key

示例

127.0.0.1:6379> smembers setA  
1) "1"  
2) "2"  
3) "3"  
127.0.0.1:6379> scard setA  
(integer) 3
SPOP 从集合中弹出一个元素。 
              注意:由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出
 
语法:
SPOP key

示例

127.0.0.1:6379> spop setA  
"1“

4.5 zset类型

set 集合类型的基础上,有序集合类型为集合中的每个元素都 关联一个分数 ,这使得我们不仅可以完成插入、删除 和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。
 
有序集合和列表类型对比差异
       相同点:
               1 、二者都是有序的。
              2 、二者都可以获得某一范围的元素。
 
       不同点:
               1 、列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢。
              2 、有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快。
              3 、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
              4 、有序集合要比列表类型更耗内存。
 
 
 4.5.1  ZADD 
 
功能描述:1、 增加元素。
               2、向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
 
语法:
ZADD key score member [score member ...]

示例

127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu  
(integer) 3  
127.0.0.1:6379> zadd scoreboard 97 lisi  
(integer) 0

4.5.2  ZRANGE/ZREVRANGE 

功能描述: 获得排名在某个范围的元素列表。

                 - ZRANGE:按照元素分数从小到大的顺序返回索引从startstop之间的所有元素(包含两端的元素)

                 - ZREVRANGE :按照元素分数从大到小的顺序返回索引从 start stop 之间的所有元素(包含两端的元素)
 
语法:
ZRANGE key start stop [WITHSCORES]  
ZREVRANGE key start stop [WITHSCORES]

示例

127.0.0.1:6379> zrange scoreboard 0 2  
1) "zhangsan"  
2) "wangwu"  
3) "lisi“  
127.0.0.1:6379> zrevrange scoreboard 0 2  
1) " lisi "  
2) "wangwu"  
3) " zhangsan “
如果需要获得元素的分数的可以在命令尾部加上 WITHSCORES 参数
 
示例
127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES  
1) "zhangsan"  
2) "80"  
3) "wangwu"  
4) "94"

4.5.3 ZSCORE

功能描述: 获取元素的分数
语法:
ZSCORE key member

示例

127.0.0.1:6379> zscore scoreboard lisi  
"97"

4.5.4 ZREM

功能描述:删除元素。

               移除有序集合key中的一个或多个成员,不存在的成员将被忽略。

               当 key 存在但不是有序集类型时,返回一个错误。
语法:
ZREM key member [member ...] 1
示例:
 
127.0.0.1:6379> zrem scoreboard lisi  
(integer) 1

4.5.5 其他命令

ZRANGEBYSCORE:获得指定分数范围的元素。

语法:

ZRANGEBYSCORE key min max [WITHSCORES]

示例:

127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES  
1) "wangwu"  
2) "94"  
3) "lisi"  
4) "97"  
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2  
1) "wangwu"  
2) "lisi"
ZINCRBY 增加某个元素的分数。
                    返回值是更改后的分数
 
语法:
ZINCRBY key increment member

示例:

127.0.0.1:6379> ZINCRBY scoreboard 4 lisi  
"101“
ZCARD:获得集合中元素的数量。
 
语法:
ZCARD key

示例:

127.0.0.1:6379> ZCARD scoreboard  
(integer) 3
ZCOUNT 获得指定分数范围内的元素个数
 
语法:
 
ZCOUNT key min max
示例:
127.0.0.1:6379> ZCOUNT scoreboard 80 90  
(integer) 1
ZREMRANGEBYRANK:按照排名范围删除元素
 
语法:
ZREMRANGEBYRANK key start stop

示例:

127.0.0.1:6379> ZREMRANGEBYRANK scoreboard 0 1  
(integer) 2  
127.0.0.1:6379> ZRANGE scoreboard 0 -1  
1) "lisi"

ZREMRANGEBYSCORE:按照分数范围删除元素

语法:

ZREMRANGEBYSCORE key min max

示例:

127.0.0.1:6379> zadd scoreboard 84 zhangsan  
(integer) 1  
127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100  
(integer) 1
ZRANK/ZREVRANK 获取元素的排名。
                                    - ZRANK :从小到大
                                    - ZREVRANK :从大到小
 
语法:
ZRANK key member  
ZREVRANK key member

示例:

127.0.0.1:6379> ZRANK scoreboard lisi  
(integer) 0  
127.0.0.1:6379> ZREVRANK scoreboard zhangsan  
(integer) 1
应用之商品销售排行榜
需求:根据商品销售量对商品进行排行显示
 

设计:定义商品销售排行榜(sorted set集合),Keyitems:sellsort,分数为商品销售量。

写入商品销售量:

商品编号 1001 的销量是 9 ,商品编号 1002 的销量是 10

192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002 1
商品编号 1001 的销量加 1
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001 1
商品销量前 10 名:
192.168.101.3:7001> ZREVRANGE items:sellsort 0 9 withscores 1

5、Redis通用命令

5.1 Keys

功能描述:返回满足给定pattern 的所有key

语法:

keys pattern

示例:

redis 127.0.0.1:6379> keys mylist*  
1) "mylist"  
2) "mylist5"  
3) "mylist6"  
4) "mylist7"  
5) "mylist8"

5.2 del

语法:

DEL key

示例:

127.0.0.1:6379> del test  
(integer) 1

5.3 exists

功能描述:确认一个key 是否存在

语法:

exists key

示例:从结果来看,数据库中不存在 HongWan 这个 key ,但是 age 这个 key 是存在的

redis 127.0.0.1:6379> exists HongWan  
(integer) 0  
redis 127.0.0.1:6379> exists age  
(integer) 1  
redis 127.0.0.1:6379>

5.4 expire(重点)

功能描述:Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。

语法:

EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除  
TTL key 查看key生于的生存时间  
PERSIST key 清除生存时间  
PEXPIRE key milliseconds 生存时间设置单位为:毫秒

示例:

192.168.101.3:7002> set test 1 #设置test的值为1  
OK 
192.168.101.3:7002> get test #获取test的值  
"1"  
192.168.101.3:7002> EXPIRE test 5 #设置test的生存时间为5秒  
(integer) 1  
192.168.101.3:7002> TTL test #查看test的生于生成时间还有1秒删除  
(integer) 1  
192.168.101.3:7002> TTL test  
(integer) -2  
192.168.101.3:7002> get test #获取test的值,已经删除  
(nil)

5.5 rename 

功能描述:重命名key

语法:

rename oldkey newkey

示例:age 成功的被我们改名为 age_new

redis 127.0.0.1:6379[1]> keys *  
1) "age"  
redis 127.0.0.1:6379[1]> rename age age_new  
OK 
redis 127.0.0.1:6379[1]> keys *  
1) "age_new"

5.6 type

功能描述:显示指定key的数据类型

语法:

type key

示例:这个方法可以非常简单的判断出值的类型

redis 127.0.0.1:6379> type addr  
string  
redis 127.0.0.1:6379> type myzset2  
zset  
redis 127.0.0.1:6379> type mylist  
list

6、Redis消息模式

6.1 队列模式

使用list类型的 lpush和rpop 实现消息队列
 

注意事项:
       消息接收方如果不知道队列中是否有消息,会一直发送rpop命令,如果这样的话,会每一次都建立一次连接, 这样显然不好。
       可以使用 brpop 命令,它如果从队列中取不出来数据,会一直阻塞,在一定范围内没有取出则返回null。
 

6.2 发布订阅模式

订阅消息(subscribe

示例: 客户端定义指定通道的消息

subscribe kkb-channel
发布消息( publish
 
示例: 向指定消息通道推送消息
 
publish kkb-channel “我是灭霸詹”
Redis发布订阅命令

 

7、Redis 事务

7.1 Redis 事务介绍

1、Redis 的事务是通过 MULTI EXEC DISCARD WATCH UNWATCH 这五个命令来完成的。
2、Redis 的单个命令都是原子性的,所以这里需要确保事务性的对象是 命令集合
3、Redis 将命令集合序列化并确保处于同一事务的 命令集合连续且不被打断 的执行
4、Redis 不支持 回滚 操作。
 

7.2 事务命令

MULTI

功能描述:用于标记事务块的开始。

                Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化地执行这个命令序列。

语法:

multi

EXEC

功能描述:在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态

语法:

exec

DISCARD

功能描述:清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。

语法:

discard

WATCH

功能描述:当某个[事务需要按条件执行]时,就要使用这个命令将给定的[键设置为受监控]的状态。

语法:

watch key [key…]
注意事项:使用该命令可以实现 Redis 的乐观锁。
 
UNWATCH
 
功能描述:清除所有先前为一个事务监控的键。
 
语法:
unwatch
事务演示
127.0.0.1:6379> multi  
OK 
127.0.0.1:6379> set s1 111  
QUEUED  
127.0.0.1:6379> hset set1 name zhangsan  
QUEUED  
127.0.0.1:6379> exec  
1) OK  
2) (integer) 1  
127.0.0.1:6379> multi  
OK 
127.0.0.1:6379> set s2 222  
QUEUED 
127.0.0.1:6379> hset set2 age 20  
QUEUED  
127.0.0.1:6379> discard  
OK 
127.0.0.1:6379> exec  
(error) ERR EXEC without MULTI  
127.0.0.1:6379> watch s1  
OK 
127.0.0.1:6379> multi  
OK 
127.0.0.1:6379> set s1 555  
QUEUED  
127.0.0.1:6379> exec # 此时在没有exec之前,通过另一个命令窗口对监控的s1字段进行修改  
(nil)  
127.0.0.1:6379> get s1  
111
事务失败处理
1、Redis 语法错误(编译期)
 
2、 Redis 运行错误
 
Redis 不支持事务回滚(为什么呢)
1、大多数事务失败是因为 语法错误或者类型错误 ,这两种错误,在开发阶段都是可以预见的
2、 Redis 为了 性能方面 就忽略了事务回滚。
         
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号