评论

收藏

[NoSQL] 数据库(Nosql)redis

数据库 数据库 发布于:2021-11-16 10:02 | 阅读数:507 | 评论:0

redis
一、Redis介绍
1、Nosql简介
数据超过300w 建立索引,缓存来解决数据库压力分库分表:分部署单元集群,按业务需求来分库分表数据库:读、写MySAM:表锁、高并发出现问题Innodb:行锁redis每秒读11万次,写8万次、缓存记录级、是一种细粒度缓存,性能高cap定理和base大数据3v:海量、多样、实时大数据3高:高并发、高可扩、高性能2013年的斯诺登事件去IOE:2013年棱镜门事件思科、IBM、google、高通、英特尔、苹果、甲骨文、微软并称为美国的“八大金刚图片:分布式文件系统:FastDFS - 淘宝:TFS - Google:GFS - Hadoop:HDFS - 阿里云:OSS商品得描述、评论: -文档数据库:MongDB商品得基本信息: -关系型数据库:mysql oracle推荐文章:《阿里云得这群疯子》商品搜索:  solr  elasticsearch  - 阿里云:iserach 多隆、王坚商品得秒杀信息:  - 内存型数据库  - redis  memcahe tair商品交易:  - 三方应用统一数据服务平台(Mapping DSL):承接后端各类数据库,作为唯一数据代理层,提供统一的数据服务,使得各数据源对上层透明,简化数据结构。提供跨异构数据源的模型数据映射。UDSL:采用统一的查询/更新API 统一了不同数据源的查询方式Nosql存储类型:键值对存储、文档存储、图形存储、列存储键值对  - 新浪:redis  - 美团:redis+Tair  - 阿里、百度:redis+memcache文档  - MongDB:是一个基于分布式文件存储的数据库,C++编写,主要用来处理  大量的文件,是一个介于关系型数据库和非关系型数据库中间的产品,   MongDB是非关系型数据库中功能最丰富,最像关系型数据库的。列存储(列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程,不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,列式存储的话,比如你比较关注的都是某几列的内容,或者有频繁聚集需要的,通过聚集之后进行数据分析的表)  - Hbase  - 分布式文件系统  - Cassandra图片(存储关系,例如朋友圈、广告推荐)  - Neo4j  infoGrid  Graph
2、redis概述
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI [C语言](https://baike.baidu.com/item/C语言)编写、支持网络、可基于内存亦可持久化的日志型、Key-Value[数据库](https://baike.baidu.com/item/数据库/103728),并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由[Pivotal](https://baike.baidu.com/item/Pivotal)赞助redis是一个key-value[存储系统](https://baike.baidu.com/item/存储系统)string(字符串)list([链表](https://baike.baidu.com/item/链表))set(集合)zset(sorted set --有序集合)hash(哈希类型)
操作都是原子性的,redis支持各种不同方式的排序,为了保证效率,数据都是缓存在内存中,redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助内存存储、持久化(rdb、aof)、内存中断电丢失高速缓存发布订阅系统地图信息分析计数器、计时器(浏览量)官网:https://redis.io中文网:http://www.redis.cn
3、redis部署
Linux安装步骤1、下载安装​   https://redis.io/download最新版本  - redis-6.2.1.tar  - 解压  - mkdir /u01  - mv /home/redis-5.0.8.tar.gz  /u01  - tar -zvxf redis-5.0.8.tar.gz2、安装基础环境yum install -y gcc-c++make make install gcc -v  #查看下版本redis 默认安装路径/usr/local/bin在/usr/local/bin目录下mkdir redis_configcd  /u01/redis-5.0.8cp  /u01/redis-5.0.8/redis.conf /u01/redis-5.0.8/redis.conf.bak  #备份原始配置文件mv  /u01/redis-5.0.8/redis.conf /usr/local/bin/redis_config/3、修改redis.conf配置文件,使其后台启动vim  redis.conf4、启动redis服务redis-server   redis_config/redis.conf5、客户端连接测试redis-cli  --helpredis-cli  -p 6379  -h localhost6、关闭redis服务
4、redis-benchmark性能测试
测试:100个并发连接,100000请求redis-benchmark  -h localhost  -p 6379  -c 100  -n  100000
5、redis基础知识
默认使用第0个可以使用select [index]进行切换数据库查看数据库大小 dbsize清空数据库  flushdb清空全局数据库  flushallkeys * 查看所有KEYexists name 判断key是否存在,1:代表存在,0:代表不存在move [key] [db]  move  name  1   从1库移除nameexpire [key]  [seconds] 设置KEY过期时间ttl key   查看key是否过期set  key  value  设置keyget  key     获取keytype name   查看key类型具体命令学习:http://www.redis.cnredis是单线程的:redis是基于内存操作,CPU不是redis的性能瓶颈redis的瓶颈是根据机器的内存和网络带宽。QPS每秒查询率(Query Per Second) TPS吞吐量redis单线程为什么还很快?误区:  1、高性能的服务器一定是多线程的  2、多线程(CPU上下文切换)一定比单线程效率高  3、CPU>内存>磁盘  核心:redis是将所有数据放在内存中的,所以使用单线程效率是最高的  多线程上下文切换耗时长,对于内存来说,多次读写都是在一个CPU上的。
6、redis的5大数据类型和3种特殊数据类型
字符串:string  计数器、粉丝数、对象缓存存储列表:list集合:sets散列:hashes有序集合:sorted sets地理空间:geospatial超日志:hyperloglog位图:bitmaps官方介绍:Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions, and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis ClusterRedis是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。Redis提供数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,地理空间索引和流。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。
6.1、string设计的命令
1setex key seconds value  设置过期时间setnx key value   不存在设置,分布式锁中会经常用到mset  key[1]  value[1]  key[2] value[2]mget  key[1]  key[2]msetnx  key1  value  key4  value  验证了原子性
6.2、list设计的命令
栈、队列lpush  key  value   rpush  key  value lrange key  start  stoplpop key rpop keylindex key indexllen  key        列表长度lrem key count value   移除################################################ltrim key start stop  截取指定长度...................
6.3、set设计的命令
########################################sadd key  member  添加smembers  key     查看sismember key member 判断集合里的成员是否存在#########################################scard  key 查看成员个数srem key member  移除set集合指定成员srandmember  key  [count] 随机抽取spop key  随机移除成员##########################################smove  source  destination  member  将指定的成员从一个集合移动到另一个集合sdiff key1  key2 差集sinter key1 key2 交集sunion key1 key2 并集##########################################
6.4、hash设计的命令
Map集合,key-maphset key field value hget key  field hmset key  field1  value1  field2  value2hmget key  field1  field2hgetall  key hdel  key  field#################################hlen key hkeys key  获取fieldhvals key  获取valuehash 适合存储对象,尤其是用户信息,经常变动的信息
6.5、zset设计的命令
薪水举例zadd salary 1 longzadd salary 2 wangzadd salary 3 jinzrangebyscore salary -inf +infzrangebyscore salary -inf +inf withscores
zrangebyscore salary -inf 2 withscoreszrem salary longzcard salary案例:工资表排序、排行榜应用等
6.6、geospatial设计的命令
附近的人、打车的距离、定位geoadd china:city 116.40 39.90 beijinggeoadd china:city 121.47 31.23 shanghaigeopos china:city beijing  获取经纬度geodist china:city beijing shanghai km  获取北京和上海之间的距离########################################附近的人GEORADIUS china:city 116 39 1100 km 以北京的经纬度为中心,以1100为半径开始搜索georadiusbymember china:city beijing 1100 km  GEOHASH china:city beijing  将二维的经纬度转换为一堆字符串zrange china:city  beijingzrange china:city  0 -1
6.7、hyperloglog设计的命令
超日志 做基数统计的算法网页的UV(一个人访问多次,也算一次)优点:占用内存固定,2^64不同元素的技术,只需要12kb内存
6.8、bitmaps设计的命令
位存储统计疫情感染人数0 0 0 0 0 0 0 0 ........   代表中国所有人数1 1 1 1 1 1 1 1 ........   代表感染人数就可以统计差值###########################################统计登录、活跃与不活跃、打卡操作二进制位进行记录,就0和1两个状态 0  1  2 3  4  代表周一到周五 0 代表没打卡  1 代表打卡 统计打卡天数: bitcount sign  使用数据结构来解决问题,更科学
7、redis基本的事务操作
redis事务本质:一组命令的集合,在事务执行过程中,按顺序执行一次性顺序性排他性redis单条命令保证原子性,但是事务不保证原子性,事务没有隔离级别的概念############################################- 开启事务  MULTI - 命令入队- 执行事务可以实现乐观锁事务执行完就结束,想用继续开启DISCARD 取消事务#############################################
8、redis乐观锁
乐观锁:认为不会出问题,不上锁悲观锁:认为随时有问题,啥时都上锁下面事务在未提交之前,无干预,没有其他线程修改money,所以可以执行成功测试多线程修改值,使用watch监视,可以当作redis的乐观锁在exec之前,另一个线程修改money,导致事务执行失败>执行失败怎么解决>>先取消执行失败的监视  unwatch>>开启监视  watch money >>开启事务 multi>>操作>>执行>>在看结果
9、redis配置文件详解
快照:持久化用到,在规定时间内,执行多少次操作,则会持久化.rdb/.aofbind 127.0.0.1  #网络配置protected-mode yes #保护模式port 6379   #端口设置daemonize yes  #守护进程开启如果900S内,有1个Key进行了改变,就进行持久化操作save 900 1save 300 10save 60 10000##########################stop-writes-on-bgsave-error yes  #持久化如果出错,是否继续进行rdbcompression yes  #是否压缩rdb文件,需要消耗一定的CPU资源rdbchecksum yes  #保存rdb文件的时候,是否进行错误校验dir ./   #rdb文件保存的目录dbfilename dump.rdb  #rdb备份的文件名maxclients 10000   #最大客户端连接maxmemory <bytes>   #最大内存maxmemory-policy noeviction   #内存达到上限如何处理Redis提供了「6种的淘汰策略」,其中默认的是noeviction,这6种淘汰策略如下:1.noeviction(「默认策略」):若是内存的大小达到阀值的时候,所有申请内存的指令都会报错。2.allkeys-lru:所有key都是使用「LRU算法」进行淘汰。3.volatile-lru:所有「设置了过期时间的key使用LRU算法」进行淘汰。4.allkeys-random:所有的key使用「随机淘汰」的方式进行淘汰。5.volatile-random:所有「设置了过期时间的key使用随机淘汰」的方式进行淘汰。6.volatile-ttl:所有设置了过期时间的key「根据过期时间进行淘汰,越早过期就越快被淘汰」。########################################
appendonly no  #默认不开启aof模式,默认使用rdb方式持久化,在大部分情况下,rdb就够用。appendfilename "appendonly.aof" #持久化文件的名字# appendfsync always  # 每次修改都会SYNC,消耗性能appendfsync everysec  # 每秒执行一次sync,可能会丢失这1s的数据# appendfsync no  #不执行sync,速度最快
10、redis持久化
RDB  在指定时间内将内存中的数据写入磁盘,也就是snapshot,恢复时就是将快照文件直接读到内存里,redis会单独创建fork一个子进程进行持久化,先将数据写入到一个临时文件中,待持久化过程结束了,在用这个临时文件替换上次持久化好的文件,整个过程中,主进程是不进行任何IO操作的,确保了性能,如果对于大规模数据恢复,且对数据完整性不敏感,rdb比aof高效,缺点是最后一次持久化的数据可能丢失###############################################触发机制:  - save的规则满足情况下,会自动触发RDB规则  - 执行Fushall命令,也会触发rdb规则  - 退出redis,也会触发生成rdb文件如何恢复rdb文件  - 只需要将rdb文件放在redis启动的目录下,redis启动就会自动检查dump.rdb  - 查看rdb存在的目录 127.0.0.1:6379> CONFIG GEt dir优点:  - 适合大规模的数据恢复  - 对数据的完整性要求不高缺点:  - 需要一定的时间间隔  - fork进程时候,会占用一定的内存空间AOF将执行的所有命令都记录下来,以日志的形式记录每个写操作,将redis执行过的所有指令记录下来(读操作不记录)只允许追加文件,不可以改写文件,redis启动会读取该文件重新构建数据,或者说,redis重启之后根据日志文件的内容将写指令从前到后一次性完成数据的恢复。重写机制:no-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb#######################################################如果AOF文件被恶意修改,导致启动redis失败,需要修复AOF文件,用redis-check-aof工具来修复  - redis-check-aof  --fix  appendonly.aof优点:  - 文件完整性好缺点:  - 修复速度慢  - IO操作,效率低
11、redis订阅发布
- 消息发送者  -  PUBLISH long  beijing- 频道  - long- 消息订阅者  - SUBSCRIBE long#############################################使用场景  - 实时消息系统  - 实时聊天  - 复杂场景用消息中间件(kfaka等)概念理解:  订阅者相当于加到这个频道的一个列表里,发送者相当于加到一个整体的字典里,字典里会有很多不同的频道
12、Redis主从复制搭建
最低配置:一主二从  数据复制是单向的,只能从主节点到从节点  - 数据冗余  - 故障恢复  - 负载均衡  - 高可用单台redis最大使用内存不应该超过20G只配置从库查看信息:info replication一主(6379)二从(6380、6381)配置二从(6380)  - slaveof 127.0.0.1 6379  - info replication配置二从(6381)  -     - 修改端口- 修改pid名字- Log文件名字- dump.rdb启动3个redis-server[root@localhost bin]# ps -ef | grep redisroot    15374    1  0 07:47 ?    00:01:02 redis-server 127.0.0.1:6379root    15715  15697  0 17:05 pts/1  00:00:00 redis-cli -p 6379root    15797    1  0 19:30 ?    00:00:00 redis-server 127.0.0.1:6380root    15807    1  0 19:31 ?    00:00:00 redis-server 127.0.0.1:6381root    15816  15451  0 19:32 pts/2  00:00:00 grep --color=auto redis修改配置文件来配置主从用命令来配置主从主机可以写,从机不能写,只能读,主机中的所有信息和数据,都会自动被从机保存主机断开连接,从机依旧是连接主机的,但是没有写操作,主机回来从机依旧可以获取主机信息。如果使用命令行配置的主从,重启后就会变成主机,只要变成从机,数据就会立马从主机获取回来
复制原理:slave启动成功后,向主发送一个SYNC同步命令,Master接受到命令,启动后台的存盘进程,同时收集所有接受到的用于修改数据集命令,在后台进程执行完毕后,Master将传送整个数据文件到Slave,并完成一次同步。全量复制:增量复制:主+从+从如果主机断开连接,在其他两从任意一个上使用slaveof  no  one可以使其变主,则另一个节点可以手动连接到这个主节点,如果主节点恢复,得重新连接,一般企业不会用,企业会用哨兵模式。
13、redis哨兵模式
redis2.8开始正式引入哨兵模式哨兵模式能监控主机是否故障,如果故障根据投票自动将从库转为主库哨兵是一个独立得进程,独立运行,哨兵通过发送命令等待redis服务器响应从而监控多个运行得redis实列
三哨兵+一主+两从1、具体配置哨兵文件vim   sentinel.conf​   sentinel  monitor  自定义监控名称  host  port    rum   # # rum代表主机挂了会进行投票2、启动哨兵​   /usr/local/bin/redis-sentinel    redis_config/sentinel.conf测试主机挂掉,这个时候会从从机中选择一个服务器(投票算法)具体多长时间新主机会上线?如果主机回来,只能充当从机优点:  - 哨兵基于主从复制  - 主从可以切换,实现故障转移,系统可用性会好  - 主从模式的升级,自动性缺点:  - 配置麻烦  - 集群容量达到上线,不好扩容
哨兵模式的全部配置  - 端口配置  26379  #如果哨兵集群,要配置多个端口  - 哨兵的工作目录  - sentinel  auth-pass <master-name>  <password>  - sentinel  down-after-milliseconds <master-name>  <milliseconds>   #指定多少秒之后,主节点没有应答,确定主机下线,默认30s  - sentinel  parallel-syncs   <master-name>  <numslaves>  - sentinel failover-timeout <master-name> <milliseconds> # 故障转移时间默认3分钟  - sentinel notification-script <master-name> <script_path>  #故障通知脚本  - sentinel client-reconfig-script  <master-name> <script_path>  #客户端重新配置主节点的参数脚本,就是主节点发生变化,会通知新的主节点# 消息队列怎么用# redis缓存的设计# 架构分析# ELK
14、redis缓存穿透和雪崩
############################################################缓存穿透:(查不到)用户查询数据,redis缓存里没有,于是向持久层数据库查询,数据库也没有于是查询失败,当用户非常多时,比如秒杀活动,一旦缓存中没有,就会对数据库造成非常大的压力,造成缓存穿透。############################################################解决方案:  1、布隆过滤器  布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,  在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查   询压力  2、缓存空对象  当存储层不命中时,即使返回空对象也将其缓存起来,同时会设置一个   过期时间,之后在访问这个数据会从缓存中获取,保护了后端数据。缓存空对象存在的问题:  - 如果空值被缓存起来,意味着缓存需要更多的空间  - 即使对缓存设置了过期时间,缓存层和存储层会有一段时间不一致    对一些业务一致性任务不合适      ############################################################缓存击穿:(量太大,缓存过期)指一个Key非常热点,不停抗着大并发,集中对一点进行访问,当Key在失效的瞬间,直接请求数据库,造成击穿。############################################################解决方案:  1、设置热点数据不过期  2、加分布式锁,保证每个key同时只有一个线程去查询后端服务,其他线程    没有权限,需要等待,转移了压力############################################################缓存雪崩:在指某一个时间段,缓存集中过期失效,redis集群宕机(停电、断网),所以热点数据肯定放在缓存中,所以要解决实际问题就是高可用(双11会停掉一些服务为了保证高可用,比如说退款)############################################################解决方案:  1、redis高可用,集群,异地多活  2、限流降级,通过加锁或者队列来控制读数据库写缓存的线程数量  3、数据预热,对可能的数据预先访问,对不同热数据进行设置不同的过期时间













关注下面的标签,发现更多相似文章