Redis是Remote Dictionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容,用C语言编写的。
Redis是开源免费的,支持多语言的API(C/C++/C#/Java/Javascript/Lua/PHP/Python/Ruby/Go),具有原子性,可持久化的KV数据库
Redis遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。
Redis使用单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数的包装来做到的。
Redis的实际处理速度完全依靠主进程的执行效率
注:epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
Redis默认16个数据库,类似数组下表从零开始,初始默认使用0号库(集群中只能使用0号库)
4.持久化与数据备份
持久化方式
RDB AOF数据备份的方式
主从复制对数据高并发读写
对海量数据的高效率存储和访问
对数据的可扩展性(水平、加一台服务器和垂直、升级内存)和高可用性
注:可扩展性分为水平扩展与垂直扩展,例如:加一台服务器就叫水平扩展;升级服务器的内存称为垂直扩展。
Redis使用单线程,而Memcached是多线程,
Redis保证了对于非复合的操作,没有线程安全问题。虽然Redis使用的是单线程,但是Redis 足够快。
Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存;
Memcached使用预分配的内存池的方式。
Redis 与Memcached一样,为了保证效率,数据都是缓存在内存中。
Redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,而Memcached只是存放在内存中,服务器故障关机后数据就会消失,所以Redis的容灾性会更强。
Redis支持五种数据类型:string(字符串),list(链表), Hash(哈希),set(集合)及zset(有序集合)。
Memcached只是简单的key与value
比如典型的博客网站的最新文章,通过下面方式,我们可以将最新的5条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取。
取最新N个数据的操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。
Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。
这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。
通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。
Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。
使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。
性能优于Memcached,数据结构更多样化。