对于大部分程序猿来讲,学习新知识重在编码实践,于我也是这样。现在初识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))); } }
四、结果输出