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缓存的主要内容,如果未能解决你的问题,请参考以下文章