淘淘商城第七天笔记.docx
《淘淘商城第七天笔记.docx》由会员分享,可在线阅读,更多相关《淘淘商城第七天笔记.docx(31页珍藏版)》请在冰豆网上搜索。
淘淘商城第七天笔记
淘淘商城第七天
1第六天内容复习
轮播图的展示
1、内容管理的后台。
Cms系统
a)内容分类的管理
b)内容管理,需要指定内容的分类
2、前台展示内容
a)需要服务层发布服务。
b)Portal调用服务获得数据。
c)HttpClient调用服务获得数据。
d)获得数据后,把数据转换成需要的数据格式传递给jsp。
2课程计划
1、在业务逻辑中添加缓存
a)缓存可以使用redis作为缓存。
b)Redis集群
c)在java代码中使用redis单机版、集群版。
d)在业务逻辑中添加缓存。
2、搜索系统的实现
a)创建一个搜索的工程
b)使用solr实现搜索。
c)Solr集群搭建
3缓存的添加
3.1Redis的单机版
3.1.1安装步骤:
第一步:
安装gcc编译环境
yuminstallgcc-c++
第二步:
把redis的源码上传到linux服务器。
第三步:
解压缩。
tar-zxvfredis-3.0.0.tar.gz
第四步:
make
第五步:
makeinstallPREFIX=/usr/local/redis
3.1.2启动redis
两种启动方式,前端启动、后台启动。
前端启动:
./redis-server
后台启动:
1、复制redis.conf到redis的安装目录
2、修改redis.conf。
修改daemonizeyes
3、[root@bogonredis]#./redis-serverredis.conf
3.1.3客户端
redis-cli-p端口-hip地址<-c>连接集群时使用此参数
默认端口:
6379
Ip:
localhost(127.0.0.1)
RedisDesktopManager:
只能在单机版环境使用。
不支持redis集群。
3.2Redis集群
3.2.1redis-cluster架构图
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster负责维护node<->slot<->value
Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点
3.2.2集群搭建
集群中应该至少有三个节点,每个节点有一备份节点。
需要6台服务器。
搭建伪分布式,需要6个redis实例。
搭建集群的步骤:
第一步:
创建6个redis实例指定端口从7001到7006
第二步:
修改redis.conf打开Cluster-enableyes前面的注释。
第三步:
需要一个ruby脚本。
在redis源码文件夹下的src目录下。
redis-trib.rb
第四步:
把redis-trib.rb文件复制到到redis-cluster目录下。
第五步:
执行ruby脚本之前,需要安装ruby环境。
1、yuminstallruby
2、yuminstallrubygems
3、安装redis-trib.rb运行依赖的ruby的包。
[root@bogon~]#geminstallredis-3.0.0.gem
第六步:
启动所有的redis实例。
第七步:
使用redis-trib.rb创建集群。
./redis-trib.rbcreate--replicas1192.168.25.153:
7001192.168.25.153:
7002192.168.25.153:
7003192.168.25.153:
7004192.168.25.153:
7005192.168.25.153:
7006
使用客户端连接集群:
redis01/redis-cli-p7001-c
3.3如何使用redis的java客户端
需要使用Jedis连接redis服务器。
3.3.1连接单机版
先把jedis依赖的jar包添加到工程中。
//单机版测试
@Test
publicvoidtestJedisSingle()throwsException{
//创建一个Jedis对象
Jedisjedis=newJedis("192.168.25.153",6379);
jedis.set("test","hellojedis");
Stringstring=jedis.get("test");
System.out.println(string);
jedis.close();
}
使用连接池:
//使用连接池
@Test
publicvoidtestJedisPool()throwsException{
//创建一个连接池对象
//系统中应该是单例的。
JedisPooljedisPool=newJedisPool("192.168.25.153",6379);
//从连接池中获得一个连接
Jedisjedis=jedisPool.getResource();
Stringresult=jedis.get("test");
System.out.println(result);
//jedis必须关闭
jedis.close();
//系统关闭时关闭连接池
jedisPool.close();
}
3.3.2集群版使用Jedis
//连接redis集群
@Test
publicvoidtestJedisCluster()throwsException{
//创建一个JedisCluster对象
Setnodes=newHashSet<>();
nodes.add(newHostAndPort("192.168.25.153",7001));
nodes.add(newHostAndPort("192.168.25.153",7002));
nodes.add(newHostAndPort("192.168.25.153",7003));
nodes.add(newHostAndPort("192.168.25.153",7004));
nodes.add(newHostAndPort("192.168.25.153",7005));
nodes.add(newHostAndPort("192.168.25.153",7006));
//在nodes中指定每个节点的地址
//jedisCluster在系统中是单例的。
JedisClusterjedisCluster=newJedisCluster(nodes);
jedisCluster.set("name","zhangsan");
jedisCluster.set("value","100");
Stringname=jedisCluster.get("name");
Stringvalue=jedisCluster.get("value");
System.out.println(name);
System.out.println(value);
//系统关闭时关闭jedisCluster
jedisCluster.close();
}
3.4项目中使用jedis
思路:
创建一个redis操作的接口。
分别创建两个实现类对应redis的单机版和集群版。
当使用单机版redis时,配置单机版的实现类,当使用集群版本的时候,配置集群版的实现类。
3.4.1单机版实现类
/**
*redis客户端单机版实现类
*
Title:
JedisClientSingle
*
Description:
*
Company:
*@author入云龙
*@date2015年11月20日上午10:
13:
58
*@version1.0
*/
publicclassJedisClientSingleimplementsJedisClient{
@Autowired
privateJedisPooljedisPool;
@Override
publicStringset(Stringkey,Stringvalue){
Jedisjedis=jedisPool.getResource();
Stringresult=jedis.set(key,value);
jedis.close();
returnresult;
}
@Override
publicStringget(Stringkey){
Jedisjedis=jedisPool.getResource();
Stringresult=jedis.get(key);
jedis.close();
returnresult;
}
@Override
publicLonghset(Stringkey,Stringitem,Stringvalue){
Jedisjedis=jedisPool.getResource();
Longresult=jedis.hset(key,item,value);
jedis.close();
returnresult;
}
@Override
publicStringhget(Stringkey,Stringitem){
Jedisjedis=jedisPool.getResource();
Stringresult=jedis.hget(key,item);
jedis.close();
returnresult;
}
@Override
publicLongincr(Stringkey){
Jedisjedis=jedisPool.getResource();
Longresult=jedis.incr(key);
jedis.close();
returnresult;
}
@Override
publicLongdecr(Stringkey){
Jedisjedis=jedisPool.getResource();
Longresult=jedis.decr(key);
jedis.close();
returnresult;
}
@Override
publicLongexpire(Stringkey,intsecond){
Jedisjedis=jedisPool.getResource();
Longresult=jedis.expire(key,second);
jedis.close();
returnresult;
}
@Override
publicLongttl(Stringkey){
Jedisjedis=jedisPool.getResource();
Longresult=jedis.ttl(key);
jedis.close();
returnresult;
}
}
3.4.2集群版
/**
*redis客户端集群版实现类
*
Title:
JedisClientCluster
*
Description:
*
Company:
*@author入云龙
*@date2015年11月20日上午10:
14:
57
*@version1.0
*/
publicclassJedisClientClusterimplementsJedisClient{
@Autowired
privateJedisClusterjedisCluster;
@Override
publicStringset(Stringkey,Stringvalue){
returnjedisCluster.set(key,value);
}
@Override
publicStringget(Stringkey){
returnjedisCluster.get(key);
}
@Override
publicLonghset(Stringkey,Stringitem,Stringvalue){
returnjedisCluster.hset(key,item,value);
}
@Override
publicStringhget(Stringkey,Stringitem){
returnjedisCluster.hget(key,item);
}
@Override
publicLongincr(Stringkey){
returnjedisCluster.incr(key);
}
@Override
publicLongdecr(Stringkey){
returnjedisCluster.decr(key);
}
@Override
publicLongexpire(Stringkey,intsecond){
returnjedisCluster.expire(key,second);
}
@Override
publicLongttl(Stringkey){
returnjedisCluster.ttl(key);
}
}
3.4.3Spring的配置
xmlversion="1.0"encoding="UTF-8"?
>
//www.springframework.org/schema/beans"
xmlns:
context="http:
//www.springframework.org/schema/context"xmlns:
p="http:
//www.springframework.org/schema/p"
xmlns:
aop="http:
//www.springframework.org/schema/aop"xmlns:
tx="http:
//www.springframework.org/schema/tx"
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="http:
//www.springframework.org/schema/beanshttp:
//www.springframework.org/schema/beans/spring-beans-4.0.xsd
http:
//www.springframework.org/schema/contexthttp:
//www.springframework.org/schema/context/spring-context-4.0.xsd
http:
//www.springframework.org/schema/aophttp:
//www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp:
//www.springframework.org/schema/txhttp:
//www.springframework.org/schema/tx/spring-tx-4.0.xsd
http:
//www.springframework.org/schema/utilhttp:
//www.springframework.org/schema/util/spring-util-4.0.xsd">
--包扫描器,扫描带@Service注解的类-->
component-scanbase-package="com.taotao.rest.service">
component-scan>
--配置redis客户端单机版-->
--配置redis客户端实现类-->
--配置redis客户端集群版-->
--
-->
测试:
@Test
publicvoidtestJedisClientSpring()throwsException{
//创建一个spring容器
ApplicationContextapplicationContext=newClassPathXmlApplicationContext("classpath:
spring/applicationContext-*.xml");
//从容器中获得JedisClient对象
JedisClientjedisClient=applicationContext.getBean(JedisClient.class);
//jedisClient操作redis
jedisClient.set("cliet1","1000");
Stringstring=jedisClient.get("cliet1");
System.out.println(string);
}
3.5业务逻辑中添加缓存
注意:
添加缓存时不要影响正常的业务逻辑。
@Override
publicListgetContentList(Longcid){
//添加缓存
//查询数据库之前先查询缓存,如果有直接返回
try{
//从redis中取缓存数据
Stringjson=jedisClient.hget(REDIS_CONTENT_KEY,cid+"");
if(!
StringUtils.isBlank(json)){
//把json转换成List
Listlist=JsonUtils.jsonToList(json,TbContent.class);
returnlist;
}
}catch(Ex