redis中键的生存时间(expire)

1、redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它 
expire 设置生存时间(单位/秒) 

pexpire 设置生存时间(单位/毫秒) 

ttl/pttl 查看键的剩余生存时间 

persist 取消生存时间 

expireat [key] unix时间戳1351858600 
pexpireat [key] unix时间戳(毫秒)1351858700000

2、应用场景 
限时的优惠活动 
网站数据缓存(对于一些需要定时更新的数据) 
限制网站访客访问频率(例如:1分钟最多访问10次)

package cn.crxy.redis;

import static org.junit.Assert.*;

import java.util.List;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Transaction;

public class RedisTest {
    
    String ip = "192.168.1.170";
    int port = 6379;
    Jedis jedis = new Jedis(ip, port);
    /**
     * 仅供测试使用,单机无连接池方式
     * @throws Exception
     */
    @Test
    public void test1() throws Exception {
        //获取到redis服务器的链接
        jedis.set("crxy", "wwww");
        String value = jedis.get("crxy");
        System.out.println(value);
    }
    
    /**
     * 单机连接池方式
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
        
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //指定连接池中最大空闲连接数
        jedisPoolConfig.setMaxIdle(10);
        //链接池中创建的最大连接数
        jedisPoolConfig.setMaxTotal(100);
        //设置创建链接的超时时间
        jedisPoolConfig.setMaxWaitMillis(2000);
        //表示连接池在创建链接的时候会先测试一下链接是否可用,这样可以保证连接池中的链接都可用的。
        jedisPoolConfig.setTestOnBorrow(true);
        
        //创建一个jedis连接池
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, ip, port);
        //从连接池中获取一个链接
        Jedis jedis = jedisPool.getResource();
        String value = jedis.get("crxy");
        System.out.println(value);
        
        //把连接返回给连接池
        jedisPool.returnResource(jedis);
    }
    
    
    /**
     * 限制网站访客的访问频率
     * 一分钟之内最多访问10次
     */
    @Test
    public void test3() throws Exception {
        String ip = "192.168.1.110";
        for(int i=1;i<20;i++){
            boolean flag = testLogin(ip);
            if(flag){
                System.out.println("正常访问"+i);
            }else{
                System.out.println("访问频繁,禁止访问");
            }
        }
        
        
    }
    
    
    //根据用户的ip校验用户是否可以继续访问
    private boolean testLogin(String ip) {
        String value = jedis.get(ip);
        if(value==null){
            jedis.incr(ip);
            //设置ip的生存时间
            jedis.expire(ip, 60);
        }else{
            int parseInt = Integer.parseInt(value);
            if(parseInt>=10){
                return false;
            }
            jedis.incr(ip);
        }
        return true;
    }

}

 

posted @ 2017-03-02 22:30  亲爱的不二999  阅读(18171)  评论(0编辑  收藏  举报