zoukankan      html  css  js  c++  java
  • Redis——基础使用

    Redis总体介绍:

      Redis特性

      •   Redis(REmote DIctionary Server),是一个开源的内存数据库
      •   持久化:RDB、AOF
      •   主备复制
      •   丰富的数据结构
      •   Lua脚本、事务

      Redis常见数据类型

      •   String
      •   List
      •   Hash
      •   Set
      •   Zset
      •   Bitmap、HyperLogLog、GEO

      Redis应用场景

      • 排行榜,zest
      • 计数,String
      • 好友关系, Hash
      • Recerse cache(反向cache),string
      • Top 10, list
      • Fast transcation with lua
      • 用户访问记录,list
      • 抢红包,List、lua、string

    Redis数据结构解析

      1、String

        Redis的String是基于C string的封装,在头部存储了长度信息,以便于支持动态扩展,其源码如下所示:

    struct sdshdr {
        int len; //len表示buf中存储的字符串的长度。
        int free; //free表示buf中空闲空间的长度。
        char buf[]; //buf用于存储字符串内容。
    };

        为了节省内存,当一个字符串符合整数格式的时候mredis会将转换成64位有符号整数

        String结构是简单的key-value类型,value不仅是String,也可以是数字

        常用命令:

            set——设置key对应的值为String类型的value

            get——获取key对应的值

            mget——批量获取多个key的值,如果可以不存在则返回null

            incr && incrby——incr对key对应的值进行加加操作,并返回新的值;incrby加指定值

            decr && decrby——decr对key对应的值进行减减操作,并返回新的值;decrby减指定值

        static void testString(Jedis jedis){
            jedis.set("name","xinxin");//向key-->name中放入了value-->xinxin
    
            System.out.println("set:" + jedis.get("name"));//执行结果:xinxin
    
            jedis.append("name", " is my lover"); //拼接
            System.out.println("append:" + jedis.get("name"));
    
            jedis.del("name");  //删除某个键
            System.out.println("del:" + jedis.get("name"));
    
            //设置多个键值对
            jedis.mset("name","liuling","age","23","qq","476777XXX");
            System.out.println("mget:" + jedis.mget("name","age","qq","ss"));
    
            jedis.incr("age"); //进行加1操作
            System.out.println("incr " + jedis.get("age"));
            jedis.incrBy("age",2);//进行加任意数操作
            System.out.println("incrBy:" + jedis.get("age"));
            jedis.decr("age");//进行减1操作
            System.out.println("decr:" + jedis.get("age"));
            jedis.decrBy("age", 2);//进行减任意数操作
            System.out.println("decrby:" + jedis.get("age"));
        }

    输出:

    set:xinxin
    append:xinxin is my lover
    del:null
    mget:[liuling, 23, 476777XXX, null]
    incr 24
    incrBy:26
    decr:25
    decrby:23      

      2、hash

        Hash是一个String类型的field和value之间的映射表,在redis中Hash数据类型的key(hash表名称)对应的value实际的内部存储结构为一个HashMap,因此Hash特别适合存储对象。相对于把一个对象的每个属性存储为String类型,将整个对象存储在Hash类型中会占用更少内存。

        当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

        常用命令:

          hset——设置key对应的HashMap中的field的value

          hget——获取key对应的HashMap中的field的value

          hgetall——获取key对应的HashMap中的所有field的value

        static void testHash(Jedis jedis){
            //-----添加数据----------
            Map<String, String> map = new HashMap<String, String>();
            map.put("name", "xinxin");
            map.put("age", "22");
            map.put("qq", "123456");
            jedis.hmset("user",map);
    //取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List //第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数 List<String> rsmap = jedis.hmget("user", "name", "age", "qq"); System.out.println(rsmap); //删除map中的某个键值 jedis.hdel("user","age"); System.out.println(jedis.hmget("user", "age")); //因为删除了,所以返回的是null System.out.println(jedis.hlen("user")); //返回key为user的键中存放的值的个数2 System.out.println(jedis.exists("user"));//是否存在key为user的记录 返回true System.out.println(jedis.hkeys("user"));//返回map对象中的所有key System.out.println(jedis.hvals("user"));//返回map对象中的所有value System.out.println(jedis.hgetAll("user"));//返回map对象中的所有key=value Iterator<String> iter=jedis.hkeys("user").iterator(); while (iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+jedis.hmget("user",key)); } }

    输出:

    [xinxin, 22, 123456]
    [null]
    2
    true
    [qq, name]
    [123456, xinxin]
    {qq=123456, name=xinxin}
    qq:[123456]
    name:[xinxin]

      3、Set

        set代表一个集合(元素不重复),集合在redis里实现为字典

        如果set里所有都元素都是整数时,redis会以inset都形式存储,inset是一个有序都整形数组

        常用命令:

          sadd——key对应的set中添加一个元素。

          smembers——获取key对应的set的所有元素。

          spop——随机返回并删除key对应的set中的一个元素。

          sdiff——求给定key对应的set与第一个key对应的set的差集

          suion——求给定key对应的set并集

          sinter——求给定key对应的set交集

        static void testSet(Jedis jedis){
            //添加
            jedis.sadd("user2","liuling");
            jedis.sadd("user2","xinxin");
            jedis.sadd("user2","ling");
            jedis.sadd("user2","zhangxinxin");
            jedis.sadd("user2","who");
            //移除noname
            jedis.srem("user2","who");//移除集合中一个或多个成员
            System.out.println(jedis.smembers("use2r"));//获取所有加入的value
            System.out.println(jedis.scard("user2"));//返回集合的元素个数
            System.out.println(jedis.spop("user2"));//随机返回并删除key对应的set中的一个元素。
            System.out.println(jedis.scard("user2"));//返回集合的元素个数
            System.out.println(jedis.sismember("user2", "who"));//判断 who 是否是user集合的元素
            System.out.println(jedis.srandmember("user2"));//返回集合中一个或多个随机数
    
        }

      4、List

        Redis的List类型其实就是每一个元素都是String类型的双向链表。我们可以从链表的头部和尾部添加或者删除元素。这样的List既可以作为栈,也可以作为队列使用。

        常用命令:

          lpush——将一个或多个值插入到列表头部。

          lrange——获取key对应的list的指定下标范围的元素,-1表示获取所有元素。

          lpop——移出并获取列表的第一个元素

          rpush——在列表中添加一个或多个值

          rpop——移除并获取列表最后一个元素

       static  void testList(Jedis jedis){;
            //开始前,先移除所有的内容  
            jedis.del("java framework");
            System.out.println(jedis.lrange("java framework",0,-1));
            //先向key java framework中存放三条数据
            jedis.lpush("java framework","spring");
            jedis.lpush("java framework","struts");
            jedis.lpush("java framework","hibernate");
            //再取出所有数据jedis.lrange是按范围取出,
            // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有
            System.out.println(jedis.lrange("java framework",0,-1));
    
            jedis.del("java framework");
            System.out.println(jedis.lrange("java framework",0,-1));
            jedis.rpush("java framework","spring");
            jedis.rpush("java framework","struts");
            jedis.rpush("java framework","hibernate");
            System.out.println(jedis.lrange("java framework",0,-1));
        }

    输出:

    []
    [hibernate, struts, spring]
    []
    [spring, struts, hibernate]

       5、sorted set

        Redis sorted set和set一样也是string类型元素的集合,且不允许重复的成员。不一样的是每个元素都会有一个double类型的分数。redis会通过分数来为集合中的成员进行从小到大的排序。要注意的是有序集合的成员是唯一的,但分数(score)却可以重复。

        常用命令:

          zadd:向有序集合添加一个或多个成员,或者更新已存在成员的分数

          zcard: 获取有序集合的成员数

          zrange:通过索引区间返回有序集合成指定区间内的成员

        static void testsorted (Jedis jedis){
            jedis.zadd("sort",2.3,"a");
            jedis.zadd("sort",1.3,"b");
            jedis.zadd("sort",4.3,"c");
            jedis.zadd("sort",0.3,"d");
            jedis.zadd("sort",0.3,"e");
            System.out.println("zcard:" + jedis.zcard("sort"));
            System.out.println(jedis.zrange("sort",0,1));
            System.out.println(jedis.zrange("sort",0,2));
            System.out.println(jedis.zrange("sort",0,3));
            System.out.println(jedis.zrange("sort",0,4));
        }

    输出:

    [d, e]
    [d, e, b]
    [d, e, b, a]
    [d, e, b, a, c]

    更多命令可参考http://www.redis.net.cn/order/

  • 相关阅读:
    造轮子 | 怎样设计一个面向协议的 iOS 网络请求库
    win7 激活码 秘钥
    python-pptx
    pycharm
    itop 环境
    Ubuntu上安装MongoDB(译)
    python之fabric(二):执行模式(转)
    python之fabric(一):环境env
    Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
    vagrant系列教程(四):vagrant搭建redis与redis的监控程序redis-stat(转)
  • 原文地址:https://www.cnblogs.com/xxbbtt/p/7850313.html
Copyright © 2011-2022 走看看