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