实战项目商城(第七天)
来源:互联网 发布:淘宝主店怎么绑定分店 编辑:程序博客网 时间:2024/05/02 01:41
1、内容管理功能添加缓存。
a) 使用redis做缓存工具
b) 实现系统高可用,redis需要做主备。使用redis做分片集群。Redis集群的搭建。
c) 向业务逻辑中添加缓存。
遇到406问题:
1.检查是否有Jackson包。
2.如果后缀是HTML是不能相应json数据的。需要修改后缀名。
Post乱码问题:
使用redis做缓存
先决条件:yum install gcc-c++1.下载redis的源码包。
2.把源码包上传到服务器。
3.解压源代码
tar -zxvf redis-3.0.0.tar.gz
4.make
5.make install PREFIX=/usr/local/redis
启动redis
1丶/usr/local/redis/redis-service 端口是6397
2、后端启动
1)从redis的源码目录中复制redis.conf到redis的安装目录。
2)修改配置文件
3)[root@bogonbin]# ./redis-server redis.conf
Redis集群的搭建
需要安装rubyyum install ruby
yum install rubygems
redis集群管理工具redis-trib.rb
[root@bogon ~]# cd redis-3.0.0
[root@bogon redis-3.0.0]# cd src
[root@bogon src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr 1 07:01 redis-trib.rb
[root@bogon src]#
安装ruby的包:
gem install redis-3.0.0.gem
[root@bogon ~]# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation forredis-3.0.0...
Installing RDoc documentation forredis-3.0.0...
1.创建6个redis实例,端口号从7001~7006
2.修改redis的配置文件
3.把创建集群的ruby脚本复制到redis-cluster目录下
4.启动6个redis实例
5.创建集群
./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
测试集群:
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002 -c
关闭redis:
redis01/redis-cli -p 7001 shutdown
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002
192.168.25.153:7002> set a 100
(error) MOVED 15495 192.168.25.153:7003
192.168.25.153:7002>
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.153 -p 7002 -c
192.168.25.153:7002> set a 100
-> Redirected to slot [15495] located at 192.168.25.153:7003
OK
192.168.25.153:7003>
Redis客户端
Redis-cli
自带客户端。使用最多的。
图形化界面客户端
需要注意哦:开启6397的端口
Jedis客户端
需要把jedis的jar包添加到工程中,如果是maven需要添加jar包的坐标。
单机版:
@Testpublic void testJedisSingle(){//创建一个jedis的对象Jedis jedis = new Jedis("192.168.126.133",6379);jedis.auth("123");//调用jedis对象的方法,方法名称和redis的命令一致jedis.set("key1","jedis test");String string = jedis.get("key1");System.out.println(string);jedis.close();}@Testpublic void testJedispoll(){JedisPool pool = new JedisPool("192.168.126.133",6379);Jedis resource = pool.getResource();resource.auth("123");String string = resource.get("key1");System.out.println(string);resource.close();pool.close();}
集群版:要打开虚拟机的端口,见另外转载的一篇博客。
@Testpublic void testJedisCluster(){HashSet<HostAndPort> nodes = new HashSet<>();nodes.add(new HostAndPort("192.168.126.133", 7001));nodes.add(new HostAndPort("192.168.126.133", 7002));nodes.add(new HostAndPort("192.168.126.133", 7003));nodes.add(new HostAndPort("192.168.126.133", 7004));nodes.add(new HostAndPort("192.168.126.133", 7005));nodes.add(new HostAndPort("192.168.126.133", 7006));JedisCluster cluster = new JedisCluster(nodes);//cluster.auth("123");cluster.set("key1", "1000");String string = cluster.get("key1");System.out.println(string);cluster.close();}
jedis整合spring
单机整合:
<bean id="redisClient" class="redis.clients.jedis.JedisPool"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="6379"></constructor-arg></bean>
@Testpublic void testSpring(){ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-jedis.xml");JedisPool pool = (JedisPool) context.getBean("redisClient");Jedis jedis = pool.getResource();jedis.auth("123");String string = jedis.get("key1");System.out.println(string);pool.close();jedis.close();}集群版:
<!-- 集群版 --><bean id="redisClient" class="redis.clients.jedis.JedisCluster"><constructor-arg name="nodes"><set><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7001"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7002"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7003"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.25.153"></constructor-arg><constructor-arg name="port" value="7004"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7005"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7006"></constructor-arg></bean></set></constructor-arg><!-- <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg> --></bean>
@Testpublic void testCluster(){ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-jedis.xml");JedisCluster cluster = (JedisCluster) context.getBean("redisClient");//cluster.auth("123");String string = cluster.get("key1");System.out.println(string);cluster.close();}
添加jedis dao
单机版
@Autowiredprivate JedisPool jedisPool;@Overridepublic String get(String key) {Jedis jedis = jedisPool.getResource();jedis.auth("123");String string = jedis.get(key);jedis.close();return string;}@Overridepublic String set(String key, String value) {Jedis jedis = jedisPool.getResource();jedis.auth("123");String set = jedis.set(key, value);jedis.close();return set;}@Overridepublic String hget(String hkey, String key) {Jedis jedis = jedisPool.getResource();jedis.auth("123");String set = jedis.hget(hkey, key);jedis.close();return set;}@Overridepublic Long hset(String hkey, String key, String value) {Jedis jedis = jedisPool.getResource();jedis.auth("123");Long hset = jedis.hset(hkey, key, value);jedis.close();return hset;}@Overridepublic long incr(String key) {Jedis jedis = jedisPool.getResource();Long long1 = jedis.incr(key);jedis.close();return long1;}@Overridepublic long expire(String key, int second) {Jedis jedis = jedisPool.getResource();Long expire = jedis.expire(key, second);jedis.close();return expire;}@Overridepublic long ttl(String key) {Jedis jedis = jedisPool.getResource();Long ttl = jedis.ttl(key);jedis.close();return ttl;}
spring配置文件<bean id="redisClient" class="redis.clients.jedis.JedisPool"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="6379"></constructor-arg></bean><bean id="jedisClient" class="com.taotao.rest.dao.impl.JedisClientSingle"></bean>
集群版
@Autowiredprivate JedisCluster jedisCluster; @Overridepublic String get(String key) {// TODO Auto-generated method stubreturn jedisCluster.get(key);}@Overridepublic String set(String key, String value) {// TODO Auto-generated method stubreturn jedisCluster.set(key, value);}@Overridepublic String hget(String hkey, String key) {// TODO Auto-generated method stubreturn jedisCluster.hget(hkey, key);}@Overridepublic Long hset(String hkey, String key, String value) {// TODO Auto-generated method stubreturn jedisCluster.hset(hkey, key, value);}@Overridepublic long incr(String key) {// TODO Auto-generated method stubreturn jedisCluster.incr(key);}@Overridepublic long expire(String key, int second) {// TODO Auto-generated method stubreturn jedisCluster.expire(null, second);}@Overridepublic long ttl(String key) {// TODO Auto-generated method stubreturn jedisCluster.ttl(key);}
spring配置文件
<bean id="redisClient" class="redis.clients.jedis.JedisCluster"><constructor-arg name="nodes"><set><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7001"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7002"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7003"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.25.153"></constructor-arg><constructor-arg name="port" value="7004"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7005"></constructor-arg></bean><bean class="redis.clients.jedis.HostAndPort"><constructor-arg name="host" value="192.168.126.133"></constructor-arg><constructor-arg name="port" value="7006"></constructor-arg></bean></set></constructor-arg></bean> <bean id="jedisClientCluster" class="com.taotao.rest.dao.impl.JedisClientCluster"></bean>
把缓存添加到业务逻辑
@Autowiredprivate TbContentMapper contentMapper;@Autowiredprivate JedisClient jedisClient;@Value("${INDEX_CONTENT_REIDS_KEY}")private String INDEX_CONTENT_REIDS_KEY;@Overridepublic List<TbContent> getContentList(long contentCid) {//从缓存中取try {String string = jedisClient.hget(INDEX_CONTENT_REIDS_KEY, contentCid+"");if(!StringUtils.isEmpty(string)){List<TbContent> resultList = JsonUtils.jsonToList(string, TbContent.class);return resultList;}} catch (Exception e) {e.printStackTrace();}TbContentExample example = new TbContentExample();Criteria criteria = example.createCriteria();criteria.andCategoryIdEqualTo(contentCid);List<TbContent> list = contentMapper.selectByExample(example);//向缓存中添加内容try {//把list转换成字符串String cacheString = JsonUtils.objectToJson(list);jedisClient.hset(INDEX_CONTENT_REIDS_KEY, contentCid+"", cacheString);} catch (Exception e) {e.printStackTrace();}return list;}
缓存同步
当后台管理系统,修改内容之后需要通知redis把修改的内容对应的分类id的key删除。
Dao层
使用JedisClient接口对应的实现类。
6.4 Service层
接收内容分类id,调用dao删除redis中对应的hash中key为分类id的项。
参数:内容分类id
返回值:TaotaoResult
@Serviceclass RedisServiceImpl implements RedisService{@Autowiredprivate JedisClient jedisClient;@Value("${INDEX_CONTENT_REIDS_KEY}")private String INDEX_CONTENT_REIDS_KEY;@Overridepublic TaotaoResult syncContent(long contentCid) {try {jedisClient.hdel(INDEX_CONTENT_REIDS_KEY, contentCid+"");} catch (Exception e) {return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e)); }return TaotaoResult.ok();}}
Controller层接收内容分类id,调用Service返回taotaoResult。
@Controller@RequestMapping("/cache/sync")public class RedisController {@Autowiredprivate RedisService redisService;@RequestMapping("/content/{contentCid}")@ResponseBodypublic TaotaoResult contentCahceSync(@PathVariable Long contentCid){TaotaoResult result = redisService.syncContent(contentCid);return result;}}
同步缓存服务的调用需要在后台管理系统中添加一个服务调用的逻辑。当修改内容信息后,需要调用此服务同步缓存。
//添加缓存同步逻辑try {HttpClientUtil.doGet(REST_BASE_URL+REST_CONTENT_SYNC_URL+tbContent.getCategoryId());} catch (Exception e) {e.printStackTrace();}
- 实战项目商城(第七天)
- 实战项目商城(第一天)
- 实战项目商城(第三天)
- 实战项目商城(第五天)
- 实战项目商城(第八天)
- 淘淘商城第七天
- php实战第七天
- ASP.Net 实战项目 之 《图书商城》 第一天
- ASP.Net 实战项目 之 《图书商城》 第三天
- ASP.Net 实战项目 之 《图书商城》 第五天
- 商城项目实战
- 项目组长第七天
- 项目第七天
- 项目第七天
- 商城项目第一天
- 实战项目商城(第二天)
- 实战项目商城(第四天)
- 实战项目商城(第六天)
- android removeFooterView classCastException 原因
- TabLayout
- poj3122 pie 二分
- 【译】用 CSS 隐藏页面元素的 5 种方法
- noip2009靶形数独
- 实战项目商城(第七天)
- Vector
- 杂
- JavaScript for Kids 学习笔记4. Objects
- 在MATLAB中BP神经网络表达式
- Android中的Service:Binder,Messenger,AIDL
- 算术转化和整型提升的奥秘
- SlidingMenu侧滑
- 字符串分割c++