Java-No.13 基于redis分布式缓存实现

1、redis实现分布式缓存

package com.shma.redis;

import java.util.List;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

public class RedisService {

	private GenericObjectPoolConfig jedisPoolConfig;
	private List<JedisShardInfo> jedisShardInfos;

	private ShardedJedisPool shareJedisPool;

	public void init() {
		shareJedisPool =new ShardedJedisPool(jedisPoolConfig, jedisShardInfos);
	}

	public ShardedJedis getShareJedisPoolConnection() {
		ShardedJedis shardedJedis = shareJedisPool.getResource();
		return shardedJedis;
	}

	public GenericObjectPoolConfig getJedisPoolConfig() {
		return jedisPoolConfig;
	}

	public void setJedisPoolConfig(GenericObjectPoolConfig jedisPoolConfig) {
		this.jedisPoolConfig = jedisPoolConfig;
	}

	public List<JedisShardInfo> getJedisShardInfos() {
		return jedisShardInfos;
	}

	public void setJedisShardInfos(List<JedisShardInfo> jedisShardInfos) {
		this.jedisShardInfos = jedisShardInfos;
	}

	public ShardedJedisPool getShareJedisPool() {
		return shareJedisPool;
	}

	public void setShareJedisPool(ShardedJedisPool shareJedisPool) {
		this.shareJedisPool = shareJedisPool;
	}

}
package com.shma.redis;

import redis.clients.jedis.ShardedJedis;

public class RedisCache {

	private RedisService redisService;

	public void set(String key, String value) {
		ShardedJedis shardedJedis = null;

		try {
			shardedJedis = redisService.getShareJedisPoolConnection();
			shardedJedis.set(key, value);
		} catch (Throwable e) {
			e.printStackTrace();
		} finally {
			shardedJedis.close();
		}
	}

	public String get(String key) {
		ShardedJedis shardedJedis = null;

		try {
			shardedJedis = redisService.getShareJedisPoolConnection();

			return shardedJedis.get(key);
		} catch (Throwable e) {
			e.printStackTrace();
		} finally {
			shardedJedis.close();
		}

		return null;
	}

	public boolean del(String key) {
		ShardedJedis shardedJedis = null;

		try {
			shardedJedis = redisService.getShareJedisPoolConnection();
			return shardedJedis.del(key) > 0 ? true : false;
		} catch (Throwable e) {
			e.printStackTrace();
		} finally {
			shardedJedis.close();
		}

		return false;
	}

	public RedisService getRedisService() {
		return redisService;
	}

	public void setRedisService(RedisService redisService) {
		this.redisService = redisService;
	}
}

spring-application.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
	xmlns:p="http://www.springframework.org/schema/p">

	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
	    	<value>config/redis.properties</value>
		</property>
	</bean>

	<bean id="jedisPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
		<property name="maxTotal" value="${redis.maxTotal}"></property>
		<property name="maxIdle" value="${redis.maxIdle}"></property>
		<property name="minIdle" value="${redis.minIdle}"></property>
		<property name="maxWaitMillis" value="${redis.maxWaitMillis}"></property>
		<property name="testOnBorrow" value="${redis.testOnBorrow}"></property>
	</bean>

	<bean id="jedisShardInfo01" class="redis.clients.jedis.JedisShardInfo">
		<constructor-arg value="${redis.host.shard01}"></constructor-arg>
		<constructor-arg value="${redis.port.shard01}"></constructor-arg>
		<constructor-arg value="${redis.timeout}"></constructor-arg>
	</bean>

	<bean id="jedisShardInfo02" class="redis.clients.jedis.JedisShardInfo">
		<constructor-arg value="${redis.host.shard02}"></constructor-arg>
		<constructor-arg value="${redis.port.shard02}"></constructor-arg>
		<constructor-arg value="${redis.timeout}"></constructor-arg>
	</bean>

	<bean id="redisService" class="com.shma.redis.RedisService" init-method="init">
		<property name="jedisPoolConfig">
			<ref bean="jedisPoolConfig"/>
		</property>

		<property name="jedisShardInfos">
			<list>
				<ref bean="jedisShardInfo01"/>
				<ref bean="jedisShardInfo02"/>
			</list>
		</property>
	</bean>

	<bean id="redisCache" class="com.shma.redis.RedisCache">
		<property name="redisService">
			<ref bean="redisService"/>
		</property>
	</bean>

</beans>

redis.properties配置文件

#客户端超时时间单位是毫秒
redis.timeout=10000
#最大连接数
redis.maxTotal=5000
#最小空闲数
redis.minIdle=100
#最大空闲数
redis.maxIdle=5000
#最大建立连接等待时间
redis.maxWaitMillis=5000

redis.testOnBorrow=false

redis.host.shard01=183.131.6.62
redis.port.shard01=6379

redis.host.shard02=127.0.0.1
redis.port.shard02=6379

2、在redis.clients.jedis源码中发现,实现分布式如果有一台服务器岩机,则会导致整个分布式无法使用

修改redis.clients.jedis.JedisShardInfo类

