redis缓存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis缓存相关的知识,希望对你有一定的参考价值。

Redis简介

Redis是一款开源的分布式缓存与存储系统,由于它的高性能,数据类型多样性以及分布式特性,在各大系统中应用广泛。本系列一共三篇,本篇主要介绍Redis的安装及配置,基本数据结构用法,过期设置等;第二篇介绍Java,NodeJS操作Redis;第三篇介绍Redis分布式集群。另:Redis推荐的运行环境是Linux,所以下面都以Linux环境进行介绍。

安装及配置

首先去官网下载redis压缩包,或者通过如下命令在线下载wget http://download.redis.io/redis-stable.tar.gz


解压及编译

tar xzf redis-stable.tar.gz cd redis-stable make

 

配置端口及自动启动

1,redis源码目录下的utils的redis_init_script拷贝/etc/init.d中并改名成redis_端口号,比如redis_6379,并且把REDISPORT改成6379,下面都以这个端口为例

 2,新建两个文件夹     /etc/redis  用于存放redis的配置文件     /var/redis/6379  存放redis的持久化文件
 3,把redis跟目录下的redis.conf文件复制到 /etc/redis中并修改名字为6379.conf,然后进行如下       编辑     daemonize    yes           #守护进程模式     pidfile           /var/run/redis_6379.pid  #设置pid文件位置     port            6379         设置监听端口     dir             /var/redis/6379      设置持久化文件存放位置
4,启动     /etc/init.d/redis_6379 start    centos自动启动配置
    需要现在redis_6379文件的前面加上如下:    # chkconfig:   2345 90 10    # description:  Redis is a persistent key-value database    然后执行:
    chkconfig --add redis_6379
5,停止redis     redis-cli shutdown

6,客户端连接     redis-cli -h 127.0.0.1 -p 6379



java代码

/**
 * RedisUnit
 * @author dsine
 */
public class RedisUnit {
	/**
	 * 服务地址
	 */
	private String host;

	/**
	 * 端口,默认端口是6379
	 */
	private Integer port;
	
	/**
	 * 密码
	 */
	private String password = "123456";

	/**
	 * 默认key前缀
	 */
	private String defaultKeyPrefix = "";
	
	/**
	 * 最小空闲连接数
	 */
	private Integer minIdle = 5;
	
	/**
	 * 最大空闲连接数
	 */
	private Integer maxIdle = 10;
	
	/**
	 * 最大连接数
	 */
	private Integer maxTotal = 100;
	
	/**
	 * 连接池
	 */
	private JedisPool jedisPool;
	
	/**
	 * 连接池配置,具体参数:
	 * blockWhenExhausted = true;//连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
	 * evictionPolicyClassName = "org.apache.commons.pool2.impl.DefaultEvictionPolicy";//设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
	 * jmxEnabled = true;// 是否启用pool的jmx管理功能, 默认true
	 * jmxNamePrefix = "pool";
	 * lifo = true; //是否启用后进先出, 默认true
	 * minIdle = 5;//最小空闲连接数, 默认0
	 * maxIdle = 10;/最大空闲连接数, 默认8个
	 * maxTotal = 100;//最大连接数, 默认8个
	 * maxWaitMillis = 3000L;//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,默认-1
	 * testOnBorrow = true;//在获取连接的时候检查有效性, 默认false
	 * testOnReturn = true;//返回一个jedis实例给连接池时,是否检查连接可用性
	 * testWhileIdle = true;//在空闲时检查有效性, 默认false
	 * minEvictableIdleTimeMillis = 1800000L;//逐出连接的最小空闲毫秒,默认1800000毫秒(30分钟)
	 * softMinEvictableIdleTimeMillis = 1800000L;//对象空闲多久后逐出, 当空闲时间>该值 ,且空闲连接>最大空闲数时直接逐出,不再根据MinEvictableIdleTimeMillis判断 (默认逐出策略),默认30m
	 * timeBetweenEvictionRunsMillis = 60000L;//逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
	 * numTestsPerEvictionRun = 5;//每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
	 */
	private JedisPoolConfig jedisPoolConfig;
	
	/**
	*初始化启动,创建连接池
	*可以设置密码,防止外部操作
	*/
	@PostConstruct
	public void init(){
		jedisPoolConfig = new JedisPoolConfig();
		jedisPoolConfig.setMinIdle(minIdle);
		jedisPoolConfig.setMaxIdle(maxIdle);
		jedisPoolConfig.setMaxTotal(maxTotal);
		if( password != null && !"".equals( password.trim() ) ){
			jedisPool = new JedisPool( jedisPoolConfig, this.host, this.port, Protocol.DEFAULT_TIMEOUT, this.password );
		}else{
			jedisPool = new JedisPool( jedisPoolConfig, this.host, this.port, Protocol.DEFAULT_TIMEOUT );
		}
	}
	
	@PreDestroy销毁
	public void destroy(){
		jedisPool.destroy();
	}
	
	private Jedis getJedis(){
		Jedis jedis = jedisPool.getResource();
		return jedis;
	}
	
	/**
	 * 验证key是否为空
	 */
	private void checkKeyNotBlank( String key ){
		if( key == null || "".equals( key ) ){
			throw new RuntimeException( "key is blank" );
		}
	}
	
