事务与数据库现在基本不用

1、数据库

单机的redis中,redis有类似mysql的功能,默认划分16个db。

简单描述一下,我们在服务器上安装了redis服务器,就可以有多个数据库。

举个例子,在mysql里面(如下图),我们使用use bookstore,就可以使用表一

图片说明

redis里面是db0到db15,一共16个,默认只使用db0,

命令:select 0

就相当于use db0

可以使用数据库0号

这几个db可以实现环境隔离,但是

现在基本用不到,集群也默认只使用一个db0

为什么不用了?

redis本来就就是基于内存的,不同的应用应该使用不同的Redis实例存储数据。而且你想想,搭建redis集群的目的本来就是减轻服务器压力,还分db显然很复杂。

2、事务

MULTI 、 EXEC 、 DISCARD 和 WATCH 是 [Redis] 事务的基础。

multi:开启事务

exec:执行事务

discard:取消事务

watch:乐观锁监视事务(监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断)

Redis的事务其实和传统数据库我们说的事务不一样。

与其说是事务,不如说是:具有命令打包功能。

原因:

1、DISCARD指令只是用来撤销EXEC之前被暂存的指令,并不具有回滚

2、事务已经入队之时,如果中间某一个事务执行失败,下面的事务也会继续执行

现在的事务也用的少,有也是使用lua脚本, 或者说Redis 中的脚本本身就是一种事务

3、过期策略

介绍几个关于过期的命令

1、set key value

2、expire key 秒数

3、pexpire key 毫秒数

4、expireat key 秒数指定的时间戳

5、pexpireat key 毫秒数的时间戳

6、persist 移除时间与键的关联

7、ttl 返回返回剩余时间

定时删除,惰性删除,定期删除

1、定时删除,每一次set就新建一个定时器,这对内存很友好(定时器时间到了,key马上被删除),对cpu不友好(cpu执行着大量的无关过期key删除,消耗大量cpu)。

2、惰性删除,不主动删除过期的键值,而是当访问键值时,再检查当前的键值是否过期,如果过期则执行删除并返回 null 给客户端;如果没过期则正常返回值信息给客户端。
图片说明

3、定时删除,每隔一段时间会检查一下数据库,看看是否有过期键可以被清除。

每次从过期字典中,取出 20 个键进行过期检测,过期字典中存储的是所有设置了过期时间的键值对。如果这批随机检查的数据中有 25% 的比例过期,那么会再抽取 20 个随机键值进行检测和删除,并且会循环执行这个流程,直到抽取的这批数据中过期键值小于 25%,此次检测才算完成。

图片说明

4、内存淘汰策略

Redis 的过期淘汰策略和内存淘汰策略的概念比较类似,都是用于淘汰数据的

主要是LRU 淘汰算法和 LFU 淘汰算法。

LRU

图片说明

着从网络上找到的图,很好的描述LRU,简单说着是内存8的链表。

插入:先判断链表中有没有。有,移动到前面;没有,插入新数据。

淘汰尾部数据:最近最少使用到

LFU

为每个数据项设计一个访问频次,当数据项被命中时,访问频次自增

5、aof与rdb

AOF、RDB

RDB:一定时间,就刷新一次,二进制存一次快照dump.rdb文件(冷备份)

AOF:文件叫appendonly.aof,类似日志形式追加(热备份)

比较:RDB 具备更快速的数据重启恢复能力,并且占用更小的磁盘空间,但有数据丢失的风险;而 AOF 文件的可读性更高,但却占用了更大的空间,且重启之后的恢复速度更慢