zoukankan      html  css  js  c++  java
  • jedis操作redis(一)

    redis是一个常用的内存Nosql数据库,为什么要用nosql,为什么要用redis不用memcache这些很多博客以及讲得很清楚了。
    下面介绍redis的5大基本数据类型的常用操作:
    STRING(也可以是字符串、浮点数、整数) 对整个字符串或者字符串的其中的一部分执行操作,对整数或者浮点数进行自增或者自减
    LIST(有序) 链表
    SET(无序) 集合
    HASH(无序) 散列表 类似于java中的HashMap
    ZSET(有序集合) 字符串成员 和 浮点数分值的有序映射
    下面是使用java版本的redis的客户端jedis对redis进行操作的相关的api的测试:
    maven依赖如下:

            <dependencies>
    		<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    		<dependency>
    			<groupId>redis.clients</groupId>
    			<artifactId>jedis</artifactId>
    			<version>2.9.0</version>
    		</dependency>
    		<!-- https://mvnrepository.com/artifact/junit/junit -->
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>4.12</version>
    		</dependency>
    	</dependencies>
    
      public class JedisApiTest {
    	private Jedis jedis;
    	@Rule
    	public ExpectedException expectedEx = ExpectedException.none();
    
    	@Before
    	public void before() {
    		jedis = new Jedis("127.0.0.1", 6379);
    	}
    
    	@Test
    	public void test() {
    		// redis 中 String数据类型的常用的操作相关测试
    		// 首先先清空所有的键值对
    		// jedis.flushAll();
    		// 清除所有测试要用到的 key
    		jedis.del("hello", "name", "age", "ages");
    		// 设置 key - value
    		Assert.assertEquals("OK", jedis.set("hello", "world"));
    		// 获取 key - value
    		Assert.assertEquals("world", jedis.get("hello"));
    		// append value
    		jedis.append("hello", "!");
    		Assert.assertEquals("world!", jedis.get("hello"));
    		// 删除value
    		Assert.assertEquals(Long.valueOf(1l), jedis.del("hello"));
    		// 删除不存在的可以
    		Assert.assertEquals(Long.valueOf(0l), jedis.del("hello"));
    		// 获取不存在的 key
    		Assert.assertEquals(null, jedis.get("hello"));
    		// 同时设置多个值
    		Assert.assertEquals("OK", jedis.mset("name", "liuling", "age", "23", "qq", "476777XXX"));
    		// incr增加一个值 返回结果是增加后的值
    		Assert.assertEquals(Long.valueOf(24l), jedis.incr("age"));
    		// 增加一个不存在的值 会set这个值并且值为一
    		Assert.assertEquals(Long.valueOf(1l), jedis.incr("ages"));
    		// 增加一个不是数值的 值
    		expectedEx.expect(JedisDataException.class);// Exception.class其实也是可以的
    		expectedEx.expectMessage("ERR value");// 错误信息中的一部分就可以了
    		jedis.incr("name");
    	}
    
    	@Test
    	public void test2() {
    		// 关于 List 数据类型的操作
    		// 先清除测试要用到 键值
    		jedis.del("list");
    		// 多个值推入返回的是推入的值的 数目 4
    		Assert.assertEquals(Long.valueOf(4L), jedis.rpush("list", "item1", "item2", "item1", "item3"));
    		// 展示list全部的值
    		List<String> list = jedis.lrange("list", 0, -1);
    		Assert.assertEquals(4, list.size());
    		// 测试取超出范围的值 左右超出范围无论 如何写只要左边比右边小都是整个list列表
    		Assert.assertEquals(4, jedis.lrange("list", -200, 1000).size());
    		// 右边没有超过范围
    		Assert.assertEquals(3, jedis.lrange("list", -200, 2).size());
    		// 左边超过范围
    		Assert.assertEquals(2, jedis.lrange("list", 2, 1000).size());
    		// 左右没有超过范围只是 左边比右边大
    		Assert.assertEquals(0, jedis.lrange("list", 2, 1).size());
    		// 其他的都不用测试了 只要左边比右边大 返回的list都是空的 []
    		// pop返回的都是pop的值
    		Assert.assertEquals("item1", jedis.lpop("list"));
    		for (int i = 0; i < 3; i++) {
    			jedis.lpop("list");
    		}
    		// pop 一个空的list查看返回什么 返回null
    		Assert.assertEquals(null, jedis.lpop("list"));
    	}
    
    	@Test
    	public void test3() {
    		// 清除 测试的 key
    		jedis.del("set");
    		// 返回值是进入成功的的值的数目 重复的值进入不成功
    		Assert.assertEquals(Long.valueOf(2), jedis.sadd("set", "set1", "set2", "set1"));
    		// 获取set里面所有的值
    		Set<String> set = jedis.smembers("set");
    		Assert.assertEquals(2, set.size());
    		// 判断值是否在set中
    		Assert.assertTrue(jedis.sismember("set", "set1"));
    		Assert.assertFalse(jedis.sismember("set", "set3"));
    		// 返回删除成功的 key的数量的值
    		Assert.assertEquals(Long.valueOf(2l), jedis.srem("set", "set1", "set2"));
    		// 返回删除成功的 key的值 因为 都不存在所有返回值是0l
    		Assert.assertEquals(Long.valueOf(0l), jedis.srem("set", "set1", "set2"));
    	}
    
    	@Test
    	public void test4() {
    		// 哈希 测试
    		// 首先先删除测试的key
    		jedis.del("map");
    		Assert.assertEquals(Long.valueOf(1l), jedis.hset("map", "k1", "v1"));// 设置一个值
    		HashMap<String, String> map = new HashMap<String, String>();
    		map.put("k1", "v2");
    		map.put("k2", "v2");
    		Assert.assertEquals("OK", jedis.hmset("map", map));
    		Assert.assertEquals("v2", jedis.hget("map", "k1"));// 会被覆盖
    		Assert.assertEquals(null, jedis.hget("map", "k3"));// 获取不存在的key
    		Assert.assertEquals("[v2, null]", jedis.hmget("map", "k1", "k3").toString());// 这个只想说明获取
    																						// 获取hash中不存在的值会返回null
    		Assert.assertEquals(2, jedis.hgetAll("map").size());
    		// -----------------------------------------
    		Assert.assertEquals(Long.valueOf(0l), jedis.hset("map", "k1", "v3"));
    		Assert.assertEquals("v3", jedis.hget("map", "k1"));// 会被覆盖
    		// 这两个表示 hset一个存在的值 会返回0但是值确实会被覆盖
    		// -----------------------------------------
    		Assert.assertEquals(Long.valueOf(1l), jedis.hdel("map", "k1"));
    		// hdel也可以批量删除 返回删除成功的key的数量
    		Assert.assertEquals(Long.valueOf(0l), jedis.hdel("map", "k1"));
    	}
    
    	@Test
    	public void test5() {
    		// 最后一种数据类型zSet有序集合
    		// 首先清楚要测试的key
    		jedis.del("zset");
    		Assert.assertEquals(Long.valueOf(1l), jedis.zadd("zset", 1.1, "k1"));
    		Assert.assertEquals(Long.valueOf(0l), jedis.zadd("zset", 4.4, "k1"));// 设置一样的值是0
    		Assert.assertEquals(Long.valueOf(1l), jedis.zadd("zset", 3.3, "k3"));//
    		// output:[k3,k1] 值被覆盖了
    		System.out.println(jedis.zrangeByScore("zset", 0, 5));
    		// [[[107,51],3.3],[[107, 49],4.4]]f
    		System.out.println(jedis.zrangeByScoreWithScores("zset", 0, 10));
    		Set<Tuple> setWithTuple = jedis.zrangeByScoreWithScores("zset", 0, 10);
    		for (Tuple t : setWithTuple) {
    			System.out.println(t.getElement() + "--" + t.getScore());
    		}
    		// output:
    		// k3--3.3
    		// k1--4.4
    	}
            }
    
  • 相关阅读:
    es字符串字段类型的私有属性 建立索引的分析器 用于查询的分析器 短语查询优化
    限制索引、字段的自动创建 无模式与自定义 索引结构映射 切面搜索
    Lucene索引数计算
    API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd API 网关出现的原因
    git 中 A C D M R T U X 分别解释
    通过 ulimit 改善系统性能
    机器重启 查看crontab执行历史记录crontab没有执行
    烂代码 git blame
    es 中 for in for of
    发散阶段 收集阶段 标识符 得分 副本角色
  • 原文地址:https://www.cnblogs.com/joeCqupt/p/6801445.html
Copyright © 2011-2022 走看看