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