windows创建测试Redis集群,和Spring集成,配置缓存
创建集群
1.你需要先有6个Redis运行实例:
创建方法。
a.简单暴力。把程序复制6份。分别放置到6个文件夹中。
7001~7006将是这6个进程的端口号。修改各自文件夹下的redis.windows.conf文件,
port 后面的XXXX就是7001~7006当中的某一个,分别对应文件夹。
port XXXX
cluster-enabled yes
使用下面命令启动6个服务器,可写到bat脚本中。
redis-server redis.windows.conf
b为了以后使用方便,可以注册成服务。
redis-server --service-install redis.windows.conf --service-name 你的服务名称
2.下载安装Ruby,地址
下载redis gem,地址
https://rubygems.org/gems/redis/versions
选择一个Version,在右下角下载,到C盘,安装命令
gem install C:\redis-4.0.2.gem
3.下载集群安装脚本
到http://download.redis.io/releases/下载redis的源码包,比如3.2.0版本的,在源码包的src文件夹下找到一个
叫redis-trib.rb的文件。
4,创建集群。
创建之前需要启动服务器。创建命令,在redis-trib文件的盘符下,
C:\>redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
创建3主3从的集群。
5测试集群。
redis-cli -c -h 127.0.0.1 -p 7002
连接集群中任意一个即可。
和Spring整合
单机配置和测试
<!-- 单机版 --> <bean id="redisClient" class="redis.clients.jedis.JedisPool"> <constructor-arg name="host" value="127.0.0.1"></constructor-arg> <constructor-arg name="port" value="6379"></constructor-arg> </bean>
@Test public void testSpringJedis() { ApplicationContext aContext=new ClassPathXmlApplicationContext("classpath:applicationContext-jedis.xml"); JedisPool bean = (JedisPool)aContext.getBean("redisClient"); Jedis jd =bean.getResource(); String string= jd.get("a"); System.out.println(string); jd.close(); bean.close(); }
集群配置和测试
<!-- 集群版 --> <bean id="redisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="127.0.0.1"></constructor-arg> <constructor-arg name="port" value="7001"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="127.0.0.1"></constructor-arg> <constructor-arg name="port" value="7002"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="127.0.0.1"></constructor-arg> <constructor-arg name="port" value="7003"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="127.0.0.1"></constructor-arg> <constructor-arg name="port" value="7004"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="127.0.0.1"></constructor-arg> <constructor-arg name="port" value="7005"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="127.0.0.1"></constructor-arg> <constructor-arg name="port" value="7006"></constructor-arg> </bean> </set> </constructor-arg> </bean>
@Test public void testSpringJedisCluster() { ApplicationContext aContext=new ClassPathXmlApplicationContext("classpath:applicationContext-jedis.xml"); JedisCluster jc = (JedisCluster)aContext.getBean("redisCluster"); String value=jc.get("a"); System.out.println(value); jc.close(); }
配置缓存
关键说明:Redis缓存使用一般在Service层,缓解Service层访问数据库的压力。
使用HashMap,比如ContentCategory表,建立hashkey ContentCategoryIndex,然后使用表中的各个ID作为HashMap的子key。
该Service层需要操作Redis数据库,因此需要一个Jedis Dao的类。
package com.taotao.dao; public interface JedisClient { String get(String key); String set(String key,String value); String hget(String hkey,String key); Long hset(String hkey,String key,String value); long incr(String key); long expire(String key,int second); long ttl(String key); long del(String key); } public class JedisClientImpl implements JedisClient { @Autowired private JedisPool jedisPool; @Override public String get(String key) { Jedis jedis = jedisPool.getResource(); String string = jedis.get(key); jedis.close(); return string; } @Override public String set(String key, String value) { Jedis jedis = jedisPool.getResource(); String string = jedis.set(key, value); jedis.close(); return string; } @Override public String hget(String hkey, String key) { Jedis jedis = jedisPool.getResource(); String string = jedis.hget(hkey, key); jedis.close(); return string; } @Override public Long hset(String hkey, String key, String value) { Jedis jedis = jedisPool.getResource(); Long result = jedis.hset(hkey, key, value); jedis.close(); return result; } @Override public long incr(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.incr(key); jedis.close(); return result; } @Override public long expire(String key, int second) { Jedis jedis = jedisPool.getResource(); Long result = jedis.expire(key,second); jedis.close(); return result; } @Override public long ttl(String key) { Jedis jedis = jedisPool.getResource(); Long result = jedis.ttl(key); jedis.close(); return result; } @Override public long del(String key) { // TODO Auto-generated method stub Jedis jedis=jedisPool.getResource(); long result=jedis.del(key); jedis.close(); return result; } }
注意:集群版DAO的书写,不需要close
public class JedisClientCluster implements JedisClient { @Autowired private JedisCluster jedisCluster; @Override public String get(String key) { return jedisCluster.get(key); }
关键:在上述的applicationContext-jedis.xml文件中,
添加
<bean id="JedisClient" class="com.taotao.dao.JedisClientImpl"></bean>
服务层的代码,红色是配置redis缓存所添加的代码。
@Service public class ContentServiceImpl implements ContentService { @Autowired private TbContentMapper contentMapper; @Autowired private JedisClient jedisClient; @Value("${INDEX_CONTENT_REDIS_KEY}") private String content_index; @Override public List<TbContent> getContentList(long contentCid) { // TODO Auto-generated method stub //retrieve cache try { String result=jedisClient.hget(content_index, contentCid+""); if(result!=null) { List<TbContent> resultList = JsonUtils.jsonToList(result, TbContent.class); return resultList; } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } //根据内容分类id查询内容列表 TbContentExample example = new TbContentExample(); Criteria criteria = example.createCriteria(); criteria.andCategoryIdEqualTo(contentCid); //执行查询 List<TbContent> list = contentMapper.selectByExample(example); //save cache try { String cacheString= JsonUtils.objectToJson(list); jedisClient.hset(content_index, contentCid+"", cacheString); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return list; } }