bnuzxh_Redis

什么是Redis?

Redis(Remote Dictionary Server) 基于C 语言编写,开源的(BSD许可),高性能的,非关系型(NoSQL)的键值对数据库。

redis是一个非关系型的数据库

那么他和传统的关系型数据库MySQL的区别?

mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。

redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限

redis和mysql的区别总结
(1)类型上
从类型上来说,mysql是关系型数据库,redis是缓存数据库
(2)作用上
mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢
redis用于存储使用较为频繁的数据到缓存中,读取速度快
(3)需求上
mysql和redis因为需求的不同,一般都是配合使用。

补充:
redis和mysql要根据具体业务场景去选型
mysql:数据放在磁盘 redis:数据放在内存
redis适合放一些频繁使用,比较热的数据,因为是放在内存中,读写速度都非常快,一般会应用在下面一些场景
排行榜、计数器、消息队列推送、好友关注、粉丝

首先要知道mysql存储在磁盘里,redis存储在内存里,redis既可以用来做持久存储,也可以做缓存,而目前大多数公司的存储都是mysql + redis,mysql作为主存储,redis作为辅助存储被用作缓存,加快访问读取的速度,提高性能
那么为什么不直接全部用redis存储呢?
我的看法是:因为redis存储在内存中,如果存储在内存中,存储容量肯定要比磁盘少很多,那么要存储大量数据,只能花更多的钱去购买内存,造成在一些不需要高性能的地方是相对比较浪费的,所以目前基本都是mysql(主) + redis(辅),在需要性能的地方使用redis,在不需要高性能的地方使用mysql,好钢用在刀刃上
1、mysql支持sql查询,可以实现一些关联的查询以及统计;
2、redis对内存要求比较高,在有限的条件下不能把所有数据都放在redis;
3、mysql偏向于存数据,redis偏向于快速取数据,但redis查询复杂的表关系时不如mysql,所以可以把热门的数据放redis,mysql存基本数据


redis为什么快?

首先,在内存中,完全基于内存!

然后,单线程!io多路复用

最后,数据结构简单,操作够快

采用单线程,避免了不必要的上下文切换和竞争条件,不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。
使用多路I/O复用模型,非阻塞IO。
多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态 中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且Redis 在内存中操作数据的速度非常快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,主要由以上几点造就了 Redis 具有很高的吞吐量。


redis5大数据类型

五种数据类型:

  1. string(字符串),是redis的最基本类型,一个 key 对应一个 value。
127.0.0.1:6379> SET name "bnuzxh"
OK
127.0.0.1:6379> GET name
"bnuzxh"
  1. hash(哈希),键值(key=>value)对集合, string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
127.0.0.1:6379> HMSET myhash name "yzl" age "20"
OK
127.0.0.1:6379> HGET myhash name
"yzl"
127.0.0.1:6379> HGET myhash age
"20"
  1. list(列表),Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。他的底层是一个链表
127.0.0.1:6379> LPUSH fruitlist apple
(integer) 1
127.0.0.1:6379> LPUSH fruitlist banana
(integer) 2
127.0.0.1:6379> LPUSH fruitlist orange
(integer) 3
127.0.0.1:6379> LRANGE fruitlist 1 2
1) "banana"
2) "apple"
  1. set(集合),Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd key member
添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。

127.0.0.1:6379> sadd city beijing
(integer) 1
127.0.0.1:6379> sadd city hangzhou
(integer) 1
127.0.0.1:6379> sadd city shandong
(integer) 1
127.0.0.1:6379> sadd city guangzhou
(integer) 1
127.0.0.1:6379> sadd city beijing
(integer) 0
127.0.0.1:6379> smembers city
1) "shandong"
2) "guangzhou"
3) "hangzhou"
4) "beijing"

Set,Java程序员都知道HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。

  1. zset(sorted set:有序集合)。zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

zadd key score member
添加元素到集合,元素在集合中存在则更新对应score

127.0.0.1:6379> zadd price 3 pen
(integer) 1
127.0.0.1:6379> zadd price 5 apple
(integer) 1
127.0.0.1:6379> zadd price 50 dinner
(integer) 1
127.0.0.1:6379> zadd price 100 basketball
(integer) 1
127.0.0.1:6379> zrangebyscore price 10 200
1) "dinner"
2) "basketball"

SortedSet(zset),zset底层实现使用了两个数据结构:
第一个是hash,第二个是跳跃列表
hash的作用就是关联元素value和权重score,保障元素value的唯一性,通过元素value找到相应的score值。
跳跃列表的目的在于给元素value排序,根据score的范围获取元素列表。我们需要这个链表按照score值进行排序。
这意味着当有新元素需要插入时,需要定位到特定位置的插入点,这样才可以继续保证链表是有序的。
跳跃列表 使用类似于这种层级制,最下面一层所有的元素都会串起来。然后每隔几个元素挑选出一 个代表来,再将这几个代表使用另外一级指针串起来。然后在这些代表里再挑出二级代表 ,再串起来。最终就形成了金字塔结构。定位插入点时,先在顶层进行定位,然后下潜到 下一级定位,一直下潜到最底层找到合适的位置,将新元素插进去。

参考链接:

1、https://www.jianshu.com/p/4f9f341dacac
2、https://www.runoob.com/redis/redis-data-types.html

redis为什么是单线程的?

官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈.
Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为 瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!)。

redis并发竞争问题如何解决?

Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。
Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争

redis只能存在内存中吗?可以持久化?

redis提供两种方式进行持久化:
一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化):
另一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。


那你说说redis持久化方案aof和rdb吧:

rdb,(Redis DataBase)

RDB持久化是,指在指定的时间间隔内将内存中的数据集快照入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
RDB 是一种快照模式,保存的是 key value 数据内容。
RDB 有 2 种持久方式,同步 save 模式和异步 bgsave 模式。由于 save 是同步的,所以可以保证数据一致性,而 bgsave 则不能。
默认执行 shutdown 时,如果没有开启 AOF,则自动执行 bgsave。
RDB 缺点:
1、无法秒级持久化。

aof是目前 Redis 持久化的主流方式

aof,(Append Only File)

AOF持久化,以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。
AOF 相比较于 RDB,每次都会保存写命令,数据实时性更高。
AOF 由于每次都会记录写命令,文件会很大,因此需要进行优化,称之为“重写机制”(下面详细说)。
AOF 每次保存的写命令都放在一个缓冲区,根据不同的策略(下面详细说)同步到磁盘。

https://blog.csdn.net/weixin_44337261/article/details/88149073

Redis宕机解决

redis一般在企业中做分布式缓存,可以大大的减小高并发的开销。企业中如果只有一台redis,肯定会造成数据丢失,无法挽救

心跳检测机制

两台为一组,一台主机一台备机 ,平时主机工作,备机不工作 ,备机每隔几秒就会给主机发送一个ping ,主机在正常工作的时候会发送一个peng 给备机 ,如果不返回pang,可能会连续ping三次,都不返回那么备机就会上,备机里有主机的全部内容,这个叫做心跳检测机制(高可用的作用),主从热备

主的redis宕机怎么解决?
  要先确认是否做持久化,若没有做持久化,重新启动主的redis就会造成数据丢失。
    1.先把从的redis升级为主的redis. 执行slave of one命令
    2.原来的主的可以重新启动,作为从的redis, 连接到主的redis上面做主从复 制

使用Redis 提供哨兵 机制来简化上面的操作

哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,功能有二个:

  1. 监控主数据库和从数据库是否运行正常;
  2. 主数据出现故障后自动将从数据库转化为主数据库;

https://blog.csdn.net/belongtocode/article/details/104325782

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值