redis

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 <dbid>

网络配置项:
bind IPport PORTprotected-modetcp-backlogunixsocket timeout:连接的空闲超时时长;

安全配置:
requirepass <PASSWORD> # 做认证用的rename-command <COMMAND> <NEW_CMND_NAME>
在AOF或Replication环境中,不推荐使用;

Limits相关的配置:
maxclientsmaxmemory <bytes>maxmemory-policy noeviction
淘汰策略: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 <hard-limit> <soft-limit> <soft-limit seconds>
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 @<group>" to get a list of commands in <group> "help <command>" for help on <command> "help <tab>" to get a list of possible help topics "quit" to exit

数据类型
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 <password> ECHO <message>PING QUITSELECT dbid
清空数据库:
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 <seconds> <changes>save 900 1save 300 10save 60 10000
表示:三个策略满足其中任意一个均会触发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 <MASTER_IP> <MASTER_PORT>redis-cli> CONFIG SET masterauth <PASSWORD>
配置参数:
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 10​repl-timeout 60​repl-disable-tcp-nodelay norepl-backlog-size 1mb​slave-priority 100

复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;

min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;

sentinel:不能只有一个,至少三个
​ 主要完成三个功能:监控、通知、自动故障转移
​ 选举:流言协议、投票协议
配置项:
port 26379​sentinel monitor <master-name> <ip> <redis-port> <quorum>​sentinel auth-pass <master-name> <password>

<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障; s_down: subjectively down o_down: objectively down
sentinel down-after-milliseconds <master-name> <milliseconds>
监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
sentinel parallel-syncs <master-name> <numslaves>
指在failover过程中,能够被sentinel并行配置的从节点的数量;
sentinel failover-timeout <master-name> <milliseconds>
sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败;
sentinel notification-script <master-name> <script-path>
通知脚本,此脚本被自动传递多个参数;

暂定
发布和订阅(publish/subscribe)
频道:消息队列

SUBSCRIBE:订阅一个或多个队列

PUBLISH:向频道发布消息

UNSUBSCRIBE:退订此前订阅的频道

PSUBSCRIBE:模式订阅

​ ​
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT redis-cli> SENTINEL masters SENTINEL slaves <MASTER_NAME> SENTINEL failover <MASTER_NAME> SENTINEL get-master-addr-by-name <MASTER_NAME>

豌豆荚:codistwitter:twemproxy

课外实践:codis的测试和应用;
​ ​ ​ ​ ​ ​
博客作业: (1) replication, sentinel (2) rdb, aof 课外实践: (1) codis (2) redis cluster
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​
​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容