Redis(Remote Dictionary Server),即远程字典做事,Redis是一个key-value型的NoSQL数据库。
Redis的官网地址为redis.io,从2010年3月15日起,Redis的开拓事情由VMware主持,Redis的开拓由Pivotal资助。
一 Redis功能先容与Memcached比较,Redis支持存储的value类型更多,包括string(字符串)、list(链表)、set(凑集)、zset(sorted set有序凑集)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集、并集和差集或更丰富的操作,而且这些操作都是原子性的。在此根本上,Redis支持各种不同办法的排序。
与Memcached一样,为了担保效率,数据都是缓存在内存中。差异是Redis会周期性地把更新数据写入磁盘或写入追加的记录文件,并且在此根本上实现了Master-Slave(主从)同步。
Redis是一个高性能的key-value数据库,在很大程度补偿了Memcached这类key/value存储的不敷,在部分场合可以对关系数据库起到很好的补充浸染。
Redis供应了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客户端,利用非常方便。Redis支持主从同步,数据可以从主理事器向任意数量的从做事器上同步,这使得Redis可以实行单层树复制。
存盘可以故意无意地对数据进行写操作。由于完备实现了发布/订阅机制,使得从数据库在任何地方同步树时,都可以订阅一个频道并吸收主理事器完全的发布记录。同步对读取操作的可扩展性和数据冗余很有好处。
Redis不是比较成熟的Memcached或者MySQL的替代品,是对付大型互联网运用在架构上很好的补充。现在越来越多的互联网平台纷纭在做基于Redis的架构改造,如京东、淘宝、当当、唯品会、美团、新浪微博等。
下面大略公布一下源于新浪微博的Redis平台实际运用数据,供参考。
· 每天5000亿次读写操作。
· 超过18TB内存。
· 500多个做事器。
二 Redis运用处景Redis的运用处景基于Redis自身的以下特点。
· Redis是内存数据库,读写速率非常快,因此Redis适宜做Cache(缓存),用于提高数据访问速率,减少关系数据库的压力。
· 关系数据库的Connection连接数非常有限(单机在几千以内),而Redis的单机并发连接可以达到几十万,因此适宜在高并发环境缓解关系数据库的压力。
· Redis中没有事务(Transaction)掌握,因此关键的交易数据读写仍旧须要关系数据库,非关键数据的读写可以转到Redis中。
· Redis数据之间没有关联关系,数据构造大略,数据拓展随意马虎,因此Redis适宜做大集群支配,数据承载量非常弘大。
· Redis中的数据类型大略,无法做构造化查询(SQL),因此不适宜有繁芜关系的数据读写。
Redis的实际运用非常广泛,下面大略列举几个常见的运用处景。
· 与关系数据库合营,做高速缓存。
· 全局计数器(如文章的阅读量、微博点赞数)。
· 利用zset类型存储排行榜数据。
· 利用list自然排序存储最新n个数据(新浪/Twitter用户列表)。
· HTTP Session数据存储。
· 分布式锁运用,防止超卖。
· 高并发环境全局ID获取(如天生唯一的订单编号)。
· 限流(int类型的incr方法,限定访问次数)。
· 利用hash构造做购物车存储。
· 行列步队(list供应了两个壅塞的弹出操作:blpop/brpop)。
· 防止缓存穿透和雪崩故障。
三 Redis下载与安装Redis目标安装环境CentOS7,安装步骤如下。
(1)下载Redis安装包。
从 Redis 官 网 下 载 redis-5.0.10.tar.gz , 使 用 xftp 工 具 上 传到/usr/local目录下(如图5-1所示)。
(2)进入虚拟机local目录,解压Redis安装包。
图5-1 上传Redis安装包
(3)安装GCC编译环境。
(4)利用GCC编译Redis。
(5)安装Redis。
# make install
(6)检讨Redis安装信息。
进入cd /usr/local/bin目录,若显示如图5-2所示信息,表示Redis安装成功。
图5-2 Redis安装信息
(7)修正Redis配置文件。
进入Redis的安装目录cd /usr/local/redis,修正redis.conf的配置信息(如图5-3所示)。
图5-3 Redis配置文件
修正Redis启动模式如下。
(8)启动Redis做事。
直接实行下面的命令行,redis-server启动时须要访问redis.conf配置文件。
# /usr/local/bin/redis-server /usr/local/redis/redis.conf
# ps -ef | grep redis //redis启动后,检讨redis进程(如图5-4所示)
图5-4 启动Redis做事器
(9)客户端连接Redis做事器(如图5-5所示)。
图5-5 客户端连接Redis做事器
(10)利用Jedis访问测试。
四 案例:当当书城Redis实战
当当书城功能需求和物理表设计拜会4.8节。本节在4.8节的根本上,引入Redis数据库对当当书城进行性能优化和功能完善。
1 Jedis连接Redis做事器
Jedis是连接Redis做事器最常用的客户端,在Java环境导入包jedis-2.6.1.jar和commons-pool2-2.4.2.jar,即可利用Jedis客户端连接Redis做事器。
参考代码类RedisUtil,利用连接池办法访问Redis,核心代码如下。
2 图书缓存和排序
传统的实现方法是从MySQL数据库中直接提取主页推举图书,但是当当书城用户量弘大,频繁的主页访问会给MySQL数据库带来巨大的压力。
如果把图书数据缓存到Redis数据库中,主页推举图书从Redis中提取,就会大大缓解MySQL数据库的压力。操作步骤如下。
(1)定义监听器,在系统启动时装载所有图书数据。
(2)所有图书数据,在Redis中按照hash构造存储,主键是ISBN,值是json串。从MySQL数据库中提取的图书实体工具,须要转换成json串。实体与json串的互转方案,本书推举利用jackson来实现,这也是Spring框架优先推举的json转换方案。
(3)持久层利用Mybatis从MySQL中提取主页图书,装载到Redis中。
(4)用户访问书城主页时,从Redis中提取主页推举图书信息。
(5)从zset中提取所有主页图书的顺序,然后从hash中提取图书详情。
3 统计图书访问次数
用户在当当书城,通过搜索或主页推举找到图书后,单击进入图书详情页(如图5-6所示)。图书详情信息从Redis中提取,性能远高于访问MySQL。同时图书的每一次访问,都会被记录下来,这样热点图书排行就很随意马虎被统计出来了(如图5-7所示)。
图书访问次数统计的实现步骤如下。
(1)普通用户浏览图书时,统计访问次数。
图5-6 图书详情浏览
图5-7 图书访问次数统计
(2)BookRedis逻辑类中的getBookInfo()从Redis中读取图书详情。
(3)BookRedis逻辑类中的addBookPageView()方法,表示每次浏览图书时访问次数加1。
(4)管理员登录后,进入页面访问次数统计页。
(5)根据zset中的图书访问次数统计,显示排名在前100名的热门图书。
(6)视图层显示图书访问排名列表。
4 图书评论
用户浏览器图书时,可以查看评论信息,已登录的用户还可以评论点赞。购买了图书的用户可以揭橥评论,如图5-8所示。
图书评论信息是非关键的业务数据(无须事务掌握),因此既可以放在MySQL数据库中,也可以放到Redis中。
本节讲解基于Redis的图书评论代码实现方案,操作步骤如下。
图5-8 图书评论与评论点赞
(1)从掌握器BookAction中进入图书评论页。
(2)从Redis中提取已有确当前图书评论信息。在Redis中,一本书有多条评论,每本书的所有评论信息利用list构造存储,list的命名规则为“plisbn值”。
(3)已购买图书的用户,可以提交评论信息。
(4)图书评论数据直接写入Redis中。
5 图书评论点赞
如图5-8所示,用户在图书详情页浏览时,可以进行评论点赞。评论点赞数据也存储在Redis数据库中。评论点赞的操作步骤如下。
(1)在bookComment.jsp页面中利用AJAX提交点赞要求。
(2)在掌握器BookAction中处理点赞要求。
(3)Redis中的点赞逻辑处理。
五 Spring整合Redis管理HTTP Session
Web做事器集群中的Session如何同步是一个非常棘手的问题,有了Redis数据库后,把HTTP Session统一交给Redis管理,既可以办理集群中各个WebServer中Session的同步问题,还可以缓解Web Server的内存压力,又不用担心数据库连接的并发数量。因此,将Web做事器集群中的Session统一交给Redis管理,目前是最佳办理方案。
Spring整合Redis实现HTTP Session管理的操作步骤如下。
(1)在pom.xml中配置干系包的依赖。
(2)配置Web.xml,增加过滤器。
(3)在Spring的配置文件中,整合Redis。
(4)图5-9所示为Redis中存储HTTP Session的key和value示例,这些数据都是由spring-session-data-redis自动写入的,无须干预。
图5-9 Redis中存储HTTP Session的key和value示例