Redis介绍
Redis是一个基于BSD开源的高性能键值缓存服务,支持数据结构string,list,hash,set,sorted,bitmaps,hyperloglog。
官方站点:http://www.redis.io
Redis特点:
kv存储,存储在内存中,
redis可以持久化周期性的存储在磁盘上(冗余作用)
快照,内存数据异步传输到磁盘(RDB)。
AOF,每次写操作附加在文件中。
Master-Slave方式,主写,从读。
redis支持主从模式,借助哨兵(Sentinel实现一定意义上的高可用)
redis3.0开始支持群集(分布式)
Redis和Memcache区别
memcache是一个分布式内存对象缓存系统,且不可持久化,redis支持 持久存储
memcache是基于LRU cache(最近最少使用) ,redis有不同特性以及跟多数据类型
memcache是多线程,redis是单线程,两者的性能几乎相同
Redis优点:
丰富(资料形式)操作(Hashs,Lists,Sorted,Sets,HyperLoglog)
内建replication及cluster
就地更新(in-place update)操作
支持持久化(磁盘),避免雪崩
Memcache优点
多线程(善用多核cpu,更少堵塞操作)
更少内存开销
更少内存分配压力
内存碎片更少
其他资料
常见的存储系统分为三类:
RDBMS:如Oracle,SQLServer,MySQL。
NoSQL:如Hbash,MongoDB,Redis
NewSQL:分布式关系型事物系统
NoSQL四种流派:
键值NoSQL:如Redis,Memcache
列族NoSQL:如Hbash,MongoDB,Redis
文档NoSQL:MongoDB
图形NoSQL:Neo4J
Redis案例:
一百万的key,内存使用约100M
单线程,虽然单线程,却能承受500k的并发请求
Redis安装
1 | 安装redis需要安装jemalloc内存管理工具(google研发) |
Redis基本配置文件
1 | cat redis.conf | grep -v "^#" | grep -v "^$" |
Redis命令
1 | 启动redis前需要设置 |
Redis基本操作
1 | redis-cli -h 127.0.0.1 |
server
主要设置redis服务器
1 | 127.0.0.1:6379> CLIENT SETNAME localconn #设置名称 |
SELECT
使用0的命名空间,默认是0,使用SELECT [空间名进行跳转最大16个]
同一个名称空间不能使用相同的键值
1 | 127.0.0.1:6379>SELECT 0 |
SET
1 | 127.0.0.1:6379> help set |
GET
1 | 127.0.0.1:6379> get 02 |
APPEND
1 | 127.0.0.1:6379> append 01 haha |
STRLEN
1 | 127.0.0.1:6379> STRLEN 01 #长度 |
INCR
只针对整数增加生效
1 | 127.0.0.1:6379> set count 0 |
DECR
1 | 127.0.0.1:6379> DECR count #减 |
事物
通过MULTI
,EXEC
,WATCH
等命令实现事物功能: redis事物只是将一个或者多个命令打包一个操作服务端按顺序执行机制
redis事务不支持回滚操作
1 | 127.0.0.1:6379> MULTT #启动一个事务 |
清空操作:)
for _ in range(1000):print(“不要在生产使用”)
1 | FLUSHDB 清空当前数据库 |
WATCH 乐观锁
WATCH
在EXEC
命令执行之前,用于监视指定数量的键,如果监视中的某任意键数据被修改,则服务器拒绝执行事务
1 | 127.0.0.1:6379> WATCH IP #监控IP键 |
Redis认证
如果使用认证功能需要编辑配置文件找到requirepass
1 | 格式:requirepass PASS |
Redis发布订阅
频道:消息队列
1 | SUBSCRIBE:订阅一个或多个队列 |
Redis持久化
#####RDB和AOF
RDB:snapshot,二进制格式:被事先定制的策略,如save 900 1,周期性将数据保存到磁盘:数据文件默认为dump.rdb;
客户端也可以使用SAVE或者BGSAVE命令启动快照保持机制
SAVE:在主线程中保存快照,此时会堵塞所有用户请求,如果数据量大,严重影响性能
BGSAVE:异步,不会被堵塞,只是创建子进程,保存到临时文件,主进程依然处理客户端请求
AOF:Append Only File. 记录每一次写操作至指定的文件尾部实现持久化,当redis重启时,可通过重新执行文件中的命令,在内存中重建数据库。
BGREWRITEAOF:AOF文件重写;
不会读取正在使用的AOF文件,在通过将内存中的数据以命令的方式保存在临时文件中,完成后替换原来的AOF文件
RDB:
配置:redis-cli可以用config get dir查看
1 | 配置如下: |
AOF:
AOF重写过程:
redis主进程调用fork生成子进程
子进程根据redis内存中的数据创建数据库重建命令列于临时文件中
父进程继承clinet请求,并会把这些请求写操作继续追加至原来的AOF文件,额外的这些新的请求会被放置于一个缓冲队列中
子进程重写完成会通知父进程,父进程会把缓冲中的命令写到临时文件中
父进程用临时文件替换老的AOF文件
1 | 配置如下: |
RDB和AOF注意事项:
redis如果同时使用两种持久化会导致IO影响大。
需要注意的是,就算可以持久化也不要忘记备份,万一磁盘坏了持久化也没什么用,对redis持久化文件进行备份。
RDB和AOF同时使用:
BGSAVE和BGREWRITEAOF不会同时执行
在redis服务器启动用于恢复数据时,优先是有AOF,因为RDB是周期性的,数据不能保证为最新的
Redis复制
特点:
一个master可以有多个slave
支持链式复制:slave可以有多个slave
master以非阻塞方式同步至slave
master&slave工作原理:
启动一个slave,会请求同步master,master启动子进程,将快照保存在文件中,将文件传送给slave,slave接受文件保存本地加载至内存,完成同步
配置过程
1 | 配置master&slave |
主从复制缺点:
如果redismaster离线了,怎么办?
可以使用redis-sentinel(主从架构实现高可用)
Redis sentinel
sentinel主要作用:
用于管理多个redis服务实现HA
监控,通知,故障转移
留言协议,投票协议。
启动流程:
服务器自身初始化,运行redis-server中专用于sentinel功能代码
初始化sentinel状态,根据给定配置文件,初始化监控的master服务器列表
创建连向master的链接
1 | 依赖配置文件sentinel.conf |
sentinel配置文件说明
1 | port 26379 |
sentinel下线机制:
主观下线和客观下线
主观下线:一个sentinel实例判断出某个节点下线
客观下线:多个sentinel节点协商后判断出某节点下线
专用命令
1 | redis-clit -h sentinelip -p sentinelport |
示例
1 | 环境如下: |