为什么现在好多项目要用Redis?Redis为什么这么好用?

简介

  1. REmote DIctionary Server-远程字典服务器 ( Redis ) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

  2. Redis是一个开源的框架,Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

  3. Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、Redis 为什么这么快?

你有可能会说:因为Redis 完全是基于内存的操作,所以很快。

两个误区:

  1. 高性能的服务器不一定都是多进程、多线程的
  2. 多线程不一定都不比单线程快,比如单核机器。

比如Nginx是多进程单线程的,Memcached是单进程多线程的。

  • Redis官方解释:Redis的操作都是基于内存的,CPU不是 Redis性能瓶颈,,Redis的瓶颈是机器内存和网络带宽。因为Redis的瓶颈不是cpu的运行速度,而往往是网络带宽和机器的内存大小。再说了,单线程切换开销小,容易实现既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了
  • Reds是C语言写的,性能极高。单台redis情况下,官方提供的数据为:读的速度是110000次/s,写的速度是81000次/s
  • 若CPU成为你的Redis瓶颈,可通过多起几个Redis进程进行解决

原因:在计算机的世界中,CPU的速度是远大于内存的速度的,同时内存的速度也是远大于硬盘的速度。redis的操作都是基于内存的,绝大部分请求是纯粹的内存操作,非常迅速,使用单线程可以省去多线程时CPU上下文会切换的时间,也不用去考虑各种锁的问题,不存在加锁释放锁操作,没有死锁问题导致的性能消耗。对于内存系统来说,多次读写都是在一个CPU上,没有上下文切换效率就是最高的!既然单线程容易实现,而且CPU 不会成为瓶颈,那就顺理成章的采用单线程的方案了。

Redis的单进程单线程模型的具体细节?

IO多路复用技术,现在我们模拟一个tcp服务器处理30个客户的socket,如何快速的处理掉这30个请求呢?

在不了解原理的情况下,我们类比一个实例:在课堂上让全班30个人同时做作业,做完后老师检查,30个学生的作业都检查完成才能下课。如何在有限的资源下,以最快的速度下课呢?

第一种:安排一个老师,按顺序逐个检查。先检查A,然后是B,之后是C、D
这中间如果有一个学生卡住,全班都会被耽误。这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。这种方式只需要一个老师,但是耗时时间会比较长。

第二种:安排30个老师,每个老师检查一个学生的作业。 这种类似于为每一个socket创建一个进程或者线程处理连接。这种方式需要30个老师(最消耗资源),但是速度最快。

第三种:安排一个老师,站在讲台上,谁解答完谁举手。这时C、D举手,表示他们作业做完了,老师下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。这种方式可以在最小的资源消耗的情况下,最快的处理完任务。

第三种就是IO复用模型(Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。)


二、Redis 常用的五种数据类型

1. String: 字符串

1. String是redis最基本的类型可以理解成与memcached一模一样的类型,一个key对应一个value。
2. value不仅是string,也可以是数字。
3. string类型是二进制安全的,意思是redis的string类型可以包含任何数据,比如jpg图片或者序列化的对象。
4. string类型的值最大能存储512M。

redis 127.0.0.1:6379> SET runoob "北顾"
OK

redis 127.0.0.1:6379> GET runoob
"北顾"

2. Hash(哈希)

1. Hash是一个键值(key-value)的集合。
2. redis的hash是一个string的key和value的映射表
3. Hash特别适合存储对象。
4. 常用命令:hget,hset,hgetall等。

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"

redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"

3. List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

redis 127.0.0.1:6379> DEL runoob  (delect key)
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1

redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2

redis 127.0.0.1:6379> lpush runoob rabbitmq
(integer) 3

redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabbitmq"
2) "mongodb"
3) "redis"

注:列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。


3. Set(集合)

1. Redis 的 Set 是 string 类型的无序集合。
2. 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
3. 添加一个 string 元素到 key 对应的 set 集合中,成功返回 1
4. 如果元素已经在集合中返回 0。

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1

redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1

redis 127.0.0.1:6379> sadd runoob rabbitmq
(integer) 1

redis 127.0.0.1:6379> sadd runoob rabbitmq
(integer) 0

redis 127.0.0.1:6379> smembers runoob
1) "redis"
2) "rabbitmq"
3) "mongodb"

注意:

  1. 以上实例中 rabbitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
  2. 集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

5. Zset

1. Redis zset 和 set 一样也是string类型元素的集合
2. 不同的是每个元素都会关联一个double类型的分数。
3. redis正是通过分数来为集合中的成员进行从小到大的排序。
4. zset的成员是唯一的,但分数(score)却可以重复。
5. 不允许重复的成员。
6. 添加元素到集合,元素在集合中存在则更新对应score

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1

redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1

redis 127.0.0.1:6379> zadd runoob 0 rabbitmq
(integer) 1

redis 127.0.0.1:6379> zadd runoob 0 rabbitmq
(integer) 0

redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabbitmq"
3) "redis"

注意:

  1. 以上实例中 rabbitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
  2. 集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

总结

在这里插入图片描述

参考:知乎《该用户快成仙了》
参考:菜鸟教程 https://www.runoob.com

更多学习资讯,学习源码,请在耶宇星球领取

更多学习资讯,学习源码,请在耶宇星球领取
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北顾丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值