20210519第二天
Redis 学习
- Redis 是一个灵活的高性能 key-value 数据结构存储,可以用来作为数据库、缓存和消息队列。
- 可以将内存的数据存入磁盘,支持数据存储的持久化
- 支持的数据类型:string、list、set、zset(sorted set)、hash。
- 支持数据备份
- 读写速度快,特性丰富(设置 key 过期,发布订阅通知等等)
Redis 键命令:
命令 | 描述 |
---|---|
DEL | 用于删除key |
EXISTS | 用于查看给定 key 是否存在 |
EXPIRE | 为给定 key 设置过期时间 |
MOVE | 把当前数据库的 key 移动到给定的数据库 |
TTL | 返回给定 key 的剩余生存时间 |
RENAME | 重命名 key |
type | 返回给定 key 的数据类型 |
SET myKey "hello"
EXPIRE myKey 10
TTL myKey
TYPE myKey
RENAME myKey herKey
Redis 字符串命令:
命令 | 描述 |
---|---|
SET | 设置指定 key 的值 |
GET | 查找指定 key 的值 |
GETSET | 为给定的 key 重新赋值,并返回旧值 |
SETNX | 只有在 key 不存在时设置 key 的值 |
STRLEN | 返回给定 key 的 value 的长度 |
SET myKey "hello"
GETSET myKey "world"
GET myKey
SETEX mykey 10 "Hello" // 设置 value 的同时设置过期时间
Redis 哈希命令:
命令 | 描述 |
---|---|
HDEL | 删除一个或者多个哈希表字段 |
HEXISTS | 查看哈希表 key 中,指定的字段是否存在 |
HKEYS | 获取哈希表中所有的字段 |
HVALS | 获取哈希表中所有值 |
HSTRLEN | 返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度 |
HSET myhash field1 "Hello"
HDEL myhash filed1
HEXISTS myhash filed1
HKEYS myhash
Redis 列表命令:
命令 | 描述 |
---|---|
BLPOP | 移除并获取第一个元素 |
BRPOP | 移除并获取最后一个元素 |
LINDEX | 通过索引获取列表的元素 |
LLEN | 获取列表的长度 |
LPUSH | 插入一个或者多个元素到列表头部 |
LSET | 通过索引设置元素的值 |
RPUSH mylist "one"
RPUSH mylist "two"
RPUSH mylist "three"
LSET mylist 0 "four"
LSET mylist -2 "five"
Redis 集合命令:
Redis 的 Set 是 string 类型的无序集合。
集合成员是唯一的,这就意味着集合中没有重复的数据。
命令 | 描述 |
---|---|
SADD | 向集合添加一个或者多个成员 |
SCARD | 获取集合的成员数 |
SISMEMBER | 判断是不是集合的成员 |
SMEMBERS | 返回集合中的所有成员 |
SREM | 移除集合中一个或者多个成员 |
SADD myset "one"
SADD myset "two"
SADD myset "three"
SREM myset "one"
SREM myset "four"
SMEMBERS myset
SISMEMBER myset "five"
Redis 备份和还原
Redis 客户端连接
Redis 事务
事务是指一个完整的动作,要么全部执行,要么什么也没有做。
但Redis 的事务并不是真正的事务,只是用于帮助用户在一个步骤中执行多个命令。单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
Redis 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
- 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
MULTI、EXEC、DISCARD、WATCH 这四个指令构成了 redis 事务处理的基础。
- MULTI 用来组装一个事务;
- EXEC 用来执行一个事务;
- DISCARD 用来取消一个事务;
- WATCH 用来监视一些 key,一旦这些 key 在事务执行之前被改变,则取消事务的执行。
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> EXEC
(empty list or set)
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET rediscomcn redis
QUEUED
redis 127.0.0.1:6379> GET rediscomcn
QUEUED
redis 127.0.0.1:6379> INCR visitors
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "redis"
3) (integer) 1
// 出现 QUEUED 则表示我们这个命令成功插入了缓存队列,在将来执行 EXEC 时,这些被 QUEUED 的命令都会被组装成一个事务来执行。
WATCH 本身的作用是监视 key 是否被改动过,而且支持同时监视多个 key,只要还没真正触发事务,WATCH 都会尽职尽责的监视,一旦发现某个 key 被修改了,在执行 EXEC 时就会返回 nil,表示事务无法触发。(实现了乐观锁的功能 CAS)
127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> watch age //开始监视age
OK
127.0.0.1:6379> set age 24 //在EXEC之前,age的值被修改了
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 25
QUEUED
127.0.0.1:6379> get age
QUEUED
127.0.0.1:6379> exec //触发EXEC
(nil) //事务无法被执行
Redis 发布订阅
一个客户端订阅消息,通道是 channel1
一个客户端发布消息,通道是 channel1
这时候订阅者可以接收发布者发送的消息
在Redis中,客户端可以订阅任意数量的频道。
// 第一个客户端
redis 127.0.0.1:6379> SUBSCRIBE rediscomcnChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
// 第二个客户端
redis 127.0.0.1:6379> PUBLISH rediscomcnChat "Redis PUBLISH test"
(integer) 1
redis 127.0.0.1:6379> PUBLISH rediscomcnChat "Learn redis by redis.com.cn"
(integer) 1
/*
订阅者的客户端会显示如下消息
1) "message"
2) "rediscomcnChat"
3) "Redis PUBLISH test"
1) "message"
2) "rediscomcnChat"
3) "Learn redis by redis.com.cn"
*/