1.redis持续化
前提:redis强大的功能很大部分是由于它把数据缓存在内存中
持续化的作用:最大可能性的保证在出现突发情况下(如:重启)数据不丢失,就需要以某种方式把数据持久化到磁盘中。Redis持久化的方式有俩种,RDB和AOF。
redis持续化的方式:RDB和AOF
RDB:快照方式,允许你每隔一段时间对内存数据做一次快照然后存储到硬盘中。该方式是Redis默认的持久化方式(可以通过在配置文件中配置时间或者改动键的个数来定义快照条件,编辑配置文件redis.conf)
理解:在一定的时间间隔内,将内存中文件保存至磁盘,时间间隔可以通过配置文件进行配置,以及可以配置在什么情况下(比如当几个内容发生改变时)进行保存
AOF:通过将发送到服务器的写操作命令记录下来追加到结尾,形成AOF文件,那么文件会原来越大,一些重复的写命令也会越来越多,但是redis提供了重写AOF文件的功能
tip:AOF在同步内存数据到磁盘上时,并不是马上把文件写如到磁盘中,而是先把文件缓存到系统,然后每隔30秒将文件写入到磁盘中,我们可以在配置文件中配置同步的策略
AOF同步过程:
1、Redis 执行 fork() ,现在同时拥有父进程和子进程。
2、子进程开始将新 AOF 文件的内容写入到临时文件。
3、对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾: 这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
4、当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
5、搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。
AOF重写的原理什么?为什么重写之后文件的大小会小于原来的AOF文件?
答案:AOF文件重写的原理:
AOF重写并不需要对原有AOF文件进行任何的读取,写入,分析等操作,这个功能是通过读取服务器当前的数据库状态来实现的。例子:
当前列表键list在数据库中的值就为["C", "D", "E", "F", "G"]。要使用尽量少的命令来记录list键的状态,最简单的方式不是去读取和分析现有AOF文件的内容,而是直接读取list键在数据库中的当前值,然后用一条RPUSH list "C" "D" "E" "F" "G"代替前面的6条命令。减少了重复的命令,所以重写后的AOF文件大小小于原有的AOF文件
AOF重写过程:
子进程在执行AOF重写时,主进程需要执行以下三个工作:
1.执行client发来的命令请求;
2.将写命令追加到现有的AOF文件中;
3.将写命令追加到AOF重写缓存中
保证了数据的一致性
参考了:Redis之AOF重写及其实现原理:https://blog.csdn.net/hezhiqiang1314/article/details/69396887
2.redis数据库命令
①redis是可以设置远程连接,但是一般不会开放远程连接的权限,有不安全的隐患存在,则一般默认为本地连接即:127.0.0.1:6379(默认端口号)
②redis-cli连接成功后,默认选择数据库为0
③获取数据库中的key
$ keys *
$keys BOR *(模糊匹配key)
④获取key对应value的长度,根据type类型不同,命令则不同
type = list $ llen key_name
type = string $ strlen key_name
type =hash $ hlen key_name
⑤python如何操作redis
import redis
#首先导入redis
redis_config = {"host":"127.0.0.1","port":6379}
#redis的配置,一般情况只需要host和port,端口默认的为6379,密码一般没有设置
redis_conn = redis.Redis(**redis_config)
#建立redis连接,基本过程与连接mysql数据库一致
values = redis_conn.get(key_name)
#获取key_name对应的值
mysql数据库连接步骤:
①导入模块
②建立连接
③获取游标
④游标进行操作,执行
3.redis命令
[list]类型的部分操作命令
【ttl 】以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
$ttl key
【lpush】将一个或多个值插入到列表头部,当key不存在时,自动创建key
$lpush java.monitor.gpstojg {"type":"A"} {"type":"B"}
【lpop】移出并获取列表的第一个元素
【lrange】获取列表指定范围内的元素
$lrange key_name 0 1
redis特性:数据类型为聚合类型时,即:lists,sets, Sorted Sets 和 Hashes,当key的值为空时,key都会被自动删除!
【string】
【set】设置指定 key 的值
$set key value