转自 http://blog.csdn.net/u010539352/article/details/51778242
前两天刚刚搭建完了Redis集群,今天正好测试一下在Java中如何使用redis缓存一些东西。与spring是如何结合在一起的。封装一个操作redis的工具类,供项目中使用。
第一篇redis博客讲解过单机版在Java中的应用,应该了解到了。
首先要把jedis依赖的jar包加上。
在spring配置文件中添加redis配置。(三主三从,9001-9003是主,9004-9006是从)
[html] view plain copy <!-- 配置redis客户端集群版 --> <!-- <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.XX.XX"/> <constructor-arg name="port" value="9001"/> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="XXXXXXX"/> <constructor-arg name="port" value="9002"/> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="XXXXXXX"/> <constructor-arg name="port" value="9003"/> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="XXXXXXX"/> <constructor-arg name="port" value="9004"/> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="XXXXXXX"/> <constructor-arg name="port" value="9005"/> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="XXXXXXX"/> <constructor-arg name="port" value="9006"/> </bean> </set> </constructor-arg> </bean> lt;bean id="jedisClientCluster" class="com.dianshang.rest.component.impl.JedisClientCluster"/> 封装 redis 的一些常用操作 (存储 String 类型,获取 String 类型,设置过期时间,删除 hash 数据等等)
[html] view plain copy /** * redis操作工具类 * @author xiao * */ public class JedisClientCluster implements JedisClient{ //注入jedisCluster @Autowired private JedisCluster jedisCluster; /** * 设置String数据类型 * * @param key * @param value * @return */ @Override public String set(String key, String value) { return jedisCluster.set(key, value); } /** * 获取String数据类型 * * @param key * @return */ @Override public String get(String key) { return jedisCluster.get(key); } /** * 设置hash数据类型 * * @param key * @param item * @param value * @return */ @Override public Long hset(String key, String item, String value) { return jedisCluster.hset(key, item, value); } /** * 获取hash数据类型 * * @param key * @param item * @return */ @Override public String hget(String key, String item) { return jedisCluster.hget(key, item); } /** * 删除hash数据 * @param key * @param item * @return */ @Override public Long incr(String key) { return jedisCluster.incr(key); } /** * 加一操作 * * @param key * @return */ @Override public Long decr(String key) { return jedisCluster.decr(key); } /** * 减一操作 * * @param key * @return */ @Override public Long expire(String key, int second) { return jedisCluster.expire(key, second); } /** * 设置key的过期时间 * * @param key * @param second * @return */ @Override public Long ttl(String key) { return jedisCluster.ttl(key); } /** * 判断key是否过期 * * @param key * @return */ @Override public Long hdel(String key, String item) { return jedisCluster.hdel(key, item); } }
注:接口就不写出来了。
编写测试类进行测试
[html] view plain copy @Test public void testJedisClientSpring() throws Exception { //创建一个spring容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml"); //从容器中获得JedisClient对象 JedisClient jedisClient = applicationContext.getBean(JedisClient.class); //jedisClient操作redis jedisClient.set("cliet1", "1000"); String string = jedisClient.get("cliet1"); System.out.println(string); }测试结果:
上一篇博客中我只讲解了一下我在搭建redis集群的时候遇到的问题,不知道大家有没有疑问,就是我往客户端配置了这么多节点,往redis中缓存数据的时候,它怎么知道该缓存到哪个服务器上呢??在这里我简单的说一下,
Redis 集群中内置了16384 个哈希槽,搭建集群时,每台服务器上已经分配了固定的哈希槽编号。当需要在 Redis 集群中放置一个key-value(数据) 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据求余的结果,把数据映射到不同的redis服务器上。