redis十连问(一)
一什么是redis有什么特性redis是使用内存来存储数据的内存数据库区别于MySQL这类数据库redis并非使用表的结构爱存储数据而是主要使用 key-value的键值对格式存储数据总结来说redis就是一种高性能使用内存key-value 内存数据库。特性使用内存来存储数据支持多种数据结构支持持久化事务使用单线程来处理客户端请求支持主从复制哨兵模式集群模式同时也支持多种语言客户端。二redis支持哪些数据结构首先是五种基本类型String字符串可存字符串数字二进制。可以做计数器缓存分布式锁。List列表双向链表左右可以插入删除适合做消息队列栈队列。Hash哈希key-field-value结构适合存储对象。Set(集合)无序去重适合求交集并集比如说好友共同关注去重ZSet有序集合代score份数排序不重复适合做排行榜。redis新版本新增数据类型Bitmap通过二进制表示某个数字是否存在Bitfield把字符串当做位图并进行位操作Hyperloglog基于位图的结构实现“计数”效果Geospqtial地理信息存储经纬度并且可以进行一些空间计算Stream消息队列三怎么测试redis服务器的连通性?使用ping命令如果连通服务器会返回pong四如何设置key的过期时间在设置key的时候可以设置EX选项来指定key的过期时间也可以通过expire命令单独为kkey设置过期时间。五redis为什么是单线程模式1redis的绝大部分操作是内存操作速度很快瓶颈大多不在CPU而在网络IO2单线程可以避免多线程的锁竞争线程切换死锁这些复杂问题实现简单开发维护成本低3redis并不是完全的单线程处理客户端命令是单线程模型但并不代表整个redis只有一个线程持久化异步删除IO密集任务会开额外子线程/子进程处理六redis的IO多路复用是怎么回事redis的IO多路复用主要是使用Linux提供的epoll即使来完成。简单来说就是使用一个线程来管理和多个客户端之间的socket。一个redis服务器要处理来自多个客户端的请求但是客户端的请求并不是在同一段时间内都有请求需要处理而是在单位时间内只有少数客户端有请求需要处理所以如果给每个客户端都开一个线程大部分线程都是空闲的如果给每个客户端都分配线程的话首先会占用极大内存空间其次CPU会大量的消耗在线程调度切换上线程上下文切换本来就会消耗CPU大量时间浪费在线程的调度切换上导致真正的业务执行时间变少如果在高并发的情况下就会导致系统的性能断崖式的下降。另一方面操作系统对进程可创建的线程数量也有上限如果达到上限的话新的客户端就会创建不了新的线程连接不上服务器。七redis的持久机制有哪些RDB和AOF两种持久化方式详细内容看前面文章 Redis持久化详解RDB与AOF原理、配置、优缺点-CSDN博客八RDB的持久化触发条件是怎么样的1手动触发使save和bgsave命令注意两个命令的区别2自动触发2.1 在配置文件中通过save m n命令可以设定在m秒内发生n次修改自动触发持久化。2.2 从节点需要进行全量复制的时候会自动触发持久化2.3 执行shutdown命令关闭redis server时候会触发持久化2.4 代码执行redis-cli --rdb也可以导出rdb文件九AOF重写机制具体流程AOF重写解决了什么随着内存的数据越来越多AOF文件体积会变得越来越大但是文件内部是存在大连那个的冗余命令的文件体积大会导致redis重启后内数据恢复变慢。流程如下首先redis fork出一个子进程遍历当前内存中的所有数据当前内存中的数据就是最终的key的状态生成新的AOF文件替代旧的冗余AOF文件从而大幅的压缩了文件的体积。需要注意的点redis7版本之后移除了父进程内存缓冲区重写期间新的命令直接写入独立的增量AOF文件不在写入缓冲区同时也不需要一边重写一边继续追加旧的AOF文件。最终两个文件合并成新的AO文件。十redis的过期删除策略是怎么样的1惰性删除只有当key被访问到的时候才会判断当前key是否过期过期则删除惰性删除虽然会节省CPU资源不用遍历大量key进行删除但是可能会导致内存资源变得紧张因为大量过期的key如果没有被访问到的话会占用大量的CPU资源。2定期删除redis会每隔一段时间遍历expire字典expire字典中保存了所有设置了过期时间的key随机抽取一定数量的key源码写死20个如果当前样本中过期数量超过25%同样源码写死删除过期的key再进行下一轮一直循环下去直到某轮过期key的数量小于25%定期删除缺点还是有一部分过期key没有被删除这部分key有可能会不断积累直到达到maxmemory就会触发内存淘汰策略