一:Redis事务
Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。 总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
使用:
watch命令可以为 Redis 事务提供 check-and-set (CAS)乐观锁行为。
WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC
如果在 WATCH 执行之后, EXEC 执行之前, 有其他客户端修改了 mykey 的值, 那么当前客户端的事务就会失败。 程序需要做的, 就是不断重试这个操作, 直到没有发生碰撞为止。 这种形式的锁被称作乐观锁, 它是一种非常强大的锁机制。
为什么不回滚?
官方解释:
二:Lua脚本
为什么用Lua脚本?
怎么在Lua脚本中执行Redis命令?
redis.call(command, key [param1,param2…])
redis调用lua脚本: redis-cli --eval 脚本名称 参数个数 参数1 参数2……
lua使用案例:
三:Redis为什么这么快?
总结主要就四点:
3.1、单线程
这个单线程是处理客户端请求的是单线程,从6.0之后引入了多线程,多线程只是用来处理网络数据的读写和协议解析处理其他的事情。
单线程的好处:
官方的解释:单线程已经够用了,cpu不是redis 的瓶颈,瓶颈是机器的内存或者网络带宽。既然单线程容易实现,又不用处理线程并发的问题,就采用了单线程的方案。所以不要在生产环境运行长命令,比如:keys、flushdb
3.2、纯内存 KV
我们都知道内存读写是比磁盘读写快很多的。Redis是基于内存存储实现的数据库,相对于数据存在磁盘的数据库,就省去磁盘磁盘I/O的消耗。MySQL等磁盘数据库,需要建立索引来加快查询效率,而Redis数据存放在内存,直接操作内存,所以就很快。
虚拟内存机制
虚拟内存机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。
3.3、高效的数据结构及合理的数据编码
Redis支持多种数据基本类型,每种基本类型对应不同的数据结构,每种数据结构对应不一样的编码。为了提高性能,Redis设计者总结出,数据结构最适合的编码搭配。
3.4、I/O 多路复用
IO多路复用其实就是一种NIO模型,它实现了一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;而没有文件句柄就绪时,就会阻塞应用程序,并交出cpu。epoll 是LINUX系统内核提供支持的。
四:内存回收
4.1、内存过期策略 通常有以下三种:
Redis采用的过期策略:惰性删除 + 定期删除。
如果所有的key都没有设置过期属性,redis内不足了怎么处理?这就是内存淘汰。
4.2、内存淘汰策略
内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
提供了八种淘汰策略:
volatile-lru、allkeys-lru
volatile-lfu、allkeys-lfu
volatile-random、allkeys-random
volatile-ttl
noeviction
LRU的回收问题:
假设A在10s内访问了5次,而B在10s内访问了2次,B最后一次访问的时间比A要晚,在同等情况下,A反而会先被回收。所以需要基于访问频率的淘汰机制LFU。
LFU的实现
当24 bits用作LFU时,其被分为两部分:
counter是用基于概率的对数计数器实现的,8位可以表示百万次的访问频率
并不是访问一次,计数就+1,增长的速率而是由增长因子 # lfu-log-factor 决定的,没有访问的时候计数器还要递减,减少的值由衰减因子 # lfu-decay-time 来控制,衰减因子越大衰减越慢。
五:持久化机制
因为Redis数据在内存,断电既丢,因此持久化到磁盘是必须得有的,Redis提供了RDB跟AOF两种模式。
5.1、RDB 持久化机制
是对 Redis 中的数据执行间隔一段时间周期性的持久化,更适合做冷备。
优势:压缩后的二进制文,适用于备份、全量复制。紧凑,适合备份和灾难恢复生成文件过程不影响主进程,大数据集时恢复速度较快
缺点:不能实时持久化,数据的完整性和一致性不高不高,可能丢失数据
RDB手动触发
1、SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,导致无法提供服务。
2、BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,在保存完成后(先将数据集写入临时文件,写入成功之后再替换之前的文件,用二进制压缩存储)向主进程发送信号告知完成。在BGSAVE 执行期间仍可以继续处理客户端的请求
5.2、AOF 持久化机制
默认关闭的,AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,因为这个模式是只追加的方式,所以没有任何磁盘寻址的开销,所以很快,有点像 Mysql 中的binlog。AOF更适合做热备。
3种appendfsync同步策略
AOF整个流程分两步: