Redis

Nosql:非关系型的数据库;
1、键值对存储;
2、nosql数据库是动态结构,可以很容易适应数据类型和结构的变化。
3、nosql数据库是横向扩展,可扩展性。
4、关系型数据库遵循acid原则,nosql在CAP(一致性、可用性、分区容错性)中任选两项。
CA 传统oracle,AP 大多数网站架构,CP Redis
BASE是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案,通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。
5、nosql读写性能好。

Nosql四大分类:
1、KV键值对 Redis
2、文档型数据库(bson格式)MongoDB一个基于分布式文件存储的数据库;
3、列存储数据库
4、图关系数据库

分布式:不同的多台服务器上面部署不同的服务模块,通过Rpc之间通信和调用,对外提供服务和组内协作。
集群:不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。

CAP定理(CAP theorem)
在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

一致性(Consistency) (所有节点在同一时间具有相同的数据)
可用性(Availability) (保证每个请求不管成功或者失败都有响应)
分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

Redis

REmote DIctionary Server(远程字典服务器)
Redis特性
1、Redis存储结构支持key-value类型,还支持list,set,zset,hash等数据结构的存储;
2、内存存储和数据持久化;
3、支持数据的备份;

安装注意事项:
1、可能提示没有gcc,使用yum install gcc yum install gcc-c++ gcc -v
2、二次安装时候可能会报错,make distclean,之后再次安装,make install
安装之后Redis的可执行文件会复制到/usr/local/bin目录内:
redis-server redis服务器,启动命令
redis-cli redis命令行客户端
redis-benchmark redis性能测试工具
在命令行中输入 shutdown,关闭redis
flushall 清除redis所有库的数据

Redis单进程,默认16个库;
默认的5大数据类型:
String,Hash,List,Set,Zset;

key
keys *
exists key,判断某个key是否存在
del key 删除键
del不支持通配符,所以可以用这个命令:redis-cli keys “user*” | xargs redis-cli del
move key db 把某个数据移动到另一个库中
expire key 秒钟:给key设定时间,时间一过数据删除
ttl key 查看还有多少秒过期,-1永不过期,-2已过期
type key 查看key是什么类型

String
set/get/del/append/strlen
incr/decr/incrby/decrby,递增数字,一定是数字才能加减
getrange/setrange
setex(set with expire)键秒值/setnx(set if not exist)
mset/mget/msetnx(都不存在才能放进去)

List
lpush/rpush(先进先出)/lrange(先进后出)
lpop/rpop(跟上边的r,l)
lindex,按照索引下表获取元素
llen
lrem key 删n个value
ltrim key 开始index 结束index,截取指定范围后再重新赋值给key
rpoplpush源列表 目的列表
lset key index value
linsert key before/after 值1 值2

Set
sadd/smembers/sismember
scard 获取集合里面的元素个数
srem key value 删除集合某个元素
srandmember key count 随机获取set中数
spop key 随机出栈
smove key1 key2 value 把key1的某个值移动到key2
sdiff 差集,sinter 交集,sunion 并集

Hash
KV模式不变,但V是一个键值对;
hset/hget/hmset/hmget/hgetall/hdel
hlen
hexists key 在key里面的某个key值
hkeys/hvals 获取全部的key value
hincrby/hincrbyfloat
hsetnx

Zset
在set基础上,加一个score值;
zadd/zrange (withscores)
zscore key number
zrangebyscore key 开始score 结束score,(表示不包括,limit 截取;
zrem key 某score下对应的value值,作用是删除元素
zcard/zcount key score区间 / zrank key values值,作用是获取下标 /zscore key 对应值,获取分数
zrevrank key values值,作用是逆序获得下标值
zrevrange
zrevrangebyscore key

解析配置文件 redis.conf

请查看我另一篇文章–redis.conf详细配置

redis持久化
rdb
rdb:在指定的时间间隔内将内存中的数据集快照写入磁盘,恢复时将快照文件直接读到内存;
redis会单独创建一个fork子进程来进行持久化,先将数据写入到一个临时文件中,待持久化操作结束后,用这个临时文件替换上次持久化好了的文件。
默认触发条件:
1分钟修改1万次,或5分钟修改10次,或15分钟修改1次;
恢复:将备份文件(dump.rdb)移动到redis安装目录并启动服务即可,config get dir 获取目录
注:shutdown,fullall,save等操作会把redis内存刷到dump文件中;
适合大规模数据恢复,对数据完整性和一致性要求不高;意外挂掉,丢失最后一次快照fork时需要同样大的内存空间

aof
以日志的形式来记录每个写操作;
redis-check-aof --fix appendonly.aof 修补损坏的aof文件
开启关闭:appendonly yes
策略:appendfsync always,everysec,no
rewrite:默认配置是当AOF大小是上次rewrite后大小的一倍且文件大于64M时触发;
数据一致性高,但文件会很大,恢复速度慢。

Redis事务
开启:MULTI
执行:EXEC
放弃本次提交:DISCARD
watch监控:
悲观锁就是每次去拿数据时候都会上锁,如行锁,表锁等。
乐观锁(version)每次拿数据时候认为别人不会修改,所以不会上锁,但在更新时候会判断一下期间是否有人更新过,可以使用版本号机制,多用于读应用。
UNWATCH 取消WATCH命令对所有key的监视。
执行过程:开启,入队,执行。
特性:单独的隔离操作(按顺序执行),没有隔离级别的概念(一起提交),不保证原子性(一条命令执行失败,其后面的命令任然会被执行)。

1、当输入命令时候就检测到这个命令是错误的,之后执行EXEC命令就会报错,所有的操作都不会倍执行;
2、当输入命令时没报错,但在执行时候报错了,这时候除了报错的操作不能执行,其余正确的命令可以执行;

发布订阅
进程间的一种消息通信模式,pub,sub。

主从复制
主机数据更新后根据配置和策略,自动同步到备机master/slaver机制,master以写为主,slaver以读为主。
redis-cli -p 端口号
info replication 查看redis信息
slaveof no one 设置成master
用法:
1、配从不配主;配置从机,SLAVEOF 127.0.0.1 6379;
2、从机挂了之后,需要重新配置连接主机,除非配置到redis.conf文件
3、主机挂了,从机原地待命,主机重启之后,从机自动连上,继续工作;
4、主机连接一个从机,这个从机可以当别的从机的主机;
5、主机挂了,其中一个从机1反客为主当上了主机,执行SLAVEOF命令使从机2变成这个从机1的从机,这时候主机重启,从机1,2跟这个主机没有关系了。
反客为主:SLAVEOF no one 使当前数据库停止与其他数据库的同步,转成主数据库。

复制原理:
1、slave启动成功连接到master后会发送一个sync命令;
2、master接到命令启动后台的存盘进程,同时收集所有即接收到用于修改数集的命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步;
全量复制:slave接收到数据库文件后,将其存盘并加载到内存中。
增量复制:master继续将新的所有收集到的修改命令一次传给slave完成同步;
但只要重新连接master,一次完全同步(全量复制)将自动执行。

哨兵模式
反客为主自动版,能够后台监控主机是否故障,如果故障,根据投票自动将从库转为主库;
用法:
1、一主二从三台机器;
2、自定义的/myconf目录下新建sentinel.conf文件。
3、文件内容,sentinel monitor host6379 127.0.0.1 6379 1(最后1代表主机挂之后,谁得票超过1就当主机)。
4、执行命令 redis-sentinel /myconf/sentinel.conf
5、当主机挂了之后,从机中选出一个当主机,当原来的主机重启后,自动变成从机。

复制缺点:有一定延迟。

Jdeis
事务:Transaction
管理工具
redis-cli中:
slowlog get命令获得当前的耗时命令日志;
monitor命令监控redis执行的所有命令;

后记
HyperLogLog是用来做基数统计,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
命令:

PFADD
将指定的元素添加到指定的HyperLogLog 结构中。

PFCOUNT
参数为一个key时,返回存储在HyperLogLog结构体的该变量的近似基数,如果该 变量不存在,则返回0。
当参数为多个key时,返回这些HyperLogLog 并集 的近似基数。

PFMERGE
将多个 HyperLogLog 合并(merge)为一个 HyperLogLog。

127.0.0.1:6379> PFADD count1 a b c d    //往count1添加4个元素
(integer) 1 
127.0.0.1:6379> PFCOUNT count1          //返回估计值为4
(integer) 4
127.0.0.1:6379> PFADD count2 a c e f    //往count2添加4个元素
(integer) 1
127.0.0.1:6379> PFCOUNT count2          //返回估计值为4
(integer) 4
127.0.0.1:6379> PFCOUNT count1 count2   //返回count1和count2并集的估计值6
(integer) 6
127.0.0.1:6379> PFMERGE count3 count1 count2    //将count1和count2合并到count3中
OK
127.0.0.1:6379> PFCOUNT count3                  //返回count3的估计值6
(integer) 6  

GEO
把某个具体的位置信息(经度,纬度,名称)添加到指定的key中,数据将会用一个sorted set存储。
命令:
GEOADD 添加一个或多个地理位置元素到一个key中
GEODIST 返回一个key中指定两个位置之间的距离
GEOHASH 返回一个或多个位置元素的 Geohash 表示
GEORADIUS 以给定位置为中心,半径不超过给定半径的附近所有位置
GEORADIUSBYMEMBER 和GEORADIUS相似,只是中心点不是指定经纬度,而是指定已添加的某个位置作为中心

SCAN
scan命令可以代替keys命令来进行查找数据,它不会阻塞线程,查出数据可能重复。

Redis 缓存穿透:
查询一个数据库中不存在的数据,每次都会去访问DB,恶意访问时候会造成数据库压力
解决:从数据库中查出不存在时候,将 key 对应的 value 设置为 null 并设置一个失效时间。

Redis 缓存击穿:
缓存中的一个Key(比如一个促销商品),在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
解决:对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询

Redis缓存雪崩:
我们设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。
解决:将系统中key的缓存失效时间均匀地错开,防止统一时间点有大量的key对应的缓存失效。

为什么会有淘汰?
Redis可以看作是一个内存数据库,可以通过Maxmemory指令配置Redis的数据集使用指定量的内存。设置maxmemory为0,则表示无限制(这是64位系统的默认行为,而32位系统使用3GB内隐记忆极限)。

maxmemory 100mb
1
当内存使用达到maxmemory极限时,需要使用某种淘汰算法来决定清理掉哪些数据,以保证新数据的存入。

常用的淘汰算法:

FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。
LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。
Redis提供的淘汰策略:

noeviction:达到内存限额后返回错误,客户尝试可以导致更多内存使用的命令(大部分写命令,但DEL和一些例外)
allkeys-lru:为了给新增加的数据腾出空间,驱逐键先试图移除一部分最近使用较少的(LRC)。
volatile-lru:为了给新增加的数据腾出空间,驱逐键先试图移除一部分最近使用较少的(LRC),但只限于过期设置键。
allkeys-random: 为了给新增加的数据腾出空间,驱逐任意键
volatile-random: 为了给新增加的数据腾出空间,驱逐任意键,但只限于有过期设置的驱逐键。
volatile-ttl: 为了给新增加的数据腾出空间,驱逐键只有秘钥过期设置,并且首先尝试缩短存活时间的驱逐键

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值