第六天:Redis+分片+商品类目缓存+哨兵
思考:
序号 | 知识点 | 类型 | 难度系数 | 掌握程度 |
| NoSQL Redis | 论述 | 1 | 熟练 |
| 缓存实现机制,在项目中如何应用? | 技术 | 1 | 熟练 |
| Hash一致性算法 | 论述 | 1 | 熟练 |
| RedisService的Function | 代码 | 1 | 熟练 |
知识点:
序号 | 知识点 | 类型 | 难度系数 | 掌握程度 |
| NOSQL Redis缓存CentOS下安装、配置 | 技术 | 3 | 熟练 |
| Redis常用命令 | 技术 | 1 | 了解 |
| Jedis、JedisPool、ShardedJedis、Hash一致性 | 技术 | 1 | 了解 |
| Redis两个节点、Redis三个节点 | 技术 | 3 | 熟练 |
| Jedis和spring框架整合 | 技术 | 1 | 熟练 |
| 商品详情页新增后保存到Redis中 | 技术 | 2 | 熟练 |
拓展作业:
序号 | 知识点 | 类型 | 难度系数 | 掌握程度 |
| Redis一主六从 | 技术 | 3 | 熟练 |
.NOSQL-Redis
缓存在电商项目乃至互联网项目使用之广,使用的点也非常之多,基本你想到的地方就都有缓存。
为什么要用缓存?
电商网站的行为非常特殊,大量的商品的浏览,对热门的商品,卖的好的商品,评价好的商品浏览频繁。而这部分数据遵循二八定律。只占整体的二成。既然大部分的业务访问都集中在这一小部分数据上,那么如果把这一小部分数据缓存在内存中,是不是就可以减少数据库的访问压力,从而提高整个网站的数据访问速度,改善数据库的写入性能了呢?答案是显而易见的。我们都知道数据库访问创建链接,执行查询,销毁链接是一个非常耗费资源和缓慢的过程。而大量的拦截请求直接从内存读取数据返回给用户。性能提高数百倍。
缓存是改善性能的第一手段。
什么是nosql?
Nosql=no only sql 泛指非关系型数据库。
随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
主流的NOSQL比较
如下图所示:
数据库排行
DB-Engines.com的数据库排行中,Redis排行第九,kv中排行第一;Memcache排行二十三,kv排行第二。
主流的NOSQL比较
Redis简介
官网:http://redis.io
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
可以充当缓存、队列等作用。
源码脱管: https://github.com/antirez/redis
历史和发展
2008年,意大利的一家创业公司Merzia推出一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人Salvatore Sanfilippo便对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
短短几年,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如京东、淘宝、新浪微博、街旁网、知乎网、国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发,Salvatore Sanfilippo和Pieter Noordhuis也分别在3月5月加入VMware,全职开发Redis。
特性
1)多种数据类型存储
字符串类型 string 512M
散列类型 hash 2^32-1
列表类型 list 2^32-1
集合类型 set 2^32-1
有序集合类型 zset
2)内存存储与持久化
内存的读写速度远快于硬盘
自身提供了持久化功能(RDB、AOF两种方式)
3)功能丰富
可以用作缓存、队列、消息订阅/发布
支持键的生存时间
按照一定规则删除相应的键
4)简单稳定
相比SQL而言更加简洁
不同语言的客户端丰富
基于C语言开发,代码量只有3万多行
5)所有操作是原子性的
Redis 使用单个 Lua 解释器去运行所有脚本,并且, Redis 也保证脚本会以原子性(atomic)的方式执行: 当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。 这和使用 MULTI / EXEC 包围的事务很类似。 在其他别的客户端看来,脚本的效果(effect)要么是不可见的(not visible),要么就是已完成的(already completed)
版本说明
Redis的版本规则如下:
次版本号(第一个小数点后的数字)为偶数的版本是稳定版本(2.4、2.6等),奇数为非稳定版本(2.5、2.7),一般推荐在生产环境使用稳定版本。
说明:Redis官方是不支持windows平台的,windows版本是由微软自己建立的分支,基于官方的Redis源码上进行编译、发布、维护的,所以windows平台的Redis版本要略低于官方版本。
所以使用redis推荐在linux下使用。从这也可以知道电商项目、互联网项目都是在linux上运行的。
Linux版本3.0.7:
http://download.redis.io/releases/redis-3.0.7.tar.gz
Linux下安装Redis
注意:redis3.0之后引入了集群
mkdir –p /usr/local/src/redis
cd /usr/local/src/redis
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
tar xzf redis-3.0.7.tar.gz #tar xvf redis-3.0.7.tar.gz
cd redis-3.0.7
make #下载后编译,过程稍长
make install #进行安装
//make PREFIX=/usr/local/src/redis install #指定安装目录
Windows(64位)安装
Windows(64位)版本2.8.19,需要经过visualstudio编译。
https://github.com/MSOpenTech/redis
Windows(32位)版本已经不再支持。
How to build Redis using Visual Studio
You can use the free Visual Studio Community edition available at http://www.visualstudio.com/products/visual-studio-community-vs.
Open the solution file msvs\redisserver.sln in Visual Studio, select a build configuration (Debug or Release) and target (Win32 or x64) then build.
This should create the following executables in the msvs\$(Target)\$(Configuration) folder:
redis-server.exe
redis-benchmark.exe
redis-cli.exe
redis-check-dump.exe
redis-check-aof.exe
安装系统服务启动
注册服务:
redis-server --service-install redis.windows.conf --loglevel verbose
卸载服务:
redis-server --service-uninstall
启动Redis:
redis-server --service-start
停止Redis:
redis-server --service-stop
Redis持久化的两种方式
rdb和aof比较
rdb | aof |
fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。 save, shutdown, slave 命令会触发这个操作。粒度比较大,如果save, shutdown, slave 之前crash了,则中间的操作没办法恢复。 | 把写操作指令,持续的写到一个类似日志文件里。(类似于从postgresql等数据库导出sql一样,只记录写操作) 粒度较小,crash之后,只有crash之前没有来得及做日志的操作没办法恢复。 |
两种区别就是,
一个是持续的用日志记录写操作,crash(崩溃)后利用日志恢复;
一个是平时写操作的时候不触发写,只有手动提交save命令,或者是shutdown关闭命令时,才触发备份操作。
选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 最终一致性(eventually consistent)的意思了。
性能比较
测试方法是用java写的脚本对redis数据库进行写入,看写入速度。
100000/300000/1000000是数据量,插入的都是string。第一个数据是最小时间,第二个是平均,第三个是数据大小。
100000:
dbmode: 4.8, 5.1, 1477792
aofmode: 9.1, 9.3, 3677803
300000:
dbmode: 16.5, 17.6, 4877792
aofmode: 21.1, 21.4, 11477803
1000000:
dbmode: 61, 65, 16777792
aofmode: 77, 85, 38777849
从简单分析来看,aof比rdb慢25-80%,但是大规模数据都比较支持慢25%这端。估计在低数据量下,rdb模式更加占优势。数据规模增长时,速率比接近于4:5。aof的数据比rdb数据大150%(2.5倍上下),这点随着数据增长基本不变。
从读性能分析来看,两者差异不大。同样,数据分别是最小时间和平均时间。
dbmode: 55, 60
aofmode: 62, 63
差异在10%以内,甚至比最小-平均差异还弱。基本可以视为一致。