Redis入门之redis 连接以及 对字符的操作

来源:互联网 发布:linux 没有nslookup 编辑:程序博客网 时间:2024/04/30 16:02
package redis.clients.jedis.tests;import java.text.ParseException;import java.util.Iterator;import java.util.List;import java.util.Set;import org.junit.AfterClass;import org.junit.BeforeClass;import org.junit.Test;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.Jedis;import redis.clients.jedis.Protocol;import redis.clients.jedis.ScanParams;import redis.clients.jedis.ScanResult;import redis.clients.jedis.params.set.SetParams;public class JedisAllMethodTest {static Jedis jedis = null;static HostAndPort hnp = new HostAndPort("10.0.50.11", Protocol.DEFAULT_PORT);/** * 初始化连接 * @author jackson * @date 2015-12-16 上午8:54:01 * @throws Exception * @return void */@BeforeClass  // junit 提供的@BeforeClass标签,    beforeClass 标签只执行一次  public static void setUp() throws Exception {   //连接jedis 的第一种方式jedis = new Jedis(hnp.getHost(), hnp.getPort(), 500);    jedis.connect();    jedis.auth("foobared");// redis auth 命令 验证 redis 密码,需要在redis.conf配置文件中,开启  requirepass foobared 参数,    jedis.configSet("timeout", "300");// redis config 命令    jedis.flushAll();// redis flushall 命令 清空所有key 及清空所有数据    //连接jedis的第二种方式    /* 使用 uri 连接数据库     jedis = new Jedis(new URI("redis://:foobared@10.0.50.11:6379/4"), 15000,15000);// 4 表示连接的是 第5个数据库 url,超时时间,输入流超时时间    jedis.connect();    jedis.flushAll();// redis flushall 命令 清空所有key 及清空所有数据      */        // 连接jedis的第三种方式    /*使用 jedisShardInfo 连接redisJedisShardInfo jedisShardInfo = new JedisShardInfo("redis://:foobared@10.0.50.11:6379/1");// /1 表示连接的是 第二个数据库 ;foobared 数据库的密码jedisShardInfo.setConnectionTimeout(150000);jedisShardInfo.setSoTimeout(150000);jedis = new Jedis(jedisShardInfo);    jedis.connect();    jedis.flushAll();// redis flushall 命令 清空所有key 及清空所有数据    */      }/** * 关闭连接 * @author jackson * @date 2015-12-16 上午8:54:34 * @return void */@AfterClasspublic static void tearDown() { // 当标签为 AfterClass BeforeClass 时方法 必须为static  为 before  after 时不需要    jedis.disconnect();// 最终调用的是  Connection 中的  disconnect  作用是关闭流,关闭socket }/** *   redis 中  对 字符串 和key的操作的演示 * @author jackson * @date 2015-12-17 下午1:15:10 * @throws InterruptedException * @throws ParseException * @return void *//** * @author jackson * @date 2015-12-17 下午1:48:00 * @throws InterruptedException * @throws ParseException * @return void */@Testpublic void jedisStringKeyTest() throws InterruptedException, ParseException{System.out.println("===测试jedis BEGIN==="); // sotimeOut设置socket调用InputStream读数据的超时时间jedis.set("test", "test"); System.out.println(jedis.get("test"));jedis.append("test", "test2");// 最终是将 字符串转换为字节数组通过流的形式写入System.out.println(jedis.get("test"));/* * NX|XX, NX --有此参数时只能 set 不存在的key,如果给已经存在的key set 值则不生效, XX -- 此参数只能设置已经存在的key 的值,不存在的不生效 * EX|PX, key 的存在时间: EX = seconds; PX = milliseconds * */// 验证  NX XXString status = jedis.set("test", "test234",SetParams.setParams().nx());// status 为null 则说明操作失败System.out.println("测试SetParams.setParams().nx()给已经存在的key set值  操作状态:"+status + "操作值"+jedis.get("test")); // 输出值testtest2status = jedis.set("test1", "test2222",SetParams.setParams().nx());//status 为okSystem.out.println("测试SetParams.setParams().nx()给不存在的key set值  操作状态 操作状态:"+status + "操作值"+jedis.get("test1"));// 输出值为test2222status = jedis.set("test1", "test342222",SetParams.setParams().xx());// status 为okSystem.out.println(" 测试SetParams.setParams().xx()给已经存在的key set值  操作状态 操作状态:"+status + "操作值"+jedis.get("test1"));// 输出值为 test342222status = jedis.set("test21", "test34212222",SetParams.setParams().xx());// status 为null System.out.println("测试SetParams.setParams().xx()给不存在的key set值  操作状态 操作状态 操作状态:"+status + "操作值"+jedis.get("test21"));// 输出值为null// 验证 EX|PXstatus = jedis.set("testEX", "testEX",SetParams.setParams().ex(1));System.out.println("测试 ex  操作状态:"+status+"操作值:"+jedis.get("testEX"));// 输出 testEXThread.sleep(1002);System.out.println("测试ex 1 秒后自动销毁,输出null 操作状态:"+status+"操作值:"+jedis.get("testEX"));// 1 秒后自动销毁,输出nullstatus = jedis.set("testPX", "testEX",SetParams.setParams().px(100));System.out.println("测试 px  操作状态:"+status+"操作值:"+jedis.get("testPX"));// 输出 testEXThread.sleep(101);System.out.println("测试px 1 秒后自动销毁 操作状态:"+status+"操作值:"+jedis.get("testPX"));// 1 秒后自动销毁,输出null // Note: 因为SET 命令可以通过参数来实现和SETNX 、SETEX 和PSETEX 三个命令的效果,所以将来的Redis 版本可能会废弃并最终移除SETNX 、SETEX 和PSETEX 这三个命令//setNx 将key 的值设为value ,当且仅当key 不存在。若给定的key 已经存在,则SETNX 不做任何动作。 SETNX 是『SET if Not eXists』(如果不存在,则SET) 的简写 // 类似于 set(key,value,nx)   // 当key 不存在时 long   n = jedis.setnx("key6", "value6"); System.out.println(n!=0?"set 成功"+jedis.get("key6"):"set 失败"); // set 成功返回 1  set失败返回 0  // 当key 存在时 n = jedis.setnx("key6", "value6"); System.out.println(n!=0?"set 成功"+jedis.get("key6")+n:"set 失败"+jedis.get("key6")+n);  // setex 类似于 执行 set(key,value) 在执行   EXPIRE  类似于  set(key,value,ex)  设置生存时间是 秒级的status =  jedis.setex("key7", 1, "value7"); System.out.println(status+jedis.get("key7")); Thread.sleep(1000); System.out.println(jedis.get("key7")); jedis.psetex("key20", 10, "value20");// 设置毫秒级的生存时间,类似于  set(key,value,px)// exists  检查给定key(多个 key值) 是否存在。 返回值: 若 所有key都不存在,返回0 ,若存在 则返回 存在key的数量 System.out.println("===测试 exists 命令: ====");  n = jedis.exists("test1 test test2".split(" ")); //  int count = "test1 test test2".split(" ").length - (int) n; System.out.println( n != 0 ? "key 存在 个数为:"+n+" 不存在个数为:"+count:"key 不存在"+n);  // exist 检查 单个 key 值是否存在   返回值: 如果key 值存在 返回 true ,如果不存在 在返回false boolean exists =  jedis.exists("test");// 返回true System.out.println(exists);  // del 删除给定的一个或多个key 。不存在的key 会被忽略  返回值: 返回删除key 的数量, System.out.println("===测试 del 命令:=== "); n = jedis.del("test1 test test2".split(" ")); System.out.println("删除key 的数量为"+n); System.out.println(jedis.get("test")+jedis.get("test1"));// 返回null  说明已经删除了  jedis.set("testDel", "testDel"); n = jedis.del("testDel"); System.out.println("删除key 的数量为"+n);  // type 命令 System.out.println("===测试 type 命令:=== "); String type = jedis.type("test"); // test 不存在 返回none System.out.println("存储类型为:"+type); jedis.set("testType", "testType"); type = jedis.type("testType"); // test 返回String System.out.println("存储类型为:"+type);  jedis.flushAll(); // mset 命令 批量 插入   插入所有的值,如果key值已经存在,则进行覆盖   插入成功 返回ok 总是插入成功 System.out.println("===测试 mset 命令:=== "); status = jedis.mset("fruit apple drink beer food cookies".split(" ")); System.out.println("OK".equals(status)?"批量插入成功":"批量插入失败");  // msetnx 批量插入 不存在的key ,如果有已存在的key 则返回  0  插入失败 System.out.println("===测试 msetnx 命令:=== "); n = jedis.msetnx("apple fruit beer drink cookies food fruit cookies".split(" "));// 返回 0 插入失败,插入的里面不能有 已经存在的key System.out.println(n!=0?"批量插入成功"+n:"批量插入失败 "+n);  n = jedis.msetnx("apple fruit beer drink cookies food".split(" "));// 返回 1 插入成功 System.out.println(n!=0?"批量插入成功"+n:"批量插入失败 "+n);  // keys 命令  根据正则表达式 取得相匹配的  key System.out.println("===测试 keys 命令:==== "); Set<String> keySet = jedis.keys("*"); Iterator<String> it = keySet.iterator(); String s = ""; while(it.hasNext()){ s = s+ it.next()+" "; } System.out.println("正则所匹配的key:"+s);  // randomKey 命令 从当前数据库中随机返回(不删除) 一个key 。 System.out.println("====测试 randomKey 命令:==="); int m = 0; while(m < 4){ System.out.println(jedis.randomKey()); m++; } System.out.println("====测试 rename 命令:===");// status = jedis.rename("apple", "apple");// 重命名 key 时,如果 oldKey 与 newkey 一样则返回一个错误,执行不通过 status = jedis.rename("apple", "appleRename"); System.out.println(jedis.get("fruit"));// apple status = jedis.rename("appleRename", "fruit");// 如果 newKey 已经存在则覆盖  System.out.println("OK".equals(status)?"更新key成功"+jedis.get("fruit"):"更新key失败");//fruit  System.out.println("====测试 renamenx 命令:===");//  n = jedis.renamenx("fruit", "apple");//新的key 只能是不存在的key  System.out.println(n!= 0?"更新key成功":"更新失败");// n = jedis.renamenx("fruit", "cookies");//新的key 存在 返回一个错误// System.out.println(n!= 0?"更新key成功":"更新失败");  //expire 设置生存时间 System.out.println("====测试 expire 命令:==="); n = jedis.expire("cookies", 1);// 设置生存时间 以秒 为单位 System.out.println(jedis.get("cookies")); System.out.println("休眠1秒"); Thread.sleep(1000); System.out.println(n!=0?"设置生存时间成功"+jedis.get("cookies"):"设置生存时间失败"); // 针对 cookies 进行更名操作,查看是否 还具有生存时间 jedis.flushAll(); jedis.mset("key1 value1 key2 value2 key3 value3 key4 value4 key5 value5".split(" ")); n = jedis.expire("key1", 2); jedis.rename("key1", "key6"); System.out.println(jedis.get("key6")); Thread.sleep(2000); System.out.println(jedis.get("key6"));// 输出null  说明 rename 后 key6 继承了 key1的生存时间。 jedis.del("key6");// 删除key6  del 会删除生存时间 jedis.set("key6", "value1"); System.out.println(jedis.get("key6")); Thread.sleep(2000); System.out.println(jedis.get("key6"));    jedis.flushAll(); jedis.mset("key1 value1 key2 value2 key3 value3 key4 value4 key5 value5".split(" ")); // ttl   查看剩余生存时间   expireAt EXPIREAT 的作用和EXPIRE 类似,都用于为key 设置生存时间。不同在于EXPIREAT 命令接受的时间参数是UNIX 时间戳(unix timestamp)。// jedis.expireAt("key1",20149765902363l);// n = jedis.ttl("key1");// 返回 key1上的 剩余时间// System.out.println(n);// 如果不存在 返回 -1  //move System.out.println("测试 move命令"); // key1 不存在 1 中时 将 0 中的 key1 移动到 1 中 jedis.select(1);// 切换 DB 为 1 System.out.println(jedis.exists("key1")?"key1 存在 库 1 中":"key1 不存在 库 1 中");// 查询 DB1 中是否 包含 key1 jedis.select(0);//切换 到 0 n = jedis.move("key1", 1); jedis.select(1);// 切换 DB 为 1 System.out.println(n+jedis.get("key1"));// 查询 DB1 中是否 包含 key1 // key2 不存在 1 库中时,将 1库中的key2 移动到 key1 jedis.select(1);// 切换 DB 为 1 System.out.println(jedis.exists("key2")?"key2 存在 库 1 中":"key2 不存在 库 1 中");// 查询 DB1 中是否 包含 key1 n = jedis.move("key2", 0); System.out.println(n==0?"移动失败":"移动成功");// 查询 DB1 中是否 包含 key1  // 当两个库中都存在 key1 时 jedis.select(0); jedis.set("key1", "ivalue11"); jedis.select(1);// 切换 DB 为 1 System.out.println(jedis.exists("key1")?"key1 存在 库 1 中"+jedis.get("key1"):"key1 不存在 库 1 中");// 查询 DB1 中是否 包含 key1 n = jedis.move("key1", 0); System.out.println("1 库中的 key1 value:"+jedis.get("key1")); jedis.select(0);// 切换 DB 为 1 System.out.println(n==0?"移动失败 0库中的key1:"+jedis.get("key1"):"移动成功");// 查询 DB1 中是否 包含 key1  //getset  返回 key 对应的旧值,set 新值  如果 key 在库中不存在  jedis.flushAll(); jedis.mset("key1 value1 key2 value2 key3 value3 key4 value4 key5 value5".split(" ")); jedis.select(0); String key1= jedis.getSet("key1", "value11");// 返回旧值  set 新值 System.out.println("key1 对应的旧值:"+key1 + "key1 新值:"+jedis.get("key1"));   // mget 返回所有(一个或多个) 给定key 的值。 如果给定的key 里面,有某个key 不存在或者 value 非String,,那么这个key 返回特殊值null  。因此,该命令永不失败 jedis.flushAll(); jedis.mset("key1 value1 key2 value2 key3 value3 key4 value4 key5 value5".split(" ")); List<String> list = jedis.mget("key1 key2 key3 key4 key5 key6".split(" ")); for(String value : list){ System.out.print(value+" "); } System.out.println(); //decr// n = jedis.decr("key6"); // 由于value 不是数字 所有返回错误 // key 存在的情况 jedis.set("key8", "10"); n = jedis.decr("key8");// 返回值: 执行DECR 命令之后key 的值。 所以 n = 9 System.out.println("返回值: 执行DECR 命令之后key 的值。:"+ n+"  jedis.get :"+jedis.get("key8")+"  key8 的 type :"+jedis.type("key8"));  //key 不存在的情况  先将 key 初始化为 0 在减去1 n = jedis.decr("key9");// 返回值: 执行DECR 命令之后key 的值。 所以 n = 9 System.out.println("返回值: 执行DECR 命令之后key 的值。:"+ n+"  jedis.get :"+jedis.get("key9")+"  key9 的 type: "+jedis.type("key9"));  //decrby jedis.set("key8", "10"); n = jedis.decrBy("key8",5);// 返回值: 执行decrby  在原原有的基础上减去 5  n = 5 System.out.println("返回值: 执行decrby命令之后key 的值。:"+ n+"jedis.get :"+jedis.get("key8")+"key8 的 type :"+jedis.type("key8"));  //key 不存在的情况  先将 key 初始化为 0 在减去7 n = jedis.decrBy("key10",7);// 返回值: 执行DECRBy 命令之后key 的值。 所以 n = -7 System.out.println("返回值: 执行decrby命令之后key 的值。:"+ n+"  jedis.get :"+jedis.get("key10")+"  key10 的 type: "+jedis.type("key10"));  // incr jedis.set("key8", "10"); n = jedis.incr("key8");// 返回值: 执行DECR 命令之后key 的值。 所以 n = 11 System.out.println("返回值: 执行incr 命令之后key 的值。:"+ n+"  jedis.get :"+jedis.get("key8")+"  key8 的 type :"+jedis.type("key8"));  //key 不存在的情况  先将 key 初始化为 0 在加1 n = jedis.incr("key12");//返回值: 执行incr 命令之后key 的值。 所以 n = 1 System.out.println("返回值: 执行incr 命令之后key 的值。:"+ n+"  jedis.get :"+jedis.get("key12")+"  key12 的 type: "+jedis.type("key12"));  //incrby jedis.set("key8", "10"); n = jedis.incrBy("key8",5);// 返回值: 执行decrby  在原原有的基础上加上 5  n = 15 System.out.println("返回值: 执行decrby命令之后key 的值。:"+ n+"jedis.get :"+jedis.get("key8")+"key8 的 type :"+jedis.type("key8"));  //key 不存在的情况  先将 key 初始化为 0 在加7  int 类型 n = jedis.incrBy("key13",7);// 返回值: 执行incrBy命令之后key 的值。 所以 n = 7 System.out.println("返回值: 执行incrBy命令之后key 的值。:"+ n+"  jedis.get :"+jedis.get("key13")+"  key13 的 type: "+jedis.type("key13")); // incrByFloat  输入的是 double 返回的 是double  上面的 incr  incrBy decr decrBy 都只能针对int 操作 double incrDouble = jedis.incrByFloat("key15",66666.3333);// 返回值: 执行incrBy命令之后key 的值。 所以 n = 7 System.out.println("返回值: 执行incrBy命令之后key 的值。:"+ incrDouble+"  jedis.get :"+jedis.get("key15")+"  key13 的 type: "+jedis.type("key15")); //append //key 存在的情况 n = jedis.append("key4", "Append");//返回值 是 追加字符串后的 key4 value 的changd :12 key4 的length: 12 key4 的value: value4Append System.out.println("返回值 是 追加字符串后的 key4 value 的changd :"+ n +" key4 的length: "+jedis.get("key4").length() +" key4 的value: "+jedis.get("key4")); // key 不存在的情况  单纯的 set  新值 n = jedis.append("key16", "key16Append");//返回值 是 追加字符串后的 key16 value 的changd :11 key16 的length: 11 key16 的value: key16Append System.out.println("返回值 是 追加字符串后的 key16 value 的changd :"+ n +" key16 的length: "+jedis.get("key16").length() +" key16 的value: "+jedis.get("key16")); // substr getrange 命令 目前没发现二者的区别,待以后研究 String subStr = jedis.substr("key4",0,3); System.out.println("key4 返回的子字符串为: "+subStr ); subStr = jedis.substr("key4",-2,-1); System.out.println("key4 返回的子字符串为: "+subStr ); subStr = jedis.getrange("key4",0,3);//在<= 2.0 的版本里,GETRANGE 被叫作SUBSTR System.out.println("key4 返回的子字符串为: "+subStr ); subStr = jedis.getrange("key4",-2,-1);//在<= 2.0 的版本里,GETRANGE 被叫作SUBSTR System.out.println("key4 返回的子字符串为: "+subStr ); // setrange //设置的偏移量 4 小于原字符串的长度 n = jedis.setrange("key4", 4, "333");// 从第五位开始 替换 将原有的字符串 替换为333   返回值 n 是字符串的长度 12 System.out.println("key4 的value : "+jedis.get("key4")+"  返回字符串的长度: "+n); // key4 的value : valu333ppend  返回字符串的长度: 12 // 设置的偏移量大于 原字符串的长度 n = jedis.setrange("key4", 18, "222333");// 超出偏移量的地方用空格代替 System.out.println("key4 的value : "+jedis.get("key4")+"  返回字符串的长度: "+n); //  key4 的value : valu333ppend     222333  返回字符串的长度: 24 // 当key 为空时 n = jedis.setrange("key22", 18, "222333");//  key为空时,相当于set 新值,但是set为位置是从17位开始,前面的全部用个空格代替 System.out.println("key22 的value : "+jedis.get("key22")+"  返回字符串的长度: "+n); //  key22 的value :                222333  返回字符串的长度: 24 //strlen n = jedis.strlen("key5"); System.out.println("key5 的value: "+jedis.get("key5")+"返回 key5的长度: "+n); //bitcount  getbit  setbit bitop 这四个命令是针对字符串的二进制进行操作  //• SCAN 命令用于迭代当前数据库中的数据库键。  hscan sscan zscan 在 集合 操作 list 操作中演示 ScanResult<String> scanResult =  jedis.scan("0"); // 最简单的迭代,迭代数据库中的所有key 初始游标为 0 ,返回结果是封装好了的 ScanResult对象 , 包含游标和 key 结果集 scanResult.getCursor();// 返回的游标  继续用此 游标进行遍历,直到 返回 0 说明遍历完成。 scanResult.getResult();// 返回的结果集 里面包含返回的所有的key   // scan(curso,params) cursor 表示开始遍历的游标   params 是ScanParams 对象,此对象可以设置 每次返回的数量,以及遍历时的正则表达式 ScanParams scanParams = new ScanParams(); scanParams.count(100);// 表示一次返回的数量是100个 及 ScanResult.getResult 返回的list size 为 99 scanParams.match("*");// 表示遍历所有的值  也可以 如 : *11* 搜索key 中包含11 的key 注意:需要注意的是,对元素的模式匹配工作是在命令从数据集中取出元素之后,向客户端返回元素之前的这段时间内进行的,所以如果被迭代的数据集中只有少量元素和模式相匹配,那么迭代命令或许会在多次执行中都不返回任何元素。 jedis.scan("0",scanParams);// } }

1 0
原创粉丝点击