redis
redis理论Redis:安装和配置redis安装配置和使用redisRedis Cluster程序环境:命令数据类型数据类型命令redis-cli命令Server相关的命令:Redis的持久化:redis cluster暂定
理论
存储系统有三类
RDMS
NOSQL
NEWSQL
NoSQL:
ACID:
原子性、一致性、隔离性、持久性;
2phase commit, 3phase comit, ...
non SQL, Not Only SQL; Web 2.0
www.nosql-databases.orghttps://db-engines.com/en/ranking
CAP理论:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式系统满足分区容错性几乎是必须的。
Consistency、Availablity、Partition tolerence
C:多个数据节点上的数据一致;A:用户发出请求后的有限时间范围内返回结果;可用性P:network partition,网络发生分区后,服务是否依然可用;容错性
一般的设计只能满足其中两个
AP :这种情况要求弱的一致性
CP
BASE:BA,S,E,基于CAP演化而来
x BA:Basically Available,基本可用;S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的;E:Eventually consistency,最终一致性;
NoSQL:Not Only SQL
特性:数据量大、数据变化非常快(数据增长快、流量分布变化大、数据间耦合结构变化快)、数据源很多;
多种数据库
column Family:列式数据库, hbasedocument:文档数据库,mongodbGraphDB:图式数据库,Neo4j
Multimodel Databases: 多维存储,对象数据库Time Series / Streaming Databases:时间序列存储
Redis:
Redis:Key-value NOSQl
kv cache and store
in-memory
持久化
主从(借助于sentinel 实现一定意义上的HA)
Clustering(分布式)
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.
开源、内存存储、数据结构存储;数据库、缓存、消息队列;
It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries.
数据结构:字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引;
Redis has built-in replication, Lua scripting, LRU e viction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
内建的复制、Lua scripting、LRU、事务、持久存储、高可用(Sentinel,Redis Cluster)
REmote DIctionary Server:数据结构服务器,k/v,数据结构;
内存存储:in-memroy持久化主从(sentinel)Cluster(shard)
redis-check-dump & redis-check-aof
Corrupted RDB /AOF files utilities
安装和配置redis
安装
进入这个网站:http://pkgs.org/download/redis
找寻符合的系统,配置yum源
yum install
配置和使用redis
所有的配置段:grep -i "^###" /etc/redis.conf
基本配置项网络配置项持久化相关配置复制相关的配置安全相关配置Limit相关的配置SlowLog相关的配置INCLUDESAdvanced配置
通用配置项:
daemonize, supervised, loglevel, pidfile, logfile,
databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
切换数据库的方法:
SELECT
网络配置项:
bind IPport PORTprotected-modetcp-backlogunixsocket timeout:连接的空闲超时时长;
安全配置:
requirepass
在AOF或Replication环境中,不推荐使用;
Limits相关的配置:
maxclientsmaxmemory
淘汰策略:volatile-lru(拥有过期时间的键,最近最少使用), allkeys-lru, volatile-random(拥有过期时间的键,随机), allkeys-random, volatile-ttl(按离终结时间近的进行淘汰), noeviction(不启用淘汰机制)
maxmemory-samples 5
淘汰算法运行时的采样样本数;
SlowLog相关的配置:
slowlog-log-slower-than 10000
单位是微秒;
slowlog-max-len 128
SlowLog记录的日志最大条目;
ADVANCED配置:数据结构,数据域支持量
设置ziplist的键数量最大值,每个值的最大空间;
hash-max-ziplist-entries 512 hash-max-ziplist-value 64
客户端输出缓冲空间的大小:
client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60
Redis Cluster
程序环境:
配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
6379/tcp
客户端:/usr/bin/redis-cli
Unit File:/usr/lib/systemd/system/redis.service
数据目录:/var/lib/redis
命令
redis-cli # 安装完成可以直接连接
help
To get help about Redis commands type: "help @
数据类型
Strings, Lists, Hashs, Sets, Sorted Sets, Bitmaps, Hyperloglogs
数据类型
使用hele @下面这些value能查看详细信息
redis:k/v:
key:直接ASCII字符串;
value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
group
group: @generic, @string, @list, @...
string
@string SET GET EXISTS INCR DECR SETNX SETEX INCRBYFLOAT MGET MSET
list
@list LPUSH RPUSH LPOP RPOP LPUSHX RPUSHX LRANGE LINDEX LSET
set
@set SADD SPOP SREM SRANDMEMBER SINTER SUNION SDIFF
sort_set
@sorted_set ZADD ZCARD ZCOUNT ZRANK ...
hash
@hash HSET HMSET HGET HMGET HKEYS HVALS HDEL HGETALL ...
pubsub
@pubsub PUBLISH SUBSCRIBE UNSUBSCRIBE PSUBSCRIBE PUNSUBSCRIBE ...
事务:
通过MULT,EXEC,WATCH等命令实现事务功能,将一个或多个命令并归一个操作提请服务器按顺序执行的机制
MUTI:启动一个事务
EXEC:执行一个事务;
一次性将事务中的所有操作执行完成后返回给客户端;
WATCH:乐观锁,EXEC命令执行前,用于监控指定数量键,如果如果监控中的某任意键数据被修改,则服务器拒绝执行事务
回顾:
分布式系统两个基础理论:CAP/BASE
CAP:AP,CP C、A、P:三者其中之二; AP:可用性、分区容错性、弱一致性;BASE:BA,S,E BA:基本可用、S:软状态、E:最终一致性;
分布式系统:
分布式存储:
NoSQL:
kv、document、column families、GraphDB
分布式文件系统:文件系统接口
分布式存储:API,不能挂载;
分布式运算:mapreduce, ...
NewSQL:
PingCAP:TiDB(MySQL protocol)...
redis:REmote DIctionary Server
数据结构:String, List, Set, sorted_set, Hash, pubsub ...
命令
redis-cli命令
Usage: redis-cli OPTIONS]]-h HOST-p PORT-a PASSWORD-n DBID
与Connection相关命令:
help @connection
AUTH
清空数据库:
FLUSHDB:Remove all keys from the current database 清空当前数据库; FLUSHALL:Remove all keys from all databases 清空所有数据库;
Server相关的命令:
CLIENT GETNAME
*CLIENT KILL CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no] *CLIENT LIST CLIENT PAUSE CLIENT PAUSE timeout CLIENT REPLY CLIENT SETNAME:Set the current connection name SHUTDOWN [NOSAVE|SAVE] INFO:服务器状态信息查看;分为多个secion; INFO [section]
配置运行时参数
CONFIG GET # 获取设定 CONFIG RESETSTAT #重置计数器 CONFIG REWRITE #可重写配置为文件,让运行时配置写入文件 CONFIG SET # 设置 参数
Redis的持久化:
RDB:snapshotting, 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
BGSAVE:异步;
AOF:Append Only File, fsync
记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
BGREWRITEAOF:AOF文件重写;
不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;
1.RDB相关的配置: 快照
*save
表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化,300s内至少有10个key有变化,60s内至少有1W个key发生变化;
stop-writes-on-bgsave-error yes
dump操作出现错误时,是否禁止新的写入操作请求;
rdbcompression yes
是否进行文件压缩
rdbchecksum yes
对rdb文件进行校验
dbfilename dump.rdb
指定rdb文件名
*dir /var/lib/redis:rdb
文件的存储路径
.AOF相关的配置
appendonly noappendfilename "appendonly.aof"appendfsync ;将数据从内核内存写到磁盘上面 Redis supports three different modes: no:redis不执行主动同步操作,而是OS进行; everysec:每秒一次; always:每语句一次; no-appendfsync-on-rewrite no 是否在后台执行aof重写期间不调用fsync,默认为no,表示调用; auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb 上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB;
重写过程
redis 主进程通过fork创建子进程
子进程根据redis内存中的数据创建数据库重建命令顺序于临时文件中
父进程继承Client的请求,并会把这些请求中的写操作继续追加到原本的AOF文件,额外的,这些新的写请求还会被放置于一个缓冲队列中
父进程用临时文件替换老的aof文件
aof-load-truncated yes
注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份;
RDB与AOF同时启用: 不建议
(1) BGSAVE和BGREWRITEAOF不会同时进行;(2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;
redis cluster
redis的集群技术:
主/从
主:rw从:read-only
客户端分片代理分片:
主从复制
特点:
一个Master可以有多个slave主机,支持链式复制;
Master以非阻塞方式同步数据至slave主机;
配置slave节点:
redis-cli> SLAVEOF
配置参数:
slaveofmasterauth [replication] 段的内容slave-serve-stale-data yesslave-read-only yes*repl-diskless-sync no no, Disk-backed, Diskless
新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization",此时其同步方式有两种style:
Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点;
Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;
repl-diskless-sync-delay 5repl-ping-slave-period 10repl-timeout 60repl-disable-tcp-nodelay norepl-backlog-size 1mbslave-priority 100
复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;
sentinel:不能只有一个,至少三个
主要完成三个功能:监控、通知、自动故障转移
选举:流言协议、投票协议
配置项:
port 26379sentinel monitor
sentinel down-after-milliseconds
监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
sentinel parallel-syncs
指在failover过程中,能够被sentinel并行配置的从节点的数量;
sentinel failover-timeout
sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;
sentinel notification-script
通知脚本,此脚本被自动传递多个参数;
暂定
发布和订阅(publish/subscribe)
频道:消息队列
SUBSCRIBE:订阅一个或多个队列
PUBLISH:向频道发布消息
UNSUBSCRIBE:退订此前订阅的频道
PSUBSCRIBE:模式订阅
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT redis-cli> SENTINEL masters SENTINEL slaves
豌豆荚:codistwitter:twemproxy
课外实践:codis的测试和应用;
博客作业: (1) replication, sentinel (2) rdb, aof 课外实践: (1) codis (2) redis cluster