REmote Dictionary Server远程字典的服务,属于内存数据库,可持久化到硬盘,优点:
1、方便扩展
2、大数据量高性能
3、八大结构
4 、分布式存储
一、单线程原子性,I/O多路复用原理:
1、多个客户端访问一个redis进程

2、通过Socket建立连接,IO复路将所有请求放入队列,通过文件事件分派器分发各种请求给相应的处理器,处理完毕后返回给客户端

3、IO多路复用模型
Select:redis进程调用select把需要监控的fd存放到内核中,内核轮询监控所有fd,如果fd有数据准备好,再分发给redis进程

Poll:与Select类似
Epoll:redis调用epoll把需要监控的fd放到内核中,并附有回调函数,如果有变动则调用回调函数将fd存放到活跃事件队列中,
内核只需要监控活跃队列中的fd,如果fd有数据准备好,再分调用回调函数通知redis进程处理


Select、Poll、Epoll对比:

二、Redis八大结构类型
string:不推荐使用string,原因如下:1、多占用内存 2、浪费资源。string存入一个对象,json序列化存入;修改string对象的属性值,先取出来json反序列化,改值然后序列化存入。
数据结构:
1、RAW编码:短字符串长度的存储,不常用

2、embstr编码:除了字符串占用长度,还额外预留有一定长度,平白消耗了内存

hash:推荐使用
数据结构:
1、ZipList:链形存储,取值需要遍历所有数据,需要有大小限制,过大会自动转HashTable存储,复杂度O(n)
2、HashTable:存储会计算hash值,根据hash值查找数据,复杂度O(1)

set:不重复的无序集合,可以取交集、并集
数据结构:
1、intset:储存整型数据,有大小限制,查询时通过二分查找
2、hashtable

zset:有序的去重集合,根据score排序
数据结构:
1、ziplist:同hash中的ziplist
2、skiplist跳跃表:本质是多层链表

存储时,多个key时后一个会覆盖前一个;如果score不存在直接添加,如果一个score有多个值,则分配一个新的空间,并把原有score对应的key值删除
list:既是队列,又是栈,本质是个链表
数据结构:
1、单向链表
2、双向链表

可发布订阅:

BitMaps:通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。如用户签到、统计活跃用户、用户在线状态等
hyperloglogs:Redis 的基数统计,这个结构可以非常省内存的去统计各种计数,但没办法去知道具体的内容是什么。如注册 IP 数、每日访问 IP 数、页面实时UV)、在线用户数等
strems:支持多播的可持久化的消息队列,用于实现发布订阅功能
三、redis底层实现的8大数据结构
- SDS simple synamic string:支持自动动态扩容的字节数组
- list :链表
- dict :使用双哈希表实现的, 支持平滑扩容的字典
- zskiplist :附加了后向指针的跳跃表
- intset : 用于存储整数数值集合的自有结构
- ziplist :一种实现上类似于TLV, 但比TLV复杂的, 用于存储任意数据的有序序列的数据结构
- quicklist:一种以ziplist作为结点的双链表结构, 实现的非常不错
- zipmap : 一种用于在小规模场合使用的轻量级字典结构
四、Redis事务
1、 原子性:就是最小的单位
2、一致性 :好多命令,要么全部执行成功,要么全部执行失败。如果在这个事务期间,有其他的会话或者连接是可以修改当前这个key的值,但是会影响当前开启事务的这个会话的操作,会让我们提交不成功
3、隔离性:一个会话和另一个会话之间是互相隔离
4、持久性:执行就执行了,数据保存在硬盘
五、Redis持久化
持久化有两种方式:
1、快照的方式(RDB)
2、文件追加方式(AOF)

六、Redis集群
多个master节点

某个主节点和所有从节点全部挂掉,我们集群不可用。
如果半数以上的主节点挂掉,则集群不可用
如果集群任意master挂掉,而且没有从节点,则集群不可用
本文深入探讨了Redis在ASP.NET Core中的使用,详细介绍了Redis的单线程原子性、I/O多路复用原理,以及Redis的八大数据结构如string、hash、set、zset、list等。此外,还讨论了Redis的事务特性、持久化方法(RDB和AOF)以及集群部署中的关键点。

355

被折叠的 条评论
为什么被折叠?



