标签: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
原文地址:http://7915791.blog.51cto.com/7905791/1865961