Redis基础学习
介绍
Redis是一个非关系型内存数据库,Remote Dictionary Server,翻译过来是远程字典服务,通过名字就知道是一款key-value数据库。
Redis是运行在内存中的,但同时也支持数据的持久化。由于运行在内存中的原因,Redis的存取是非常高效的,但使用Redis缓存数据时我们要注意数据量的大小和内存大小。
Redis的单个操作具有原子性,多个操作也支持事务,但这里的事务并不能保证原子性。单个操作之所以是原子性是因为Redis是单线程的,一条命令执行完之后才会执行下一条命令,而并发情况下即使多个操作开启事务也无法保证原子性,若其中一条指令运行时异常,那么事务不会进行回滚(编译时异常会回滚)。
常用操作
- 添加:set 例如:
set test nihao
- 查询:get 例如:
get test
- 判断是否存在:exists 例如:
EXISTS test
- 设置过期时间:setex是在创建时设置过期时间,expire是对已存在的key设置时间
- setex 例如:
setex test 15 nihao
设置test=你好,15秒后过期。过期将删除key。 - expire 例如:
expire test 15
- setex 例如:
- 不存在设置:setnx 例如:
setnx test nihao
当不存在时才执行,存在时不执行。 - 批量设置:mset 例如:
mset k1 v1 k2 v2
- 批量获取:mget 例如:
mget k1 k2 k3
数据类型
Redis有五大基本数据类型:String,hashes,lists,sets,sorted sets。这里的数据类型指的都是value的类型。
- string: 是我们最常用的一个数据类型,注意Redis中没有int,double等类型,都使用string类型来代替。
- hashes: 散列,其实就类似于hashmap。
- lists:列表,支持左插入和右插入。
- sets:去重集合,set中的元素都不重复,可以随机取集合中的元素,多个set之间可以求交集,并集,差集。
- sorted sets:去重有序集合,区别于sets,sorted sets有一个权重参数score,用于排序。
过期策略
过期策略指的是:如何判断一个key是否过期,通常有一下三种策略:
- 惰性过期(被动策略):只有当访问一个key时才会去判断是否过期。但这可能导致堆积大量的过期key。
- 定时过期:为每个key创建一个定时器,这样就能保证到达过期时间时就可以立即清除。但这很明显带来了一定的性能问题。
- 定期过期(主动策略):每隔一段时间就进行扫描并清除过期key。
Redis中默认采用的是定期过期+惰性过期这两种方案
Redis事务与锁
我们知道事务的四个性质:ACID:原子性、一致性、隔离性、持久性。但要注意的是,Redis只保证单条命令的原子性而不保证事务的原子性。也就是说不保证同时成功或同时失败。
Redis中也具有乐观锁,一般和事务在一起使用。当更新数据的时候会判断数据是否被修改了,如果修改了则事务执行失败,若没修改则事务执行成功。
举个例子:
set test nihao
set num 1
watch num #给num添加乐观锁
multi #开启事务
set test world
incr num
#先不执行
exec #执行失败,因为在执行事务期间,num的值发生了改变
#在exec之前执行
incr num
Redis的持久化
Redis是基于内存的,一旦发生了宕机或重启,就会导致数据全部丢失。所以数据持久化对于Redis来说十分重要。Redis中有两种持久化的方式,RDB和AOF,RDB是Redis中默认的持久化方式,两者各有优劣,也可同时使用。
RDB
在redis.conf
中进行配置save 900 1
,表示在900秒内有1次增、删、改操作就写入rdb中进行持久化。这个过程是自动的,只要满足该条件就会触发。会在/user/local/bin
目录下生成一个dump.rdb
文件。
如何使用这个rdb文件呢?只需要在/user/local/bin
目录下有dump.rdb
文件就会自动读取。若没有自动读取,使用config get dir
命令查看一下目录。
说一下优缺点
- 优点
- 适合大规模的数据恢复
- 对完整性要求不高
- 缺点
- 持久化之间存在时间间隔,若意外宕机会导致无法触发最后一次的持久化
- 创建一个单独的子进程进行持久化,先将数据写入到一个临时文件中,最后用临时文件替换之前的rdb文件。因为对主进程没有影响所以非常高效,但会占用一定空间。
AOF
默认是关闭的,在redis.conf
中修改appendonly no
为 appendonly true
,然后重启服务器即可。会发现目录下多了一个appendonly.aof
文件。这个文件会记录所有的增、删、改命令。这里记录的是命令,这一点是明显区别于RDB的。
AOF默认的是无限追加,但这必然会导致文件越来越大,可以在redis.conf
中配置。
优缺点
- 优点
- 有两种同步模式:每秒同步一次,实时同步。实时同步数据完整性必然更好,每秒同步也最多只丢失1s的数据
- 缺点
- 效率低于RDB
- 文件大小远大于RDB
总结
我们一般两个都会开启,在同时开启的情况下,Redis会默认加载AOF文件,因为AOF文件的数据更完整。而RDB虽然数据完整性差一些,但是效率高,并且不会像AOF一样有潜在的风险(文件内容被修改),所以我们还是需要RDB作为备份。