@Override
  public Jedis createResource() {
    Jedis jedis = new Jedis(this);
    
    try {
    	if("pong".equals(jedis.ping())) {
        	jedis.select(db);
    		return jedis;
        }
    } catch(Throwable e) {
    	System.out.println("连接异常=>" + getHost() + ":" + getPort() + ":" + db);
    }
    
    return null;
  }

修改redis.clients.util.Sharded类

private void initialize(List<S> shards) {
    nodes = new TreeMap<Long, S>();

    for (int i = 0; i != shards.size(); ++i) {
        final S shardInfo = shards.get(i);

        R r = shardInfo.createResource();
        // 如果创建redis失败,则自动剔除岩机服务器
        if (r != null) {
            if (shardInfo.getName() == null)
	        for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
		    nodes.put(this.algo.hash("SHARD-" + i + "-NODE-" + n), shardInfo);
	        }
	    else
    	        for (int n = 0; n < 160 * shardInfo.getWeight(); n++) {
		    nodes.put(this.algo.hash(shardInfo.getName() + "*" + shardInfo.getWeight() + n), shardInfo);
	        }
	    resources.put(shardInfo, r);
        }
    }
}

在默认redis分布式实现中不支持选择db,你也可以修改构造器,传入db,分布式在一台redis的多个db中实现

时间: 2024-11-06 22:53:11

Java-No.13 基于redis分布式缓存实现的相关文章

基于redis分布式缓存实现(新浪微博案例)

第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率 性能需求, 随着读操作的量的上升需要解决,经历的过程有: 数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis 解决写的问题: 水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在

转载自haier_jiang的专栏基于redis分布式缓存实现

简单说明下,写此文章算是对自己近一段工作的总结,希望能对你有点帮助,同时也是自己的一点小积累. 一.为什么选择redis 在项目中使用redis做为缓存,还没有使用memcache,考虑因素主要有两点: 1.redis丰富的数据结构,其hash,list,set以及功能丰富的String的支持,对于实际项目中的使用有很大的帮忙.(可参考官网redis.io) 2.redis单点的性能也非常高效(利用项目中的数据测试优于memcache). 基于以上考虑,因此选用了redis来做为缓存应用. 二.

基于redis分布式缓存实现

第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来越多, 但memcache中没有, 影响开发效率 性能需求, 随着读操作的量的上升需要解决,经历的过程有: 数据库读写分离(M/S)–>数据库使用多个Slave–>增加Cache (memcache)–>转到Redis 解决写的问题: 水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在

Java-No.14 基于redis分布式缓存队列实现抢红包功能

package com.shma.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class ObjectUtil {      /**对象转byte[]      * @par

Redis 分布式缓存 Java 框架

为什么要在 Java 分布式应用程序中使用缓存? 在提高应用程序速度和性能上,每一毫秒都很重要.根据谷歌的一项研究,假如一个网站在3秒钟或更短时间内没有加载成功,会有 53% 的手机用户会离开. 缓存是让分布式应用程序加速的重要技术之一.存储的信息越接近 CPU,访问速度就越快.从 CPU 缓存中加载数据比从 RAM 中加载要快得多,比从硬盘或网络上加载要快得多得多. 要存储经常访问的数据,分布式应用程序需要在多台机器中维护缓存.分布式缓存是降低分布式应用程序延迟.提高并发性和可伸缩性的一种重要

基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似"秒杀"的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓"秒杀"的基本思路. 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户"争抢"资源,这里的资源在大部分秒杀场景里是商品:将业务抽象,技术角度看,秒杀就是多个线程对资源进行操作,所以实现秒杀,就必须控制线程对资源的争抢,既要保证高效并发,也要保证操作的正确. 一些可能的实现 刚才提到过,实现秒杀的关键点是控制线程对资源的争抢,根据基本的线程知识,可

Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建

[TOC] Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建 Redis Java API使用(一):单机版本Redis API使用 Redis的Java API通过Jedis来进行操作,因此首先需要Jedis的第三方库,因为使用的是Maven工程,所以先给出Jedis的依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactI

RedLock.Net - 基于Redis分布式锁的开源实现

工作中,经常会遇到分布式环境中资源访问冲突问题,比如商城的库存数量处理,或者某个事件的原子性操作,都需要确保某个时间段内只有一个线程在访问或处理资源. 因此现在网上也有很多的分布式锁的解决方案,有数据库.MemCache.ZoopKeeper等等的方式. 这次,我们要学习的是一个基于Redis分布式锁的插件,RedLock.Net. 首先必须要有一个Redis服务来支持此分布式锁,其次就当然是要获取此插件了. 可以从Nuget中获取,也可以直接去Github下载   https://github

Redis分布式缓存安装(单节点)

Redis分布式缓存安装(单节点) Redis官网:http://redis.io独立缓存服务器:IP:xxx.xxx.xxx.xxx安装环境:CentOS 6.6Redis 版本:redis-3.0(因为 Redis3.0 在集群和性能提升方面的特性,rc 版为正式版的候选版,请在安装时去官网选用最新版)用户:root安装目录:/usr/local/redis 下面我们针对于Redis安装做下详细的记录:编译和安装所需的包:# yum install gcc tcl 提醒:下载 3.0 版 R