Redis在java项目中的缓存应用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/use_admin/article/details/85304592

前言

在当前大数据时代,信息量、数据量日益膨胀;一些存储系统的数据库也不断优化,去适应这个大数据的需求;当我们的客户端某个系统发送请求频繁读取大量数据的时候,单单是:客户端–>请求/响应–>数据库;这种模式是远远不能满足用户需求的;因为这种模式频繁请求涉及很多的IO流访问,成本量太高;就从系统处理器上面来说,当用户发送指令给PC系统时,其处理器执行该指令很快很快(在内存中);接着从IO流访问数据库开始就变得很慢很慢(远远跟不上处理器的执行速度了,导致处理效率非常低);如果我们将用户需要的数据提前缓冲到计算机内存中(相当于处理器的处理响应结果可以直接在内存中拿到,不需要再操作多余的IO流);读取数据响应就非常快了,就可以大幅度提高效率,节省时间。但是Redis的内存管理成本也是比较高的,如果Redis配置不当,占用的过多的内存是会带来很大的性能影响的;因此需要合理的配置好Redis的参数,控制和节约内存。
常用的配置优化
1.将redis.conf文件中vm-enabled为no(关闭虚拟内存功能);
2.设置好redis.conf中的maxmemory选项,该选项是告诉Redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护好你的Redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。
Redis的应用

一、Redis在java项目中的应用

1.前提条件(我自己涉及需要到的jar包,可以不用)
1.1 导入redis包
在这里插入图片描述
可以自行百度下载,也可以点此链接下载redies包
1.2 导入json包(也可以不使用json,本人在项目中使用到了就导进来)
在这里插入图片描述
自行百度下载或点这里json包
1.3 需要已经安装部署好Redis服务端,可以参考:配置redis

2.java代码实现
2.0 RedisUtil.java类和main方法

public class RedisUtil{
	//获取redis连接方法
	private static JedisCluster redis=null;
	private static JedisCluster getRedisConnection(){
		if(redis==null){
			createPool();
		}
		return redis;
	}
	/**
	 * @param args
	 * 测试main
	 */
	public static void main(String[] args) {
		JedisCluster redis=RedisUtil.getRedisConnection();//调用获取redis连接的方法
		RedisUtil.setValue("key_1", "value_1");//设置key_1=value_1
		RedisUtil.setValue("key_1_1", "value_1_1");//设置key_1=value_1
		System.out.println(RedisUtil.getValue("key_1","key_1_1"));//获取子key的值
		System.out.println(RedisUtil.getAllValue("key_1"));	//获取key的所有值
		JSONObject jsonobj=new JSONObject();//创建json对象
		jsonobj.put("ObjI_Button", "ADD,QUERY,UPDATE");
		jsonobj.put("Objl_Factory", "WH");
		jsonobj.put("Objl_Repair_depart", "1,2");
		JSONArray jsonArr=new JSONArray();//创建json数组
		jsonArr.add(jsonobj);
		RedisUtil.setValue("key_2", "key_2_1",jsonArr.toString());//存key值
		RedisUtil.delKey("key_1", "key_1_1");//删除子key
	}
	}

