Redis入门之redis 连接以及 对字符的操作
2015-12-17 14:48
731 查看
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 连接redis JedisShardInfo 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 */ @AfterClass public 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 */ @Test public 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 XX String status = jedis.set("test", "test234",SetParams.setParams().nx());// status 为null 则说明操作失败 System.out.println("测试SetParams.setParams().nx()给已经存在的key set值 操作状态:"+status + "操作值"+jedis.get("test")); // 输出值testtest2 status = jedis.set("test1", "test2222",SetParams.setParams().nx());//status 为ok System.out.println("测试SetParams.setParams().nx()给不存在的key set值 操作状态 操作状态:"+status + "操作值"+jedis.get("test1"));// 输出值为test2222 status = jedis.set("test1", "test342222",SetParams.setParams().xx());// status 为ok System.out.println(" 测试SetParams.setParams().xx()给已经存在的key set值 操作状态 操作状态:"+status + "操作值"+jedis.get("test1"));// 输出值为 test342222 status = jedis.set("test21", "test34212222",SetParams.setParams().xx());// status 为null System.out.println("测试SetParams.setParams().xx()给不存在的key set值 操作状态 操作状态 操作状态:"+status + "操作值"+jedis.get("test21"));// 输出值为null // 验证 EX|PX status = jedis.set("testEX", "testEX",SetParams.setParams().ex(1)); System.out.println("测试 ex 操作状态:"+status+"操作值:"+jedis.get("testEX"));// 输出 testEX Thread.sleep(1002); System.out.println("测试ex 1 秒后自动销毁,输出null 操作状态:"+status+"操作值:"+jedis.get("testEX"));// 1 秒后自动销毁,输出null status = jedis.set("testPX", "testEX",SetParams.setParams().px(100)); System.out.println("测试 px 操作状态:"+status+"操作值:"+jedis.get("testPX"));// 输出 testEX Thread.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);// } }
相关文章推荐
- redis cluster 添加 删除 重分配 节点
- Redis入门之Redis 安装超详细文档
- redis sentinel 主从切换(failover)解决方案,详细配置
- Reid主从复制简介
- keepalived实现redis双主备份
- Redis监控软件Redis-stat
- Redis的常用命令及高级应用
- redis主从
- redis集群
- redis持久化
- redis事务及锁应用
- redis(10)、redis集群twemproxy
- redis基本命令及应用场景
- redis主从配置及主从切换
- redis配置文件详解
- Redis密码管理
- Redis消息订阅
- Redis的三种启动方式
- Redis未授权访问漏洞
- Redis系列二:Redis支持的数据类型和使用方法(二)