nosql (not only sql)非关系型数据库(需要多多练习使用)
Nosql数据库种类较多,但是都有一个特点是去点关系型数据库的关系特性。
互联网的
三高:高并发、高扩展、高负载
3V:海量(Volume)、多样(Variety)、实时(Velocity)
验证或查看redis命令:
ps -ef|grep redis
netstat -antp | grep redis
redis的配置文件中设定了数据库的个数,默认是16个(0-16-1个)
select 切换数据库
DBsize查看当前数据库的key的数量
linux下启动redis:
进入到redis安装目录(我的路径):cd /usr/local/redis/bin/
将会看到有很多相关的redis文件,启动并访问redis服务:
./redis-server redis.conf
./redis-cli -p 6379
redis的通用命令:
keys *
exists key的名字,判断某个key是否存在
move key db 当前库被移除
expire key 秒值 给当点的key设置过期时间
ttl key 查看还有多少秒过期 -1表示永不过期 -2表示已经过期
type key 查看你的key是什么类型
dbsize 数据库的大小
注:一般不会使用redis的长命令
例如:keys,flushall,flushdb,slow lua script,mutil/exec,operate big value
redis的五大数据类型
redis对象包括:数据类型、内部编码
redis的键Key | 内部的编码 |
---|---|
String | raw、int、embstr |
hash | hashtable、ziplist |
list | linkedlist、ziplist |
set | hashtable、insert |
zset | skiplist、ziplist |
1.redis的String 字符串:string是redis最基本的类型,一个key对应一个value,最大的value最多可以是512M。可以存图片或者序列化的对象(常用命令)
set/get/del/append/strlen
Incr/decr/incrby/decrby
getrange/setrange:getrange key start end;setrange key start end
setex(set with expire)键秒值/setnx(set if not exist)
mset/mget/msetnx(mget或mset是批次处理,1次mget时间= 网络时间+n次的命令时间)时间复杂度为O(N)
getset(先get再set)
append 在次机床叠加字符串
2.redis的Hash哈希:是一个键值对的集合,适用于存储对象(k,v模式,v是一个键值对,常用命令)
hset/hget/hmset/hmget/hgetall/hdel 基本的添加与查询
hlen 查询长度
hexist key 在key里面的某个值的key
hkeys/hvals
hincrby/hincrbyfloat
hsetnx 如果存在不插入,不存在插入
3.redis的List列表:是一个简单的字符串列表
lpush/rpush/lrange
lpop/rpop
lindex:按照索引下标获取元素
llen :查看集合长度
lrem key 删除N个value
ltrim key 开始index 结束index:截取指定范围的值后在赋值给key
rpoplpush 源列表 目的列表
lset key index value
linsert key before/after 值1 值2
4.redis的Set集合:是一个无序无重复的集合(单值多value,常用命令)
sadd/smembers/sismember
scard:获取集合里面的元素个数
srem key value :删除集合中元素
srandmember key 某个整数
spop key :随机出栈
smove key1 key2 在key1里某个值 作用是将key1中的某个值赋给key2
数学集合类:差集:sdiff 交集:sinter 并集:sunion
5.redis的Zset(Sorted set:有序集合):有序的集合,不允许有重复的成员,每个元素都会有一个关联的double类型的分数,根据分数进行从小到大的排序
- zadd/zrange
注:zrange常与withscores联合使用
- zrangebyscore key 开始score 结束score
注:zrangebyscore key 开始scorre 结束score (withscore 或者‘(’表示不包含或者limit返回限制)
例子1:zrangescore zset01 60 (90 表示zset集合中分数大于等于60小于90的元素的键值对的键值
例子2:zrangescore zset01 60 (90 withscores 表示zset集合中分数大于等于60小于90的元素整个键值对
例子3:zrangescore zset01 60 (90 limit 2 2 表示zset集合中分数大于等于60小于90的元素键值从2位置查两个
- zcard/zcount key score区间/zrank key values值,作用是获取下标值/zscore key 对应值,获得分数
- zrevrank key values 作用是逆序获取下标值
- zrevrange
- zrevrangebyscore key
redis的配置文件redis.conf:
Unitsd单位:对于大小写不敏感,GB gb 都一样。
INCLUDES包含:标准的模板,可以包含其他的配置文件,使用include进行引入
GENERAL:TCP-backlog=511(默认),其是一个连接队列。还包含redis日志,四个日志级别:debug、verbose、notice、waring
SNAPSHOTTING快照:
SECURITY安全:
自己配置密码:config set requirepass “123456”
登录时需验证:auth 123456
LIMITS限制:Maxclients、Maxmemory、Maxmemory-policy、Maxmemory-samples(默认5个样例)
Maxmemory-policy缓存过期机制:
volatile-lru:使用LRU(最近最少使用淘汰)算法移除key,只针对于过期时间的键
allkeys-lru:使用LRU(最近最少使用淘汰)算法移除key
volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
allkeys-random:移除随机的key
volatile-ttl:移除那些TTL(设置存活时间)值最小的key,即就是将要过期的key
noeviction:不进行移除,针对写操作(永不过期)
APPEND ONLY MODE追加
Redis中的功能:
慢查询、pipeline、发布订阅、Bitmap、HyperLogLog、GEO
- 1.慢查询:(慢查询默认配置:slowlog-max-len = 128和slowlog-log-slower-than = 10000)
客户端请求的生命周期:客户端发送命令;排队;执行命令;返回结果。第三阶段慢执行称为慢查询,客户端超时可能不是慢查询的原因。
动态配置:config set slowlog-max-len = 1000
slowlog get[n]:获取慢查询队列
slowlog len :获取慢查询队列长度
slowlog reset:清空慢查询队列
slowlog-max-len默认10毫秒,通常设置1ms
slowlog-log-slower-than队列长度大多设置在1000
pipeline流水线:多次操作可以分批进行操作,例如10000次可以分为100*100
发布订阅(客户端与客户端之间的消息,类似于生产者消费者)
public channel mrssage 发布消息
subscribe channel 订阅频道
psubscribe [pattern] 订阅模式
- Bitmap(位图)
setbit key offset value 给位图指定索引设置值
getbit key offset 获取位图指定索引的值
bitcount key [start end] 获取指定范围的值
bittop op destkey key [key…]
- HyperLogLog(极小控件数据统计)
pfadd key element [emelent]
pfcount key [key]
- GEO(redis3.2的功能)存储两个地理的经纬度,用于计算两地距离
geoadd key 精度 维度 标识
geopod key 标识 [标识]
geodist key 标识1 标识2
georadius key 精度 维度 选项
Redis持久化:
1.RDB(Rdies DataBase):在指定时间间隔内将数据集快照写入磁盘,Snapshot快照,恢复时将快照读到内存。Redis会单独创建一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束,再用该临时文件替换上次持久化好的文件,整个过程中主进程不进行IO操作,这样确保了极高的性能。对于需要进行大规模数据的恢复,且对于数据恢复的完整性不敏感,那么RDB方式比AOF方式更加高效。(时间复杂度O(N))
Fork的作用是复制一个与当前进程一样的进程,新进程的所有数据数值都和原进程一致。
Rdb保存的是dump.rdb文件:
命令save 秒值 改动次数 (同步)
bgsave (异步)
自动生成该文件
经常将配置文件中的save命令关掉,手动进行save
dbfilename dump-${port}.rdb
如何触发Rdb快照:将备份的dump.rdb拷贝到redis启动的目录下进行启动
2.AOF(Append Only File):以日志的形式来记录每个写文件,是将redis执行的所有写过程指令记录下来(读不记录),只允许追加文件但不可以改文件,redis启动之初会读取改文件重新构建数据,即redis将所有写指令从前到后执行一次恢复数据。
Aof保存的是appendonly.aof(如果开启aof默认加载改文件进行开启redis):文件出现错误时,启动redis失败,可以使用命令进行自动修复,将不符合的语法进行剔除。
redis-check-aof –fix appendonly.aof
Rewrite:Aof采用文件追加方式,文件会越来越大,为了避免此情况,新增加重写机制,当aof文件大小超过所设定的阈值时,Redis就会启动Aof文件内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof。
重写(rewrite)原理:增长过大时,将fork出新的进程,将文件重写,遍历新进程内存中数据,每条记录有一条Set语句,重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写一个新的aof文件,与数据库快照类似。
重写触发机制:Redis会记录上次重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍且文件大小等于64M
aof默认是时刻进行记录,保证数据完整,缺点是相同数据集的数据而言aof文件远大于rdb文件,恢复速度慢于rdb,Aof运行效率要慢于rdb。每秒同步策略效率较好,不同步效率与rdb相同。
数据持久化选择:
RDB持久化方式能够在指定时间间隔对数据进行快照存储;AOF持久化方式记录每次对服务器写的操作,当服务器重启的是时候会重新执行这些恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾
redis只做缓存时,可以不用持久化
同时开启两种持久化,redis优先加载aof来恢复原始数据,rdb用作后备用途,每15分钟进行一次备份即可(保留规则:save 900 1)
Redis事务:一组命令的集合,一起成功一起失败。一个事务中的所有命令被序列化,按顺序地串行执行而不会被其他命令插入,不允许加塞。
事务作用:一个队列中,一次性、顺序性、排他性的执行一系列命令
事务开启命令:MULTI 使用调用事务命令:EXEC
取消事务命令:DISCARD 取消watch命令对所有key的监视:UNWATCH
监视一个或多个key命令,事务执行前数据被改则事务被打断:WATCH
Redis对于事务是部分支持
执行事务、放弃事务、
全体连坐(事务中的某一条指令不可加入队列中,导致整个指令队列全部错误)、
冤头债主(事务中的某一条指令有错误,但是能够加入队列,只有执行的时才会出错)、watch监控(悲观锁/乐观锁/CAS:check and set)
悲观锁:认为每次数据访问时一定会被别人修改,所以每次拿取数据时锁定整个表,别人想要操作数据时进入阻塞直到拿到锁,例如:关系型数据库中的行锁、表锁、读锁、写锁
乐观锁:认为每次拿取数据时,别人不会修改数据,相当于列锁,添加一个版本列
Redis的发布订阅:进程间的一种消息通信模式:发送者(Pub)发送消息,订阅者(sub)接受消息
订阅频道(channel):SUBSCRIBE c1 c2 c3
消息发布:PUBLISH c1 消息
订阅多个,通配符:PSUBSCRIBE new*
Redis的复制(Master/Slaver):即主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主(读写分离、容灾恢复)
从库配置:slaveof 主库ip 主库端口
主机挂掉,从库上升为主库:slaveof no one
从库配置操作,拷贝多个redis.conf文件;开启daemonize yes;pid文件名字;指定端口;log文件名字;dump.rdb名字
一主两仆:一个主机两个丛机,使用slaveof指向主机,只允许主机写数据,主机down掉,丛机等待主机复原,丛机down掉需要重新与主机建立连接,可以在配置文件中写就不需要每次手动连接
主从复制原理,Slave启动成功连接到master后会发送一个sync命令,Master接到命令启动后台的存盘进程,同时收集所有接收到的修改数据集的命令,在后台进程执行完毕之后,master将传送整个数据文件slave
全量复制:slave服务接收到数据库文件数据后将其存盘并加载到内存中
增量复制:Master继续将新的所有收集到的修改数据的命令依次传递给slave,完成同步,每次重新连接需要做依次全量复制
常用的模式是哨兵模式(Sentinel)步骤:
针对于主从复制的体系,主机挂机的情况下,从丛机中进行投票进行选举一个新的主机,步骤:
自定义配置文件,与redis.conf文件相同的路径建立一个sentinel.conf文件
配置哨兵:sentinel monitor 被监控数据库名字 (自己起一个名字) 127.0.0.1 6379 1
配置文件中的数字1表示主机挂掉后,票数多的成为新的主机
启动哨兵:Redis-sentonel sentinel.conf
redis配置实例:
功能包括:(http://gethub.com/sohutv/cachecloud)
1.一键启动Redis。(Standalone、Sentinel、Cluster)
2.机器、应用、实例监控和报警
3.客户端:透明使用、性能上报
4.可视化运维:配置、扩容、Failover、机器/应用/实例上下线。
redis配置参数:
daemonize:是否是守护进程(no|yes)
port:端口设置
logfile:日志文件
dir:redis工作目录