2.1创建redis链接
(1)IOUtil.java类:操作IO工具类,主要用于读取Redis配置文件的参数

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
public class IOUtil {
/*
 * IO流利用Properties类(持久化的属性集)读取文件的key=value值
 *1.创建Properties类对象
 *2.加载属性文件 
 *@param--key:需要取value对应的key值
 *@param--path:文件路径
 *@return key的属性值
 * */
public static String getPropertyByName(String key,String path){
	Properties properties=new Properties();//创建properties类对象
	InputStream input=null;//输入流
	try {
	    input=new FileInputStream(path);//输入流读取文件
		properties.load(new InputStreamReader(input, "utf-8"));//加载属性文件
		return properties.getProperty(key);//获取key的属性值
	}catch (IOException e) {
		e.printStackTrace();
		return e.getMessage();
	}finally{
		if(input!=null){
			try {
				input.close();//关闭输入流
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}	
}
}

(2)createPool.java类:创建redis连接池,主要用于读取配置文件并获取host地址和端口,配置redis客户端的服务参数

	/*
	 * 创建redis连接
	 * 1.读取配置文件
	 * 2.获取HOST地址和端口port
	 * 3.redis客户端服务配置
	 * @param 全局变量:JedisCluster redis
	 * */
	private static void createPool(){
		//获取本地文件key对应的value值,文件名:Config/test.properties,格式:key=value;
		String maxToal=IOUtil.getPropertyByName("pool.size","Config/test.properties");
		//格式:redis.cluster.address=192.168.0.1:10001;192.168.0.2:10002;192.168.0.3:10003;可以设置多个集群,ip+port
		String addressList=IOUtil.getPropertyByName("redis.cluster.address","Config/test.properties");
		//保存addressList里面的HOST地址和端口port
		Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
		for(String address:addressList.split(";")){
			jedisClusterNodes.add(
					new HostAndPort( address.split(":")[0] , Integer.parseInt(address.split(":")[1]) ) );
		}
		//redis客户端服务配置
		JedisPoolConfig config = new JedisPoolConfig();
		//设置获取连接时最大的等待时间,超时就抛异常;小于0:阻塞不确定的时间,默认-1
		config.setMaxWaitMillis(20*1000);
		//设置最大连接数,默认是8个
		config.setMaxTotal(Integer.parseInt(maxToal));
		//获取redis连接,参数:address:port、config
		redis = new JedisCluster(jedisClusterNodes,config);//redis为全局变量,redis不为null就已经是创建了,不必重复创建
	}

2.2 操作redis数据库常用一般方法

       //1.获取key/subkey对应的value值
	public static String getValue(String key,String subKey){
		JedisCluster jd=RedisUtil.getRedisConnection();
		String reStr= jd.hget(key, subKey);
		return reStr;
	}
	public static String getValue(String key){
		JedisCluster jd=RedisUtil.getRedisConnection();
		String reStr=jd.get(key);
		return reStr;
	}
	//2.获取key/subkey调用的次数
	public static Long getIncr(String key){
		JedisCluster jd=RedisUtil.getRedisConnection();
		return jd.incr(key);
	}
	public static Long getIncr(String key,String subKey){
		JedisCluster jd=RedisUtil.getRedisConnection();
		return jd.hincrBy(key, subKey,1);
	}
	//3.获取key对应value值调用的次数
	public static Long getIncr(String key,String subKey,long value){
		JedisCluster jd=RedisUtil.getRedisConnection();
		return jd.hincrBy(key, subKey,value);
	}
	//4.设置保存key/subkey-value值
	public static void setValue(String key,String value){
		JedisCluster jd=RedisUtil.getRedisConnection();
		jd.set(key, value);
	}
	public static void setValue(String key,String subKey,String value){
		JedisCluster jd=RedisUtil.getRedisConnection();
		jd.hset(key,subKey, value);
	}
	//5.设置key的生存时间,过时就自动删除
	public static void expire(String key, int seconds){
		JedisCluster jd=RedisUtil.getRedisConnection();
		jd.expire(key, seconds);
	}
	//6.直接删除key/subkey
	public static void delKey(String key){
		JedisCluster jd=RedisUtil.getRedisConnection();
		jd.del(key);
	}
	public static void delKey(String key,String subKey){
		JedisCluster jd=RedisUtil.getRedisConnection();
		jd.hdel(key, subKey);
	}
	//7.获取key所对应的key-value键值对,存map
	public static Map<String,String> getAllValue(String key){
		JedisCluster jd=RedisUtil.getRedisConnection();
		Map<String,String> reStr=jd.hgetAll(key);
		return reStr;
	}
	//8.判断key/subkey是否存在
	public static boolean keyIsExists(String key){
		JedisCluster jd=RedisUtil.getRedisConnection();
		return jd.exists(key);
	}
	public static boolean keyIsExists(String key,String subKey){
		JedisCluster jd=RedisUtil.getRedisConnection();
		return jd.hexists(key, subKey);
	}

猜你喜欢

转载自blog.csdn.net/use_admin/article/details/85304592