java-redis字符类数据操作示例(一)

 对于大部分程序猿来讲,学习新知识重在编码实践,于我也是这样。现在初识redis,一直看文章难免感觉是浮光掠影,印象不深。所以间隙中,将自己的测试代码整理成博客,旨在加深记忆并提醒自己对待编程要用心沉下去,起码得要搞清楚各api的正确用法。本次示例主要是对redis string类型的api进行测试,为测试代码创建了一个数据库连接管理类,统一处理连接的创建与关闭。创建一个功能函数式接口,用于数据库连接操作执行 测试方法体。发现了一个没用过的字符串格式化工具MessageFormat,是一个意外的小收获(见笑☺,java新手有点low)。接下来,贴上示例代码。若有问题,欢迎斧正。

一、功能函数式接口ThrowFunction

  参考博文:http://blog.csdn.net/yangjiachang1203/article/details/52619795

@FunctionalInterface
public interface ThrowFunction<T extends ShardedJedis> {
    void run(T conn) throws Exception;
}

二、创建Redis连接管理类RedisUtil

public class RedisUtil {
    /**
     * 工具实例
     */
    public static RedisUtil instance = new RedisUtil();
    private static JedisPool jedisPool;// 非切片连接池
    private static ShardedJedisPool shardedJedisPool;// 切片连接池
    static {
        initialPool();
        initialShardedPool();
    }

    /**
     * 初始化非切片池
     */
    private static void initialPool() {
        // 池基本配置
        jedisPool = new JedisPool(getConfig(), "127.0.0.1", 6379);
    }

    /**
     * 初始化切片池
     */
    private static void initialShardedPool() {
        // slave链接
        List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
        shards.add(new JedisShardInfo("127.0.0.1", 6379, "master"));
        //远程连接
        shards.add(new JedisShardInfo("192.168.0.122", 6379, "news"));
        // 构造池
        shardedJedisPool = new ShardedJedisPool(getConfig(), shards);
    }
    /**
     * 获取基础配置
     * @return
     */
    private static JedisPoolConfig getConfig(){
        // 池基本配置
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(20);
        config.setMaxIdle(5);
        config.setMaxWaitMillis(20*1000L);
        config.setTestOnBorrow(false);
        return config;
    }
    private RedisUtil(){}
    /**
     * 获取一个新的分布式缓存连接
     * @return
     */
    public ShardedJedis getConn(){
        return shardedJedisPool.getResource();
    }
    /**
     * 执行方法
     * @param func
     */
    public void run(ThrowFunction<ShardedJedis> func){
        ShardedJedis conn = shardedJedisPool.getResource();
        try {
            func.run(conn);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        conn.close();
    }
}

三、字符串缓存测试类

  字符串类型的缓存,可以存数字或字符。存数字时可以调用incr,decr,incrBy,decrBy,incrByFloat这些api对数字进行修改,redis内部是自动进行类型转换。存字符串时可以调用append方法对原值进行追加。

public class StringTest {
    /**
     * 主测试方案
     */
    @Test
    public void test() {
        RedisUtil.instance.run(conn -> stringOper(conn));
        Assert.assertTrue(true);
    }
    /**
     * 测试用的key
     */
    private final String _key = "user-simm";
    /**
     * 字符串操作
     * 
     * @param conn
     */
    private void stringOper(ShardedJedis conn) {
        //存一个数值 100
        conn.set(_key,"100");
        print(conn);
        //逐一递增:100+1
        conn.incr(_key);
        print(conn);
        //逐一递减:100+1-1
        conn.decr(_key);
        print(conn);
        //指定增加值:100+1-1+100
        conn.incrBy(_key,100);
        print(conn);
        //指定减少值:100+1-1+100-100
        conn.decrBy(_key,100);
        print(conn);
        //加一个正浮点数:100+1-1+100-100+5.5
        conn.incrByFloat(_key,5.5);
        print(conn);
        //加一个负浮点数:100+1-1+100-100+5.5-5.5
        conn.incrByFloat(_key,-5.5);
        print(conn);
        //存一个字符串
        conn.set(_key,"abc");
        print(conn);
        //扩展字符串
        conn.append(_key,"+def");
        print(conn);
    }
    private void print(ShardedJedis conn){
        System.out.println(MessageFormat.format("{0}:{1}", _key,conn.get(_key)));
    }
}

四、结果输出

  

posted @ 2018-02-26 17:11  Mr.Simm  阅读(921)  评论(0编辑  收藏  举报