事务与数据库现在基本不用
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 文件的可读性更高,但却占用了更大的空间,且重启之后的恢复速度更慢