Redis详解

本文深入探讨了Redis在分布式架构中的应用,从单体架构和分布式架构的优缺点出发,重点讲解了Redis作为NoSQL解决方案的优势。详细介绍了Redis的内存维护策略,如设置超时时间、LRU算法。此外,文章还阐述了Redis在实际场景中的应用,如设置过期时间、数据结构和持久化机制。进一步讨论了Redis的主从复制,包括复制方式、工作原理和存在的问题。最后,提到了Redis哨兵模式,解释了哨兵系统如何解决主从复制的问题,实现高可用性和故障转移。
摘要由CSDN通过智能技术生成

分布式架构

  1. 不同业务功能模块分散部署在不同的服务器上
  2. 每个子系统负责一个或者多个不同的业务模块
  3. 服务之间可以相互交互与通信
  4. 分布式系统设计对用户透明,用户不考虑系统请求到那个服务器或者系统架构如何
  5. 可以发展为集群分布式系统架构

单体架构

弊端:例如造汽车,单体架构将所有零部件安装到车上,每个零部件(模块)之间耦合度比较高,如果某个零件需要升级,那么其他模块都需要跟着一起升级和部署。相当于车子中某个零部件坏了,需要把整个车子的零部件拆掉,再进行更换。

分布式架构

优点:
1、 业务解耦
2、系统模块化,可重用
3、提升系统并发量
4、优化运维部署效率,迭代发布会非常轻巧,只需要发布更新过的模块
缺点:
1、架构复杂
2、部署多个子系统复杂
3、系统之间的通信耗时
4、新人融入团队慢
5、调试复杂
设计原则:
1、异步解耦
把耦合的模块进行解耦,模块之间通信尽量使用异步,实在不行的情况使用同步,使用消息队列发送异步请求
2、幂等一致性,用户请求可能经过多个子系统,不管是查询还是增删改不能因为用户提高了两次还是三次,最终结果是一致的,不会因为多次点击产生副作用,尤其是增加或者删除,不会因为用户多次点击产生附加的影响
3、拆分原则,可以用多个拆分原则,以业务功能参考
4、融合分布式中间件
5、容错高可用

NoSql

非关系型数据库,为了解决大规模诗句集合多重数据种类带来的挑战,尤其是大数据应用难题。

传统数据库缺点

1、数据的读写操作频率较高,但由于传统数据库按照行存储,如果只想针对某一列进行运算,关系型数据库仍然会将整行数据从存储设备中读入内存,导致读写I/O占用较高。
2、存储的是行记录,无法存储数据结构
3、表结构schema扩展不方便,如要需要修改表结构,需要执行执行DDL(data definition language),语句修改,修改期间会导致锁表,部分服务不可用
4、全文搜索功能较弱,关系型数据库下只能够进行子字符串的匹配查询,当表的数据逐渐变大的时候,like查询的匹配会非常慢,即使在有索引的情况下。况且关系型数据库也不应该对文本字段进行索引
5、存储和处理复杂关系型数据功能较弱

NoSQL解决方案

NoSQL,泛指非关系型的数据库,可以理解为SQL的一个有力补充。

  1. 键值对数据库 Redis、Memcache
  2. 列式数据库 Hbase、Cassandra
  3. 文档型数据库 MongoDB、CouchDB
  4. 图形数据库

分布式缓存

  1. 任意服务器节点可以快速的拿到缓存数据
  2. 基于内存式的缓存

Redis

分布式缓存中间件、key-value形式存储、数据存储在内存中读取更快,提供海量数据存储访问。遵守BSD协议(开源协议,可以自由使用,修改源代码,也可以修改后的代码作为开源或再发布)

使用Redis的好处

官方测试50个并发执行100000个请求,读的速度110000次/s 写的速速81000次/s,高并发优秀的解决方案。

  1. 缓存数据存在与内存中,类似与HashMap查找和操作的时间复杂度都是O(1)
  2. 支持丰富数据类型,支持string,hash,list,set,zset
  3. 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
  4. 丰富的特性,可用于缓存,消息,计数,按key设置过期时间,过期后将会自动删除
  5. 单线程,预防多线程的竞态问题

Redis.conf配置文件

Redis的内存维护策略

redis时常会在内存中存储大量数据以满足高速读写的要求,即使集群部署来动态扩容,也应该及时整理内存,维护系统的性能。redis有两种解决方案

1、为数据设置超时时间

没有设置时间,则缓存永远不过期

2、采用LRU算法动态将不用的数据删除

内存管理的一种页面置换算法,对于在内存中但又不用的数据块叫做LRU,操作系统会根据那些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。

  1. 查询所有key中最近最不常使用的数据进行删除,这是应用最广泛的策略
  2. 设定超时时间的数据中,删除最不常使用的数据

Redis应用场景

设置过期时间

  1. 限时的优惠活动信息
  2. 网站数据缓存(对于一些需要定时更新的信息,例如积分排行榜)
  3. 手机验证码(一般120s)
  4. 限制网站访客频率(一分钟最多访问10次)

Redis的数据结构

1、strings

set mystr "hello world!" //设置字符串类型
get mystr //读取字符串类型

还可以对字符串类型进行数值操作

127.0.0.1:6379> set mynum "2"
OK
127.0.0.1:6379> get mynum
"2"
127.0.0.1:6379> incr mynum
(integer) 3
127.0.0.1:6379> get mynum
"3"

在遇到数值操作时,redis会将字符串类型转换成数值。
由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果,假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。不少网站都利用redis的这个特性来实现业务上的统计计数需求。
如果有多客户同时执行setnx,只有一个能设置成功,可做分布式锁
set命令也支持批量处理,mset/mget批量设置和批量获取。批量操作提高了执行效率,否则一批次的n次查询需要发起n次请求。

2、哈希hash

Hash存的是字符串和字符串值之间的映射,特别适合存储对象,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希(此处如果用String类型就会占用过多的key空间)。

  • hset key field value 单个赋值
  • hmset key field value [filed value]...批量赋值
//建立哈希,并赋值
127.0.0.1:6379> HMSET user:001 username antirez password P1pp0 age 34 
OK

//列出哈希的内容
127.0.0.1:6379> HGETALL user:001 
1) "username"
2) "antirez"
3) "password"
4) "P1pp0"
5) "age"
6) "34"

//更改哈希中的某一个值
127.0.0.1:6379> HSET user:001 password 12345 
(integer) 0

//再次列出哈希的内容
127.0.0.1:6379
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值