	/**
	 * set设置缓存
	 */
	public void set( String keyPrefix, String key, Object value ){
		this.checkKeyNotBlank( key );
		this.getJedis().set( ObjectUtil.toBytes( keyPrefix + key ), ObjectUtil.toBytes( value ) );
	}
	
	/**
	 * set设置缓存
	 */
	public void set( String key, Object value ){
		this.set( defaultKeyPrefix, key, value );
	}
	
	/**
	 * setNoPrefixToString
	 */
	public void setNoPrefixToString(String key, String flag, String value ){
		this.checkKeyNotBlank( key );
		Logger.info("向缓存中添加标志位"+flag+"的缓存,其中KEY 是"+key+"_"+flag+"VALUE 是"+value);
		this.getJedis().set(key+"_"+flag, value);
	}
	
	
	/**
	 * setex可以设置超时时间
	 */
	public void setex( String keyPrefix, Integer timeOut, String key, Object value ){
		this.checkKeyNotBlank( key );
		this.getJedis().setex( ObjectUtil.toBytes( keyPrefix + key ), timeOut, ObjectUtil.toBytes( value ) );
	}
	
	/**
	 * setex可以设置超时时间
	 */
	public void setex( String key, Integer timeOut, Object value ){
		if(defaultKeyPrefix != null && !"".equals(defaultKeyPrefix)){
			this.setex( defaultKeyPrefix, timeOut, key, value );
		}else{
			this.setexObject(key, timeOut,  value);
		}
	}
	
	/**
	 * setexObject可以设置超时时间
	 */
	public void setexObject( String key, Integer timeOut, Object value ){
		this.checkKeyNotBlank( key );
		String jsonString = JsonUtil.toJson(value);
		this.getJedis().setex(key, timeOut, jsonString);
	}
	
	/**
	 * get单个获取
	 */
	public <T> T get( String keyPrefix, String key, Class<T> clazz ){
		this.checkKeyNotBlank( key );
		
		Jedis redis = this.getJedis();
		byte[] bs = redis.get( ObjectUtil.toBytes( keyPrefix + key ) );
		if( bs == null || bs.length == 0 ){
			return null;
		}else{
			T value = ObjectUtil.toObject( bs, clazz );
			return value;			
		}
	}
	
	/**
	 * get单个获取
	 */
	public <T> T get( String key, Class<T> clazz ){
		return this.get( defaultKeyPrefix, key, clazz);
	}
	
	/**
	 * get单个获取
	 */
	public String getNoPrefixToString( String key ){
		checkKeyNotBlank(key);
		return this.getJedis().get(key);
	}
	
	/**
	 * 获取所有的key
	 * position 0为前包含,1位后包含, 2为所有*
	 * containStr 包含字符串
	 */
	public Map<String, Object> getAllKey(Integer position, String containStr){
		Map<String, Object> map = new HashMap<String, Object>();
		String sourceStr = "*";
		try{   
			if(position == 0){
				sourceStr = containStr + sourceStr;
			}else if(position == 1){
				sourceStr = sourceStr + containStr;
			}
			Jedis redis = this.getJedis();
			Set<String> set = (Set<String>)redis.keys(sourceStr);
			if(!set.isEmpty()){
				for(String i : set){
					String value=this.getNoPrefixToString(i);
					map.put(i, value);
					Logger.info("后缀为"+containStr+"中的KEY 是"+i+", VALUE 是:"+value);
				}
			}else{
				if(position==1){
					Logger.info("后标志位为:"+containStr+"在缓存中没有数据");
				}else{
					Logger.info("前标志位为:"+containStr+"在缓存中没有数据");
				}
				
			}
			
		}catch(Exception e){
			Logger.error("匹配key为" + containStr + "异常", e);
		}
		return map;
	}
	
	/**
	 * del删除
	 */
	public void del( String keyPrefix, String key ){
		Jedis redis = this.getJedis();
		redis.del(key);
	}
	
	/**
	 * del删除
	 */
	public void del( String key ){
		Jedis redis = this.getJedis();
		redis.del(key);
	}

	public void setHost(String host) {
		this.host = host;
	}

	public void setPort(Integer port) {
		this.port = port;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public void setMinIdle(Integer minIdle) {
		this.minIdle = minIdle;
	}

	public void setMaxIdle(Integer maxIdle) {
		this.maxIdle = maxIdle;
	}

	public void setMaxTotal(Integer maxTotal) {
		this.maxTotal = maxTotal;
	}

	public void setDefaultKeyPrefix(String defaultKeyPrefix) {
		this.defaultKeyPrefix = defaultKeyPrefix;
	}


本文出自 “my dream fly on the sky” 博客,请务必保留此出处http://7915791.blog.51cto.com/7905791/1865961

以上是关于redis缓存的主要内容,如果未能解决你的问题,请参考以下文章

Android获取各个应用程序的缓存文件代码小片段(使用AIDL)

怎样使用redis缓存,java代码

Redis缓存击穿,缓存穿透,缓存雪崩解决方案(附代码)

Redis缓存击穿,缓存穿透,缓存雪崩解决方案(附代码)

企业项目开发--分布式缓存Redis

Redis 学习 —— 数据类型及操作