4.1 事务
(1) 事务是一组命令的集合
(2) 事务同命令一样是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
(3) 格式:
MULTI //告诉Redis,下面我给你的命令属于同一个事务,你先不要执行,而是把他们暂时存储起来;
命令1;
命令2;
........
EXEC //告诉Redis将等待执行的事务队列中的所有命令按照发送顺序依次执行
//事务中的命令是在EXEC之后才执行
//EXEC命名返回值是多行字符串
(4) Redis的事务没有关系数据库事务提供的回滚(rollback)功能---将一个事务已经完成的的对数据库的修改操作撤销
(5) watch:
1) 事务执行后的结果都是一起返回的,无法将前一条命令的结果作为后一条命令的参数
2) 有时想先获得一条命令的返回值,然后再根据这个值执行下一条命令
3) WATCH命令可以监控一个或多个键 ,一旦其中有一个键被修改或者删除,之后的事务就不会执行;
监控一直持续到EXEC命令
4)执行EXEC命令后会取消对所有键的监控,如果不想执行事务中的命令,也可以用UNWATCH来取消监控。
4.2 生存时间
(1) 应用场景:会遇到一些有时效的数据,比如限时优惠活动、缓存或验证码等,过了一定的时间就需要删除这些数据。
(2) Redis中可以使用EXPIRE命令设置一个键的生存时间,到时间后Redis会自动删除它。
EXPIRE key seconds(单位为秒,必须为整数)
返回1:表示设置成功
返回0:表示键不存在或设置失败
(3) TTL命令:知道一个键还有多久的时间会被删除
返回值-1:表示键被删除而不存在或者没有为键设置生存时间(即永久存在)。
(4) PERSIST:取消键的生存时间设置(即将键恢复成永久的)
如果生存时间被成功清除,则返回1;否则返回0(键不存在或键本身就是永久的);
(5) 使用SET或GETSET命令为键赋值也会同时清除键的生存时间;
(6) 使用EXPIRE命令会重新设置键的生存时间
(7) PEXPIRE命令与EXPIRE命令的区别是前者时间设置更加精确为毫秒
PTTL命令以毫秒为单位返回键的剩余时间
(8) Redis实现缓存----将一些访问频率较高但是对CPU或IO资源消耗较大的操作的结果缓存起来,并希望让这些缓存过一段时间自动过期;
“最近最少使用原则”
4.3 排序----查看一下标签下的文件列表时文章不是按照时间顺序排列的
1. 有序集合的集合操作
SORT命令---可以对列表类型、集合类型和有序集合类型键进行排序,对元素自身的值进行排序
(1) SORT 元素 DESC(按从大到小顺序排列)
(2) SORT命令还支持LIMIT参数来返回指定范围的结果
SORT 元素 DES LIMIT offset count:跳过前offset个元素并获取之后的count个元素
BY参数:
(1) 语法--BY 参考键,其中参考键可以是字符串类型键或散列类型键的某个字段(键名->字段名)
(2) 如果提供了BY参数,SORT命令将不再依据元素自身的值进行排序,而是对每个元素使用元素的值替换参考键中的第一个*并获取其值,然后依据该值对元素排序
(3) 当参考键名不包含*时(即常量键名,与元素值无关),SORT命名不会执行排序操作。
(4) 如果几个元素的参考键值相同,则SORT命令会再比较元素本身的值来决定元素的顺序。
(5) 当某个元素的参考键不存在时,会默认参考键的值为0
GET参数:
(1) 不影响SORT的排序,他的作用是使SORT命令的返回结果不再是元素自身的值,而是GET参数中指定的键值。
(2) GET参数的规则和BY参数一样,GET参数也支持字符串类型和散列类型的键,并使用*作为占位符。
(3) 在一个SORT命令中可以有多个GET参数
(4) GET # 会返回元素本身的值
STORE参数:
(1) 默认情况下SORT会直接返回排序结构,如果希望保存排序结果,可以使用STORE参数。
(2) 保存后的键的类型为列表类型,如果键已经存在就会覆盖它。
(3) STORE参数常用来结合EXPIRE命令缓存排序结果
性能优化-----SORT命令的时间复杂度为O(n+mlogm)[n:表示要排序的列表(集合或有序集合)中元素的个数,m表示要返回的元素个数]
当n较大的时候SORT命令的性能相对较低,并且Redis在排序前会建立一个长度为n的容器来存储待排序的元素。
(1) n减小----尽可能减少待排序键中元素的数量
(2) m减小---使用LIMIT参数只获取需要的数据
(3) 如果要排序的数据数量较大,尽可能使用STORE参数将结果缓存
4.4 消息通知
1.任务队列
(1) 与任务队列进行交互的实体有两类,一类是生产者,一类是消费者;
(2) 任务队列的好处
1) 松耦合:生产者和消费者无需知道彼此的实现细节,只需要约定好任务的描述格式
2) 易于扩展消费者可以有多个,而且可以分布在不同的服务器中。
2. Redis实现任务队列
BRPOP命令和RPOP命令相似,唯一的区别是当列表中没有元素时BRPOP命令会一直阻塞住连接,知道有新元素加入;
3.优先任务队列
BRPOP: 如果所有键都没有元素则阻塞,如果其中有一个键有元素则会从该键中弹出元素;如果多个键都有元素,则按照从左到右的顺序取第一个键中的元素。借此特性实现了优先任务队列;
4.“发布/订阅”模式----实现进程间的消息传递
(1) 发布/订阅模式中包含两种角色,分别是发布者(publish)和订阅者(subscribe)。订阅者可以订阅一个或多个频道,而发布者可以向指定的频道发送消息,所以订阅此频道的订阅者都会受到此消息;发出去的消息不会持久化,就是说刚加入的订阅者之前的消息是收不到的。
(2) 进入订阅状态后的客户端可能收到三种类型的回复。
1) Subscribe:表示订阅成功的反馈信息。
2) message(最为关心)--它表示接收到的消息。
3) unsubscribe--表示成功取消订阅某个消息;如果不指定频道会取消所有频道。
5. 按照规则订阅
PSUBSRIBE:订阅指定的规则
PUNSUBSCRIBE可以退订指定的规则
4.5 管道
Redis的底层协议对管道提供了支持。通过管道可以一次性发送多条命令并在执行完后一次性将结果返回,当一组命令中每条命令都不依赖于之前命令的执行结果时就可以将这组命令一起通过管道发出。管道通过减少客户端与Redis的通信次数来实现降低往返时延累计值的目的。
4.6 节省空间
(1) 精简键名和键值
(2) 内部编码优化
1) 查看一个键的内部编码方式可以使用OBJECT ENCODING命令
2) Redis的每个键值都是使用一个redisObject结构体保存的。
typedef struct redisObject{
unsigned type:4;//键值的数据类型
unsigned notused:2; /*Not used*/
unsigned encoding:4; //表示键的内部编码方式
unsigned lru:22;
int refcount;//该键值被引用的数量
void *ptr;//指向的是该变量的地址
} robj;
1. 字符串类型