当前位置 博文首页 > weixin_41997073的博客:【星海出品】Redis快速入门

    weixin_41997073的博客:【星海出品】Redis快速入门

    作者:[db:作者] 时间:2021-07-15 15:38

    Redis(Remote Dictionary Server )
    即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

    由于redis涉及知识点较多,这里先需要对redis的基础有个简单了解
    redis 是K-V型的非关系型数据库,由出生于西西里岛的意大利人(antirez)发明的。他早年是web工程师,为了解决网站的负载问题,而在2009年开发了Redis数据库。
    随着用户越来愈多,需要维护的列表数量也越来越多,要执行的弹出和推入操作也越来越多,而每次mysql执行推入或弹出操作,都需要进行硬盘的读写操作,程序的性能严重受制于硬盘的I/O,很多操作都堆在那里,然后网站就没法运作了。这个负载问题根本原因就是硬盘IO,所以antirez在不改变硬件的基础上,通过提升列表的性能来解决负载问题,决定自己写一个具有列表结构的内存数据库原型。最重要的数据存储于内存而不是硬盘,所以程序的性能不会受制于硬盘IO限制,可以以极快的速度执行针对列表的推入和弹出操作。于是antirez使用C语言重写这个内存数据库,并给它加上了持久化功能,这个就是Redis的诞生。

    Redis的特点:

    1. 内存数据库,速度快,也支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    3. Redis支持数据的备份,即master-slave模式的数据备份。
    4. 支持事务

    Redis支持的数据类型

    String字符串:

    格式: set key value

    string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

    string类型是Redis最基本的数据类型,一个键最大能存储512MB。

    Hash(哈希)

    格式: hmset name key1 value1 key2 value2

    Redis hash 是一个键值(key=>value)对集合。

    Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

    List(列表)

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

    格式: lpush name value

    在 key 对应 list 的头部添加字符串元素

    格式: rpush name value

    在 key 对应 list 的尾部添加字符串元素

    格式: lrem name index

    key 对应 list 中删除 count 个和 value 相同的元素

    格式: llen name

    返回 key 对应 list 的长度

    Set(集合)

    格式: sadd name value

    Redis的Set是string类型的无序集合。

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

    zset(sorted set:有序集合)

    格式: zadd name score value

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

    zset的成员是唯一的,但分数(score)却可以重复。

    Redis是以牺牲空间的方式来换取响应速度。

    键Key
    Redis key需要一个二进制值,可以用任何二进制序列作为key值,可以是简单字符串,也可以是个JPEG文件的二进制序列。
    空字符串也是有效key值
    Key取值原则
    键值不需要太长,消耗内存,而且查找这类键值的计算成本较高
    键值不宜过短,可读性较差
    习惯上key采用’user:123:password’形式,表示用户id为123的用户的密码
    字符串是一种最基本简单的Redis值类型。说是字符串,其实可以是任意可以序列化的数据。
    一个字符串类型的值最多能存储512M字节的内容。

    Redis的持久化

    持久化:将数据从掉电易失的内存存放到能够永久存储的设备上
    Redis服务是使用内存来存储数据,如果掉电、服务崩溃都会导致Redis中数据丢失,如有必要,可以持久化数据。
    Redis持久化方式:RDB(Redis DB)、AOF(AppendOnlyFile)

    RDB
    

    在默认情况下,Redis将某时间点的数据库快照保存在名字为 dump.rdb的二进制文件中 策略
    自动:按照配置文件中的条件满足就执行BGSAVE 手动:客户端发起SAVE、BGSAVE命令 注:SAVE和
    BGSAVE都是调用的底层C代码server模块。 save 60
    1000,Redis要满足在60秒内至少有1000个键被改动,会自动保存一次 只要满足上面3个条件之一,就自动执行快照
    执行完后,时间计数器和次数计数器都会归零重新计数。这多个条件不是叠加效果
    SAVE命令:阻塞式命令,执行期间不响应客户端的请求
    BGSAVE:非阻塞命令,执行期间还可以接收并处理客户端请求,会folk一个子进程创建RDB文件

    优点 完全备份,不同时间的数据集备份可以做到多版本恢复 紧凑的单一文件,方便网络传输,适合灾难恢复 快照文件直接恢复,大数据集速度比AOF快些
    缺点 会丢失最近写入、修改的而未能持久化的数据 folk过程较耗时,会造成毫秒级不能响应客户端请求

    AOF
    

    AOF写入机制
    Append only ?le,采用追加的方式保存,默认文件appendonly.aof。
    记录所有的写操作命令,在服务启动的时候使用这些命令就可以还原数据库 AOF方式不能保证绝对不丢失数据
    目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件里面时,为了提高效率,系统通常
    不会直接将内容写入硬盘里面,而是先将内容放入一个内存缓冲区(bu?er)里面,等到缓冲区被填满,或者用户
    执行fsync调用和fdatasync调用时才将储存在缓冲区里的内容真正的写入到硬盘里,未写入磁盘之前,数据可能会 丢失

    写入磁盘的策略
    appendfsync选项,这个选项的值可以是always、everysec或者no
    Always:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,也不会丢失任何已经成功执行的命令数据
    Everysec(默认):服务器每一秒重调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,最多只丢失一秒钟内的执行的命令数据
    No:服务器不主动调用fdatasync,由操作系统决定何时将缓冲区里面的命令写入到硬盘。这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的 运行速度:always的速度慢,everysec和no都很快

    AOF重写机制
    写操作越来越多的被记录,AOF文件会很大。
    Redis会合并写操作,以压缩AOF文件。
    合并重复的写操作,AOF会使用尽可能少的命令来记录。

    重写过程
    1.folk一个子进程负责重写AOF文件
    2.子进程会创建一个临时文件写入AOF信息
    3.父进程会开辟一个内存缓冲区接收新的写命令
    4.子进程重写完成后,父进程会获得一个信号,将父进程接收到的新的写操作由子进程写入到临时文件中
    5.新文件替代旧文件
    注:如果写入操作的时候出现故障导致命令写半截,可以使用redis-check-aof工具修复

    redis保护服务,防止内存击穿,雪崩
    http://it.dataguru.cn/article-10994-1.html

    Linux上使用

    redis启动
    1、备份redis.conf(此文件为Redis配置文件,非常重要):拷贝一份redis.conf到其他目录

    2、修改redis.conf文件将里面的daemonize no 改成 yes,让服务在后台启动

    3、启动命令:执行 redis-server /myredis/redis.conf(后面那个是配置文件的位置)

    4、用客户端访问: Redis-cli 多个端口可以 Redis-cli –p 6379

    5、测试验证: ping 若成功启动会返回 pong!

    3.1.2 redis关闭 单实例关闭:Redis-cli shutdown

    也可以进入终端后再关闭 shutdown

    多实例关闭,指定端口关闭:Redis-cli -p 6379 shutdown

    事务
    最重要的是记住这样一条, 即使事务中有某条/某些命令执行失败了, 事务队列中的其他命令仍然会继续执行 —— Redis 不会停止执行事务中的命令。

    实战
    python 导入redis

    # redis库 2.x版本
    import redis
    r = redis.Redis(host='<IP>',port=<port>,db=<ID>)
    #
    r.zadd('mboard','yellow',1,'rolling in the deep',1,'happy',1,'just the way you are',1)
    r.zadd('mboard','eye of the tiger',1,'billie jean',1,'say you say me',1,'payphone',1)
    r.zadd('mboard','my heart will go on',1,'when you believe',1,'hero',1)
    
    r.zincrby('mboard','yellow',50)
    r.zincrby('mboard','rolling in the deep',60)
    r.zincrby('mboard','my heart will go on',68.8)
    r.zincrby('mboard','when you believe',70)
    
    #所有元素
    allmusic = r.zrange('mboard',0,-1,withscores=True)
    print(type(allmusic))
    for m in allmusic:
    	print(m)
    
    print('-'*30)
    #排行榜
    musicboard = r.zrevrange('mboard',0,9,True)
    
    print('欧美热曲榜')
    for i,m in enumerate(musicboard):
    	print(i,*m)
    
    

    主从

    .命令创建
    redis-server–slaveof master-ip master-port
    配置当前服务称为某Redis服务的Slave
    redis-server --port 6380 --slaveof 127.0.0.1 6379
    2.指令创建
    SLAVEOF host port命令,将当前服务器状态从Master修改为别的服务器的Slave
    redis > SLAVEOF 192.168.1.1 6379,将服务器转换为Slave
    redis > SLAVEOF NO ONE,将服务器重新恢复到Master,不会丢弃已同步数据
    3.配置方式
    启动时,服务器读取配置文件,并自动成为指定服务器的从服务器
    slaveof masterip masterport
    slaveof 127.0.0.1 6379

    主从复制问题

    一个Master可以有多个Slaves。 如果Slave下线,只是读请求的处理能力下降。 但Master下线,写请求无法执行。
    当Master下线,其中一台Slave使用SLAVEOF no one命令成为Master,其它Slaves执行SLAVEOF命令指向这个新
    的Master,从它这里同步数据。
    这个主从转移的过程手动的,如果要实现自动故障转移,这就需要Sentinel哨兵,实现故障转移Failover操作

    cs