redis常用知识汇总


redis常用知识汇总

文章插图
 
概述
什么是redis
Redis(Remote Dictionary Server) 是一个使用 C 语言编写的 , 开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库 。
Redis 可以存储键和五种不同类型的值之间的映射 。键的类型只能为字符串 , 值支持五种数据类型:字符串、列表、集合、散列表、有序集合 。
与传统数据库不同的是 Redis 的数据是存在内存中的 , 所以读写速度非常快 , 因此 redis 被广泛应用于缓存方向 , 每秒可以处理超过 10万次读写操作 , 是已知性能最快的Key-Value DB 。另外 , Redis 也经常用来做分布式锁 。除此之外 , Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案 。
Redis有哪些优缺点
优点
读写性能优异 ,  Redis能读的速度是110000次/s , 写的速度是81000次/s 。
支持数据持久化 , 支持AOF和RDB两种持久化方式 。
支持事务 , Redis的所有操作都是原子性的 , 同时Redis还支持对几个操作合并后的原子性执行 。
数据结构丰富 , 除了支持string类型的value外还支持hash、set、zset、list等数据结构 。
支持主从复制 , 主机会自动将数据同步到从机 , 可以进行读写分离 。
缺点
数据库容量受到物理内存的限制 , 不能用作海量数据的高性能读写 , 因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上 。
Redis 不具备自动容错和恢复功能 , 主机从机的宕机都会导致前端部分读写请求失败 , 需要等待机器重启或者手动切换前端的IP才能恢复 。
主机宕机 , 宕机前有部分数据未能及时同步到从机 , 切换IP后还会引入数据不一致的问题 , 降低了系统的可用性 。
Redis 较难支持在线扩容 , 在集群容量达到上限时在线扩容会变得很复杂 。为避免这一问题 , 运维人员在系统上线时必须确保有足够的空间 , 这对资源造成了很大的浪费 。
为什么要用 Redis /为什么要用缓存
主要从“高性能”和“高并发”这两点来看待这个问题 。
高性能:
假如用户第一次访问数据库中的某些数据 。这个过程会比较慢 , 因为是从硬盘上读取的 。将该用户访问的数据存在数缓存中 , 这样下一次再访问这些数据的时候就可以直接从缓存中获取了 。操作缓存就是直接操作内存 , 所以速度相当快 。如果数据库中的对应数据改变的之后 , 同步改变缓存中相应的数据即可!
高并发:
直接操作缓存能够承受的请求是远远大于直接访问数据库的 , 所以我们可以考虑把数据库中的部分数据转移到缓存中去 , 这样用户的一部分请求会直接到缓存这里而不用经过数据库 。
为什么要用 Redis 而不用 map/guava 做缓存?
缓存分为本地缓存和分布式缓存 。以 JAVA 为例 , 使用自带的 map 或者 guava 实现的是本地缓存 , 最主要的特点是轻量以及快速 , 生命周期随着 jvm 的销毁而结束 , 并且在多实例的情况下 , 每个实例都需要各自保存一份缓存 , 缓存不具有一致性 。
使用 redis 或 memcached 之类的称为分布式缓存 , 在多实例的情况下 , 各实例共用一份缓存数据 , 缓存具有一致性 。缺点是需要保持 redis 或 memcached服务的高可用 , 整个程序架构上较为复杂 。
Redis为什么这么快
1、完全基于内存 , 绝大部分请求是纯粹的内存操作 , 非常快速 。数据存在内存中 , 类似于 HashMap , HashMap 的优势就是查找和操作的时间复杂度都是O(1);
2、数据结构简单 , 对数据操作也简单 , Redis 中的数据结构是专门进行设计的;
3、采用单线程 , 避免了不必要的上下文切换和竞争条件 , 也不存在多进程或者多线程导致的切换而消耗 CPU , 不用去考虑各种锁的问题 , 不存在加锁释放锁操作 , 没有因为可能出现死锁而导致的性能消耗;
4、使用多路 I/O 复用模型 , 非阻塞 IO;
5、使用底层模型不同 , 它们之间底层实现方式以及与客户端之间通信的应用协议不一样 , Redis 直接自己构建了 VM 机制  , 因为一般的系统调用系统函数的话 , 会浪费一定的时间去移动和请求;


推荐阅读